{"openapi":"3.1.0","info":{"title":"PostNode API","version":"0.1.0","description":"Publish, schedule and measure posts across social platforms through one API."},"servers":[{"url":"https://api.postatom.com"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A workspace API key. A test key resolves to the sandbox environment."}},"schemas":{"CreatePost":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"targets":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"kind":{"default":"text","type":"string","enum":["text","image","video","thread","carousel","story"]},"content":{"type":"string","maxLength":10000},"media":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"thread":{"maxItems":25,"type":"array","items":{"type":"object","properties":{"content":{"type":"string","maxLength":10000},"media":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["content"],"additionalProperties":false}},"options":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/PublishJson"}},"overrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"kind":{"type":"string","enum":["text","image","video","thread","carousel","story"]},"content":{"type":"string","maxLength":10000},"media":{"maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"thread":{"maxItems":25,"type":"array","items":{"type":"object","properties":{"content":{"type":"string","maxLength":10000},"media":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["content"],"additionalProperties":false}},"options":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/PublishJson"}}},"additionalProperties":false}},"publishAt":{"type":"string","minLength":16,"maxLength":40},"timezone":{"type":"string","maxLength":64},"saveAsDraft":{"type":"boolean"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":255}},"required":["targets","content"],"additionalProperties":false,"title":"CreatePost"},"Reschedule":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"publishAt":{"type":"string","minLength":16,"maxLength":40},"timezone":{"type":"string","maxLength":64}},"required":["publishAt"],"additionalProperties":false,"title":"Reschedule"},"AnalyticsQuery":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"from":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"to":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"platform":{"type":"string","minLength":1,"maxLength":64},"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"granularity":{"type":"string","enum":["day","week","month"]}},"additionalProperties":false,"title":"AnalyticsQuery"},"PostQuery":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["pending","scheduled","publishing","published","failed","cancelled","needs_human_review","delegated","awaiting_approval"]},{"type":"string","const":"draft"}]},"held":{"type":"string","enum":["draft","approval"]},"platform":{"type":"string","minLength":1,"maxLength":64},"profileId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"from":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"to":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"createdAfter":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"createdBefore":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"scheduledAfter":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"scheduledBefore":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"before":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0,"maximum":10000}},"additionalProperties":false,"title":"PostQuery"},"AnnounceMedia":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mime":{"type":"string","enum":["image/jpeg","image/png","image/gif","image/webp","video/mp4","video/quicktime","video/webm","application/pdf"],"description":"What you are about to upload."},"bytes":{"type":"integer","minimum":1,"maximum":209715200},"altText":{"type":"string","maxLength":2000},"externalUserRef":{"type":"string","maxLength":255}},"required":["mime","bytes"],"additionalProperties":false,"title":"AnnounceMedia"},"Post":{"type":"object","required":["id","status","destinations"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"publishAt":{"type":["string","null"],"format":"date-time"},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/Destination"},"description":"Per destination. A post to several platforms where one failed is neither published nor failed, so the status is never collapsed into one word."}}},"Account":{"type":"object","required":["id","platform","status","publishingAvailable"],"properties":{"id":{"type":"string","format":"uuid"},"platform":{"type":"string"},"handle":{"type":["string","null"]},"displayName":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"status":{"type":"string"},"publishingAvailable":{"type":"boolean"},"unavailableReason":{"type":["string","null"]},"capabilities":{"type":["object","null"],"description":"What this account will accept. Read it before composing; on a federated network two accounts on the same platform can differ."}}},"Reply":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":10000}},"required":["body"],"additionalProperties":false,"title":"Reply"},"ConversationPatch":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","enum":["open","archived"]}},"required":["status"],"additionalProperties":false,"title":"ConversationPatch"},"CommentCreate":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"postId":{"type":"string","minLength":1,"maxLength":512},"text":{"type":"string","minLength":1,"maxLength":8000},"commentId":{"type":"string","minLength":1,"maxLength":512}},"required":["accountId","postId","text"],"additionalProperties":false,"title":"CommentCreate"},"MessageSend":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"recipientId":{"type":"string","minLength":1,"maxLength":256},"text":{"type":"string","minLength":1,"maxLength":4000}},"required":["accountId","recipientId","text"],"additionalProperties":false,"title":"MessageSend"},"BlueskyAppPassword":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"identifier":{"type":"string","minLength":1,"maxLength":253},"password":{"type":"string","minLength":1,"maxLength":256},"externalUserRef":{"type":"string","minLength":1,"maxLength":1024}},"required":["identifier","password"],"additionalProperties":false,"title":"BlueskyAppPassword"},"AggregatedMetric":{"type":"object","required":["total","reportedBy","platforms","notReportedBy"],"properties":{"total":{"type":["number","null"],"description":"Null when no platform in the window reported this figure."},"reportedBy":{"type":"integer"},"platforms":{"type":"integer"},"notReportedBy":{"type":"array","items":{"type":"string"}}}},"PostAnalytics":{"type":"object","required":["id","source","date","content","aggregated","platforms"],"properties":{"id":{"type":"string","format":"uuid"},"source":{"type":"string","enum":["postnode","platform"],"description":"`platform` is a post found on the account that PostNode did not publish."},"postId":{"type":["string","null"],"format":"uuid","description":"Null for a discovered post: there is no PostNode post."},"date":{"type":["string","null"],"format":"date-time"},"content":{"type":"string"},"aggregated":{"type":"object","additionalProperties":{"type":["number","null"]},"description":"Totals across the post’s destinations, plus `engagement`. Null means no platform reported it."},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"accountId":{"type":"string","format":"uuid"},"deliveryId":{"type":["string","null"],"format":"uuid"},"externalPostId":{"type":["string","null"]},"url":{"type":["string","null"]},"capturedAt":{"type":["string","null"],"format":"date-time"},"metrics":{"type":"object","additionalProperties":{"type":["number","null"]}}}}}}},"Conversation":{"type":"object","required":["id","platform","kind","externalId","status"],"properties":{"id":{"type":"string","format":"uuid"},"platform":{"type":"string"},"platformAccountId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["comment_thread","direct_message"],"description":"Always a comment thread in v1. No platform offers a third-party direct-message API this could be built on."},"externalId":{"type":"string"},"subjectExternalPostId":{"type":["string","null"]},"status":{"type":"string","enum":["open","archived"]},"lastMessageAt":{"type":["string","null"],"format":"date-time"}}},"Message":{"type":"object","required":["id","conversationId","externalId","direction","state","body"],"properties":{"id":{"type":"string","format":"uuid"},"conversationId":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"direction":{"type":"string","enum":["inbound","outbound"]},"state":{"type":"string","enum":["inbox_received","reply_queued","reply_delivered","reply_rejected"]},"author":{"type":"object"},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}},"Destination":{"type":"object","required":["id","targetId","platform","status"],"properties":{"id":{"type":"string","format":"uuid"},"targetId":{"type":"string","format":"uuid"},"platform":{"type":"string"},"status":{"type":"string"},"externalPostId":{"type":["string","null"]},"externalUrl":{"type":["string","null"]},"issues":{"type":"array","items":{"type":"object"}}}},"WebhookEvent":{"type":"string","enum":["post.published","post.failed","post.scheduled","post.cancelled","account.connected","account.disconnected","account.needs_reauth","comment.received","message.received","post.partially_failed","post.needs_review","post.stale_schedule","post.dead_lettered","platform.availability_changed","usage.limit_approaching","account.expiring"]},"PublishJson":{"title":"PublishJson","description":"Any JSON value. Platform options are passed through unchanged, so what is valid depends on the platform rather than on this API."}}},"security":[{"apiKey":[]}],"paths":{"/v1/posts":{"get":{"summary":"Posts, newest first","operationId":"listPosts","description":"Paged by creation instant rather than by offset, so publishing during paging cannot show a reader the same post twice while hiding another.","parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"The `nextCursor` of the previous page."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"A page of posts.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}},"post":{"summary":"Publish or schedule a post","operationId":"createPost","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Replaying this key with the same body returns the original post."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePost"}}}},"responses":{"202":{"description":"Accepted, with per-destination status.","headers":{"Idempotency-Replayed":{"schema":{"type":"string","enum":["true"]},"description":"Present when this replayed an earlier request."}},"content":{"application/json":{"schema":{"type":"object","required":["id","status","destinations"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"replayed":{"type":"boolean"},"approvalMode":{"type":["string","null"],"enum":["publish","draft",null],"description":"draft when this key is scoped approval:required. Nothing was published."},"reviewUrl":{"type":"string","description":"Where a person releases a post that was held for approval. Present only on a draft."},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/Destination"}}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The request conflicts with what is already recorded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/media":{"post":{"summary":"Announce an upload and get a URL to put the bytes at","operationId":"announceMedia","description":"Three steps: announce, upload straight to storage with the URL returned here, then confirm. The URL is signed for exactly this size and type and expires in minutes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnounceMedia"}}}},"responses":{"201":{"description":"The asset, and where to put the bytes.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/media/{assetId}/confirmation":{"post":{"summary":"Confirm an upload","operationId":"confirmMedia","description":"Reads the file’s own header back and records what it actually is. An asset is not publishable until this succeeds, and a file that is not what it was declared to be is refused here rather than by a platform hours later.","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The asset, now publishable.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"Nothing was uploaded, or the asset was already settled.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/media/{assetId}":{"get":{"summary":"Read an asset back","operationId":"getMedia","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The asset and what was found in it.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/accounts":{"get":{"summary":"Where this workspace can post, and what each will accept","operationId":"listAccounts","description":"Call this before composing. The limits travel with the account because on a federated network two accounts on the same platform genuinely differ. An account that needs reconnecting is still listed, marked unavailable with the reason.","responses":{"200":{"description":"Connected accounts with their live capabilities.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Account"}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/accounts/{accountId}":{"get":{"summary":"One connected account","operationId":"getAccount","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The account and its capabilities.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Account"}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/accounts/{accountId}/boards":{"get":{"summary":"The boards a Pinterest account may Pin to","operationId":"listAccountBoards","description":"Every Pin names a board, so this is what a caller asks before naming one. Refused with not_supported_on_platform for an account whose platform has no such list. An alias of PostPeer’s GET /v1/pinterest/boards.","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The boards this account may Pin to.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"422":{"description":"This account’s platform does not offer this list.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/accounts/{accountId}/creator-info":{"get":{"summary":"What a TikTok creator’s application audit currently permits","operationId":"getAccountCreatorInfo","description":"Privacy levels on offer, duet/stitch/comment state and the duration ceiling, read from the account rather than assumed. Refused with not_supported_on_platform for an account whose platform has no such audit. An alias of PostPeer’s GET /v1/tiktok/creator-info.","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"What this account may currently post.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"422":{"description":"This account’s platform does not offer this list.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/subjects/{externalUserRef}":{"get":{"summary":"What PostNode holds about one of your end users","operationId":"previewSubjectErasure","description":"Row counts per table for one `external_user_ref`. Erasure is irreversible, so seeing what will go — and that it is the right subject — is worth one extra call.","parameters":[{"name":"externalUserRef","in":"path","required":true,"schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"What erasure would remove.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"externalUserRef":{"type":"string"},"rows":{"type":"object","additionalProperties":{"type":"integer"}}}}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}},"delete":{"summary":"Erase everything PostNode holds about one end user","operationId":"eraseSubject","description":"Removes the connected account and its tokens, the inbox conversations and messages, the media files and their rows, the request logs and webhook deliveries, and any post whose only destination was theirs. Files go before the rows that name them, and every table is re-counted afterwards: the receipt reports zero residual rows or the call fails. Irreversible, and safe to repeat.","parameters":[{"name":"externalUserRef","in":"path","required":true,"schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"What was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"externalUserRef":{"type":"string"},"removed":{"type":"object","additionalProperties":{"type":"integer"}},"objects":{"type":"integer"},"residual":{"type":"integer"}}}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"This deployment has no object storage and the subject owns files, so erasing the rows would leave the files behind.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/posts/{postId}":{"get":{"summary":"One post, with each destination’s own status","operationId":"getPost","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The post and every destination.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Post"}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/posts/{postId}/retry":{"post":{"summary":"Send a dead-lettered post again","operationId":"retryPost","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Per destination: reopened, or the reason it was left alone.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The request conflicts with what is already recorded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/posts/{postId}/schedule":{"post":{"summary":"Move a scheduled post","operationId":"reschedulePost","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reschedule"}}}},"responses":{"200":{"description":"Per destination: moved, or why it was not.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}},"delete":{"summary":"Cancel a scheduled post","operationId":"cancelPost","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Per destination: cancelled, or why it was not.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics":{"get":{"summary":"Normalized metrics across platforms","operationId":"readAnalytics","description":"Posts are dated by when they were published, and every post in the window is counted. Totals are built from each post’s latest reading, and every total states how many platforms reported it. A figure a platform does not measure is null, never zero.","parameters":[{"name":"from","in":"query","schema":{"type":"string","format":"date-time"},"description":"Defaults to thirty days before `to`."},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"},"description":"Defaults to now."},{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"accountId","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"granularity","in":"query","schema":{"type":"string","enum":["day","week","month"]}}],"responses":{"200":{"description":"Totals and a series, both null-aware.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"timezone":{"type":"string","description":"The zone the series is bucketed in. Always `UTC` here."},"granularity":{"type":"string"},"deliveries":{"type":"integer"},"truncated":{"type":"boolean","description":"Always false: every post in the window is counted. Kept so existing readers keep working."},"platforms":{"type":"array","items":{"type":"string"}},"totals":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/AggregatedMetric"}},"series":{"type":"array","items":{"type":"object"}}}}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics/posts":{"get":{"summary":"Posts with their numbers, sortable by any of them","operationId":"listPostAnalytics","description":"One row per post with its destinations beneath it. `source` is `postnode` for a post published here and `platform` for one found on the account, which is how a post made in the platform’s own app appears at all. Every figure is a stored reading: sorting never becomes a platform call. A figure no platform reported is null, never zero — so an unmeasured post ranks last rather than alongside one nobody engaged with.","parameters":[{"name":"sortBy","in":"query","schema":{"type":"string","enum":["date","likes","comments","impressions","views","shares","saves","clicks","engagement"]},"description":"Defaults to `date`. `engagement` is likes + comments + shares + saves."},{"name":"order","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"accountId","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"fromDate","in":"query","schema":{"type":"string","format":"date-time"},"description":"On the post’s own date, not the reading’s."},{"name":"toDate","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"source","in":"query","schema":{"type":"string","enum":["postnode","platform"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000},"description":"Exclusive with `cursor`; sending both is refused."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"The `nextCursor` of the previous page. Preferred over `page`: a reading arriving mid-paging shifts every offset."}],"responses":{"200":{"description":"A page of posts, ranked.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PostAnalytics"}},"page":{"type":"integer"},"limit":{"type":"integer"},"sortBy":{"type":"string"},"order":{"type":"string"},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics/instagram/account-insights":{"get":{"summary":"An Instagram account’s own daily figures","operationId":"readAccountInsights","description":"Reach, profile views and website clicks, one point per day, from the readings the daily account job already takes. An account with nothing captured yet falls back to one live call, at most once an hour. Answered for any account whose adapter publishes account insights — the route dispatches on that, not on the platform’s name; an account whose platform does not answers `409`.","parameters":[{"name":"accountId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"A day series, and when it was captured.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The request conflicts with what is already recorded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics/instagram/demographics":{"get":{"summary":"Who follows an Instagram account","operationId":"readAccountDemographics","description":"Age, gender, country and city, as the platform cuts them. A cut the platform withholds — it does so below a hundred followers — comes back empty rather than failing the others.","parameters":[{"name":"accountId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Four breakdowns, and when they were captured.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The request conflicts with what is already recorded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics/instagram/follower-stats":{"get":{"summary":"Follower count, and how it moved","operationId":"readFollowerStats","description":"The count answers “how many now” and never “how did that change”, so the daily deltas come with it, built from the readings the account job has been taking all along.","parameters":[{"name":"accountId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"The latest count and the daily series.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The request conflicts with what is already recorded.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/analytics/deliveries/{deliveryId}":{"get":{"summary":"One post’s readings over time","operationId":"readDeliveryMetrics","description":"Every capture is kept, so growth is visible rather than a single figure being overwritten.","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The capture history, oldest first.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/conversations":{"get":{"summary":"Comment threads, most recent activity first","operationId":"listConversations","description":"Comment threads only. Direct messages are their own surface under `/v1/messages` and their own scopes: a key that may moderate comments has not been told it may read somebody private conversation. An id of the wrong kind answers 404 rather than 403, so it cannot be used to discover that a private thread exists.","parameters":[{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"accountId","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"The `nextCursor` of the previous page."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"A page of threads.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Conversation"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/conversations/{id}":{"patch":{"summary":"Archive or reopen a thread","operationId":"setConversationStatus","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationPatch"}}}},"responses":{"200":{"description":"The thread, as it now stands.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Conversation"}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/conversations/{id}/messages":{"get":{"summary":"One thread, oldest message first","operationId":"listMessages","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"Reach back past what PostNode keeps. Messages are partitioned by month and retained for a bounded window; a `before` earlier than that window is answered from the platform instead of the database and nothing is stored. The response `source` says which it was — a live read costs a platform call, is subject to that platform’s rate limits, and can disagree with what was stored if a message has since been deleted."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"The platform’s own cursor, for paging a live read."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"A page of messages, with `source` naming where they came from.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/conversations/{id}/reply":{"post":{"summary":"Reply in a thread","operationId":"replyToConversation","description":"A platform that does not let an application reply is refused with not_supported_on_platform at the moment of asking, rather than accepting a reply that could never be sent.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reply"}}}},"responses":{"201":{"description":"The reply was recorded and sent.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"422":{"description":"This platform does not accept replies from an application.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/connect/bluesky/auth":{"post":{"summary":"Connect a Bluesky account with an app password","operationId":"connectBlueskyAppPassword","description":"OAuth is the default and is what GET /v1/connect/bluesky starts; this exists because many Bluesky accounts live on servers whose operators have never registered this deployment's OAuth client. The password is used once and never stored: what is stored is the session it buys, which the person can revoke from their own settings without changing their password. An app password cannot be scoped and grants everything the account can do.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueskyAppPassword"}}}},"responses":{"201":{"description":"The account is connected.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No Bluesky account answers to that handle.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"502":{"description":"The server holding that account did not answer.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/comments":{"get":{"summary":"One post's comments, oldest first","operationId":"listPostComments","description":"Flat rather than nested: each comment carries its parent id, so a caller that wants the tree can build it and one that wants to read through in order is not made to walk it.","parameters":[{"name":"accountId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"postId","in":"query","required":true,"schema":{"type":"string","maxLength":512},"description":"The post as the platform identifies it."},{"name":"after","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"The post's comments.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}},"post":{"summary":"Comment on a post","operationId":"createComment","description":"Starts a thread under a post, which is not the same as replying inside one — a reply goes to /v1/conversations/{id}/reply, which has the thread the comment belongs to. A platform with no comment endpoint an application may use is refused at the moment of asking.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}}},"responses":{"201":{"description":"The comment was created.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"This platform has no comment endpoint PostNode can use.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/comments/{commentId}":{"delete":{"summary":"Delete a comment by its own id","operationId":"deleteCommentById","description":"The same action as the thread-shaped route, for a caller that holds a comment id and nothing else. A direct message is never found here.","parameters":[{"name":"commentId","in":"path","required":true,"schema":{"type":"string","maxLength":512}}],"responses":{"204":{"description":"Deleted."},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"This platform does not let an application delete comments.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/comments/{commentId}/hide":{"post":{"summary":"Hide a comment by its own id","operationId":"hideCommentById","parameters":[{"name":"commentId","in":"path","required":true,"schema":{"type":"string","maxLength":512}}],"responses":{"204":{"description":"Hidden."},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"This platform does not let an application hide comments.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/messages":{"get":{"summary":"Direct threads, most recent first","operationId":"listMessageThreads","description":"Behind `messages:read`, which is not `inbox:read`: a comment is public and a message is not. Instagram only, through a connected Page.","parameters":[{"name":"accountId","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"platform","in":"query","schema":{"type":"string"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"A page of threads.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Conversation"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}},"post":{"summary":"Send a direct message","operationId":"sendMessage","description":"The platform allows a reply within 24 hours of the last message received. A thread whose stored last inbound message has aged past that is refused here with the instant named; silence is never read as a refusal, and the platform own answer is the authority in every other case.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageSend"}}}},"responses":{"201":{"description":"The message was sent.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"409":{"description":"The reply window has closed, or this platform has no messaging PostNode can use.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"413":{"description":"The request body is larger than this route accepts.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/v1/messages/{conversationId}":{"get":{"summary":"One direct thread, oldest message first","operationId":"listDirectMessages","parameters":[{"name":"conversationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"A page of messages.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"The request was not valid.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"401":{"description":"The bearer key was missing, unknown or malformed.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"403":{"description":"The key lacks the scope this route requires.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No such post, or none in this workspace.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}},"500":{"description":"An internal error occurred.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","internal_error","invalid_request","payload_too_large","stale_schedule","unauthorized","forbidden","conflict","idempotency_conflict","rate_limited","not_supported_on_platform","platform_unavailable","credentials_expired","needs_human_review","plan_limit_exceeded"]},"message":{"type":"string"}}}}}}}}}}},"/health":{"get":{"summary":"Liveness","operationId":"health","security":[],"responses":{"200":{"description":"The service is running.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/ready":{"get":{"summary":"Readiness, including the database","operationId":"ready","security":[],"responses":{"200":{"description":"The service and its database are reachable.","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"A dependency is unavailable.","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}