{"openapi":"3.1.0","info":{"title":"IncuBrix Long-Tail Distribution - Connector Service","description":"Connectors, posting-rules engine, certification harness and catalogue tools for long-tail destinations. Errors are always {\"error\": {code, message, retryable, details}}; see GET /api/v1/errors.","version":"1.0.0"},"paths":{"/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"tags":["meta"],"summary":"Ready","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/connectors":{"get":{"tags":["connectors"],"summary":"Connectors","operationId":"connectors_api_v1_connectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Connectors Api V1 Connectors Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/connectors/{connector_key}/disable":{"post":{"tags":["connectors"],"summary":"Disable Connector","description":"Kill switch: every call to this connector fails with CONNECTOR_DISABLED until re-enabled.","operationId":"disable_connector_api_v1_connectors__connector_key__disable_post","parameters":[{"name":"connector_key","in":"path","required":true,"schema":{"type":"string","title":"Connector Key"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/connectors/{connector_key}/enable":{"post":{"tags":["connectors"],"summary":"Enable Connector","operationId":"enable_connector_api_v1_connectors__connector_key__enable_post","parameters":[{"name":"connector_key","in":"path","required":true,"schema":{"type":"string","title":"Connector Key"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations":{"post":{"tags":["destinations"],"summary":"Add Destination","description":"Add one destination: this is how forum number 41 is added - configuration, not code.","operationId":"add_destination_api_v1_destinations_post","parameters":[{"name":"upsert","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Upsert"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["destinations"],"summary":"Destinations","operationId":"destinations_api_v1_destinations_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"connector_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Key"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Destinations Api V1 Destinations Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}":{"get":{"tags":["destinations"],"summary":"Destination","operationId":"destination_api_v1_destinations__dest_id__get","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Destination Api V1 Destinations  Dest Id  Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["destinations"],"summary":"Patch Destination","operationId":"patch_destination_api_v1_destinations__dest_id__patch","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Changes"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Destination Api V1 Destinations  Dest Id  Patch"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}/certify":{"post":{"tags":["certification"],"summary":"Certify","description":"Run the certification harness for one destination (background job).","operationId":"certify_api_v1_destinations__dest_id__certify_post","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CertifyRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}/certifications":{"get":{"tags":["certification"],"summary":"Certifications","operationId":"certifications_api_v1_destinations__dest_id__certifications_get","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Certifications Api V1 Destinations  Dest Id  Certifications Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/connections":{"post":{"tags":["connections"],"summary":"Add Connection","operationId":"add_connection_api_v1_connections_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["connections"],"summary":"List Connections","operationId":"list_connections_api_v1_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Connections Api V1 Connections Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications":{"post":{"tags":["publications"],"summary":"Publish","description":"Publish one rendition to one destination. Returns 202 with a job; the job result says exactly what\nhappened: published / scheduled (with time and reason) / blocked (with reasons) / failed / assist pack.","operationId":"publish_api_v1_publications_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicationRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["publications"],"summary":"Publications","operationId":"publications_api_v1_publications_get","parameters":[{"name":"destination_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publications Api V1 Publications Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications/{pub_id}":{"get":{"tags":["publications"],"summary":"Publication","operationId":"publication_api_v1_publications__pub_id__get","parameters":[{"name":"pub_id","in":"path","required":true,"schema":{"type":"string","title":"Pub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publication Api V1 Publications  Pub Id  Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications/{pub_id}/confirm":{"post":{"tags":["publications"],"summary":"Confirm","description":"For assisted destinations: a person posted it; record the live URL.","operationId":"confirm_api_v1_publications__pub_id__confirm_post","parameters":[{"name":"pub_id","in":"path","required":true,"schema":{"type":"string","title":"Pub Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications/{pub_id}/approve":{"post":{"tags":["publications"],"summary":"Approve Publication","description":"A person confirms a post held for review (status needs_review) is not promotional. Body:\n{\"approved_by\": \"name\"}. It is re-queued; every other rule still applies.","operationId":"approve_publication_api_v1_publications__pub_id__approve_post","parameters":[{"name":"pub_id","in":"path","required":true,"schema":{"type":"string","title":"Pub Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications/{pub_id}/delete":{"post":{"tags":["publications"],"summary":"Delete Publication","operationId":"delete_publication_api_v1_publications__pub_id__delete_post","parameters":[{"name":"pub_id","in":"path","required":true,"schema":{"type":"string","title":"Pub Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/validate":{"post":{"tags":["publications"],"summary":"Validate","description":"Dry run: shows the tailored post for a destination and every rule/format problem. Posts nothing (so it is\nnaturally safe to repeat; Idempotency-Key is accepted and ignored).","operationId":"validate_api_v1_validate_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Validate Api V1 Validate Post"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Job","operationId":"job_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Job Api V1 Jobs  Job Id  Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/alerts":{"get":{"tags":["alerts"],"summary":"Alerts","operationId":"alerts_api_v1_alerts_get","parameters":[{"name":"destination_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alerts Api V1 Alerts Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/errors":{"get":{"tags":["meta"],"summary":"Errors","description":"Every error code this service can return.","operationId":"errors_api_v1_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Errors Api V1 Errors Get"}}}}}}},"/connector/v1":{"get":{"tags":["connector contract"],"summary":"List Connectors","operationId":"list_connectors_connector_v1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Connectors Connector V1 Get"}}}}}}},"/connector/v1/{connector_key}/manifest":{"get":{"tags":["connector contract"],"summary":"Manifest","operationId":"manifest_connector_v1__connector_key__manifest_get","parameters":[{"name":"connector_key","in":"path","required":true,"schema":{"type":"string","title":"Connector Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Manifest Connector V1  Connector Key  Manifest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connector/v1/{connector_key}/{method}":{"post":{"tags":["connector contract"],"summary":"Call","operationId":"call_connector_v1__connector_key___method__post","parameters":[{"name":"connector_key","in":"path","required":true,"schema":{"type":"string","title":"Connector Key"}},{"name":"method","in":"path","required":true,"schema":{"type":"string","title":"Method"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Call Connector V1  Connector Key   Method  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalogue/import":{"post":{"tags":["catalogue"],"summary":"Import Catalogue","description":"Import a CSV of destinations from a URL (csv_url) or inline text (csv_text). Background job; the result\nhas a row-by-row report (imported / updated / duplicate / error / warning) and summary counts.","operationId":"import_catalogue_api_v1_catalogue_import_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/catalogue/import/upload":{"post":{"tags":["catalogue"],"summary":"Import Catalogue Upload","description":"Same as /catalogue/import, with the CSV sent as a multipart file upload.","operationId":"import_catalogue_upload_api_v1_catalogue_import_upload_post","parameters":[{"name":"check_reachability","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Check Reachability"}},{"name":"upsert","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Upsert"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_catalogue_upload_api_v1_catalogue_import_upload_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/catalogue/export.csv":{"get":{"tags":["catalogue"],"summary":"Export Catalogue","description":"The whole catalogue as CSV, in the brief's destination-record field order.","operationId":"export_catalogue_api_v1_catalogue_export_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}/rules/propose":{"post":{"tags":["rules"],"summary":"Propose Rules","description":"AI step: read the community's rules page (rules_url, or the destination's own) or pasted rules_text and\npropose posting rules with the sentence each came from. Nothing changes until a person confirms.","operationId":"propose_rules_api_v1_destinations__dest_id__rules_propose_post","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RulesCaptureRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}/rules/confirm":{"post":{"tags":["rules"],"summary":"Confirm Rules Route","description":"A person confirms (optionally editing) the proposed rules. Body:\n{\"accept\": true, \"confirmed_by\": \"name\", \"edits\": {\"frequency_cap\": \"1/7d\", ...}}","operationId":"confirm_rules_route_api_v1_destinations__dest_id__rules_confirm_post","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/destinations/{dest_id}/relevance":{"post":{"tags":["catalogue"],"summary":"Rescore","description":"Recompute the 1-5 relevance score and its explanation for one destination.","operationId":"rescore_api_v1_destinations__dest_id__relevance_post","parameters":[{"name":"dest_id","in":"path","required":true,"schema":{"type":"string","title":"Dest Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/recommendations":{"post":{"tags":["recommendations"],"summary":"Recommendations","description":"Rank destinations for one content item, with a reason for each; destinations where the post would be\nblocked by rules are listed under `excluded` with the reason. Read-only, so safe to repeat.","operationId":"recommendations_api_v1_recommendations_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recommendations Api V1 Recommendations Post"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/publications/{pub_id}/metrics":{"get":{"tags":["publications"],"summary":"Metrics","description":"Normalised metrics (views, likes, comments, shares, saves, watch_time_s, clicks) from the platform.","operationId":"metrics_api_v1_publications__pub_id__metrics_get","parameters":[{"name":"pub_id","in":"path","required":true,"schema":{"type":"string","title":"Pub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Metrics Api V1 Publications  Pub Id  Metrics Get"}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/recertification/run":{"post":{"tags":["certification"],"summary":"Recertify Now","description":"Start re-certification for every destination whose certificate is close to 30 days old (the scheduler\ndoes this hourly; this route triggers it now). Destinations already being certified are skipped.","operationId":"recertify_now_api_v1_recertification_run_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same key + same body = same result, no repeat","title":"Idempotency-Key"},"description":"Same key + same body = same result, no repeat"}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/feeds/{feed_key}.xml":{"get":{"tags":["feeds"],"summary":"Feed","description":"Public Media RSS feed for CTV apps and video aggregators (the MRSS connector's destination).","operationId":"feed_feeds__feed_key__xml_get","parameters":[{"name":"feed_key","in":"path","required":true,"schema":{"type":"string","title":"Feed Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Error (see GET /api/v1/errors for all codes)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"Body_import_catalogue_upload_api_v1_catalogue_import_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_catalogue_upload_api_v1_catalogue_import_upload_post"},"CertifyRequest":{"properties":{"connection":{"anyOf":[{"$ref":"#/components/schemas/Connection"},{"type":"null"}]},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}},"type":"object","title":"CertifyRequest"},"ConfirmRequest":{"properties":{"live_url":{"type":"string","title":"Live Url"}},"type":"object","required":["live_url"],"title":"ConfirmRequest"},"Connection":{"properties":{"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"auth":{"additionalProperties":true,"type":"object","title":"Auth","description":"Secrets; never logged"},"simulate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Simulate","description":"Simulation mode only: mock fault to inject"}},"additionalProperties":true,"type":"object","title":"Connection"},"ConnectionIn":{"properties":{"connector_key":{"type":"string","title":"Connector Key"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Non-secret settings such as base_url"},"secret_env":{"additionalProperties":{"type":"string"},"type":"object","title":"Secret Env","description":"field -> NAME of the env var holding the secret"}},"type":"object","required":["connector_key"],"title":"ConnectionIn"},"DestinationIn":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"platform_key":{"type":"string","title":"Platform Key"},"connector_key":{"type":"string","title":"Connector Key"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"audience_tags":{"items":{"type":"string"},"type":"array","title":"Audience Tags"},"language":{"type":"string","title":"Language","default":"en"},"geo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo"},"est_audience":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Est Audience"},"rules_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rules Url"},"frequency_cap":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency Cap"},"self_promo_allowed":{"type":"boolean","title":"Self Promo Allowed","default":true},"link_policy":{"type":"string","title":"Link Policy","default":"allowed"},"disclosure_required":{"type":"boolean","title":"Disclosure Required","default":false},"automation_allowed":{"type":"boolean","title":"Automation Allowed","default":true},"relevance_score":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Relevance Score"},"relevance_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relevance Reason"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"rules_confirmed":{"type":"boolean","title":"Rules Confirmed","default":true},"rules_source":{"type":"string","title":"Rules Source","default":"manual"}},"type":"object","required":["name","url","platform_key","connector_key"],"title":"DestinationIn"},"ErrorBody":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"retryable":{"type":"boolean","title":"Retryable"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["code","message","retryable","details"],"title":"ErrorBody"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"type":"object","required":["error"],"title":"ErrorResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportRequest":{"properties":{"csv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csv Url","description":"URL of a CSV (alternative to multipart upload)"},"csv_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csv Text"},"check_reachability":{"type":"boolean","title":"Check Reachability","default":true},"upsert":{"type":"boolean","title":"Upsert","default":false},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}},"type":"object","title":"ImportRequest"},"Media":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"type":{"anyOf":[{"type":"string","enum":["image","video","audio","file"]},{"type":"null"}],"title":"Type"},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"alt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt"}},"additionalProperties":true,"type":"object","title":"Media"},"PublicationRequest":{"properties":{"destination_id":{"type":"string","title":"Destination Id"},"rendition":{"$ref":"#/components/schemas/Rendition"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"},"connection":{"anyOf":[{"$ref":"#/components/schemas/Connection"},{"type":"null"}]},"auto_tailor":{"type":"boolean","title":"Auto Tailor","default":true},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}},"type":"object","required":["destination_id","rendition"],"title":"PublicationRequest"},"RecommendRequest":{"properties":{"rendition":{"$ref":"#/components/schemas/Rendition"},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"include_uncertified":{"type":"boolean","title":"Include Uncertified","default":false}},"type":"object","required":["rendition"],"title":"RecommendRequest"},"Rendition":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"Markdown unless body_format says otherwise"},"body_format":{"type":"string","enum":["markdown","html","text"],"title":"Body Format","default":"markdown"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url"},"media":{"items":{"$ref":"#/components/schemas/Media"},"type":"array","title":"Media"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"ISO 639-1, e.g. en, es"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"text | link | image | video | video_link | article"},"ai_generated":{"type":"boolean","title":"Ai Generated","default":false},"promotional":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Promotional","description":"If omitted we detect promotional wording"},"brand_domains":{"items":{"type":"string"},"type":"array","title":"Brand Domains","description":"The creator's own domains (promo check)"},"discussion_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discussion Question"},"overrides":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Overrides","description":"Per-connector or per-destination field overrides"}},"additionalProperties":true,"type":"object","title":"Rendition","description":"One version of a creator's content, ready to be adapted per destination."},"RulesCaptureRequest":{"properties":{"rules_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rules Url"},"rules_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rules Text"},"callback_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}},"type":"object","title":"RulesCaptureRequest"},"ValidateRequest":{"properties":{"destination_id":{"type":"string","title":"Destination Id"},"rendition":{"$ref":"#/components/schemas/Rendition"},"auto_tailor":{"type":"boolean","title":"Auto Tailor","default":true}},"type":"object","required":["destination_id","rendition"],"title":"ValidateRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}