{"openapi":"3.1.0","info":{"title":"Tesselith API","description":"Schedule and publish posts, manage posting queues, upload media and read analytics.\n\n**Auth:** `Authorization: Bearer tsl_live_…`. Create keys in Settings → Developers. A key acts for one workspace with the scopes it was given, never more than its creator's role.\n\n**Errors** are RFC 9457 `application/problem+json`; switch on `code`.\n\n**Pagination:** pass `next_cursor` back as `cursor` until it is null.\n\n**Idempotency:** send an `Idempotency-Key` header on any POST to make retries safe for 24 h.\n\n**Plans:** the API, webhooks and MCP are included from the Pro plan; other plans get `403 PLAN_UPGRADE_REQUIRED`.\n\n**Rate limit:** per key, per minute: 120 on Pro, 300 on Team, 600 on Agency, reported in the `RateLimit` and `RateLimit-Policy` headers.\n\n**Webhooks** follow [Standard Webhooks](https://www.standardwebhooks.com): verify `webhook-signature` with the endpoint's `whsec_` secret using any Standard Webhooks library, dedupe on `webhook-id`, and answer 2xx within 15 s. Failed deliveries retry for about 27 h; an endpoint that keeps failing for 5 days is switched off.","version":"1.0.0","contact":{"name":"Tesselith support","email":"support@tesselith.com"}},"servers":[{"url":"/v1"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","bearerFormat":"tsl_live_…"}},"schemas":{"ChannelList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}}},"required":["data"],"additionalProperties":false},"Channel":{"type":"object","properties":{"id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"platform":{"type":"string","enum":["twitter","instagram","facebook_pages","linkedin_personal","linkedin_company","threads","youtube","tiktok","discord","telegram","reddit","pinterest","bluesky","mastodon","devto","hashnode"]},"name":{"type":"string"},"handle":{"type":"string"},"avatar_url":{"type":["string","null"]},"status":{"type":"string","enum":["active","reconnection_required","disconnected"]}},"required":["id","platform","name","handle","avatar_url","status"],"additionalProperties":false},"Problem":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"code":{"type":"string","example":"VALIDATION_ERROR"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"],"additionalProperties":false}}},"required":["type","title","status","detail","code"],"additionalProperties":false,"description":"RFC 9457 problem details."},"PostingSchedule":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"timezone":{"type":"string","example":"Europe/London"},"paused":{"type":"boolean"},"slots":{"type":"array","items":{"type":"object","properties":{"day_of_week":{"type":"integer","minimum":0,"maximum":6,"description":"0 = Sunday."},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"09:30","description":"Wall-clock time in the workspace timezone."}},"required":["day_of_week","time"],"additionalProperties":false}}},"required":["channel_id","timezone","paused","slots"],"additionalProperties":false},"PostingScheduleUpdated":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"timezone":{"type":"string","example":"Europe/London"},"paused":{"type":"boolean"},"slots":{"type":"array","items":{"type":"object","properties":{"day_of_week":{"type":"integer","minimum":0,"maximum":6,"description":"0 = Sunday."},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"09:30","description":"Wall-clock time in the workspace timezone."}},"required":["day_of_week","time"],"additionalProperties":false}},"stranded_posts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many queued posts no longer fit a slot; they keep their time as fixed-time posts."}},"required":["channel_id","timezone","paused","slots","stranded_posts"],"additionalProperties":false},"PostingScheduleInput":{"type":"object","properties":{"slots":{"maxItems":168,"type":"array","items":{"type":"object","properties":{"day_of_week":{"type":"integer","minimum":0,"maximum":6,"description":"0 = Sunday."},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","example":"09:30","description":"Wall-clock time in the workspace timezone."}},"required":["day_of_week","time"]}}},"required":["slots"]},"PostList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"next_cursor":{"description":"Null on the last page.","type":["string","null"]}},"required":["data","next_cursor"],"additionalProperties":false},"Post":{"type":"object","properties":{"id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"status":{"type":"string","enum":["draft","scheduled","pending_approval","approved","revision_requested","rejected","queued","publishing","published","failed","cancelled","archived","partially_published"]},"body":{"type":"string"},"media":{"type":"array","items":{"$ref":"#/components/schemas/Media"}},"channel_ids":{"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}},"schedule_mode":{"type":"string","enum":["custom","queue","now"]},"scheduled_at":{"anyOf":[{"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))$","example":"2026-11-02T09:30:00.000Z"},{"type":"null"}]},"timezone":{"type":"string"},"overrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"description":"Per-channel fields, keyed by channel id."},"thread":{"type":"array","items":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"body":{"type":"string"},"sequence":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["channel_id","body","sequence","delay_minutes"],"additionalProperties":false},"description":"Follow-up replies posted under the post, per channel."},"author_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"created_at":{"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))$","example":"2026-11-02T09:30:00.000Z"},"updated_at":{"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))$","example":"2026-11-02T09:30:00.000Z"}},"required":["id","status","body","media","channel_ids","schedule_mode","scheduled_at","timezone","overrides","thread","author_id","created_at","updated_at"],"additionalProperties":false},"Media":{"type":"object","properties":{"id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"url":{"type":"string"},"filename":{"type":"string"},"content_type":{"type":"string","example":"image/png"},"size_bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"width":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"height":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"duration_seconds":{"type":["number","null"]},"alt_text":{"type":["string","null"]},"created_at":{"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))$","example":"2026-11-02T09:30:00.000Z"}},"required":["id","url","filename","content_type","size_bytes","width","height","duration_seconds","alt_text","created_at"],"additionalProperties":false},"CreatePost":{"type":"object","properties":{"body":{"type":"string","maxLength":100000},"media_ids":{"maxItems":35,"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}},"channel_ids":{"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}},"timezone":{"example":"America/New_York","type":"string"},"thread":{"type":"array","items":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"body":{"type":"string"},"sequence":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["channel_id","body","sequence"]}}}},"UpdatePost":{"type":"object","properties":{"body":{"type":"string","maxLength":100000},"media_ids":{"maxItems":35,"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}},"channel_ids":{"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}},"timezone":{"example":"America/New_York","type":"string"},"thread":{"type":"array","items":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"body":{"type":"string"},"sequence":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"delay_minutes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["channel_id","body","sequence"]}},"overrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}}},"SchedulePost":{"type":"object","properties":{"scheduled_at":{"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)))$","example":"2026-11-02T09:30:00Z"}},"required":["scheduled_at"]},"QueuePost":{"type":"object","properties":{"position":{"default":"last","description":"`last` takes the next free slot; `next` jumps the line.","type":"string","enum":["next","last"]}}},"Queue":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"timezone":{"type":"string"},"paused":{"type":"boolean"},"items":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["post","slot"],"description":"`slot` is a free time in the posting schedule."},"at":{"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))$","example":"2026-11-02T09:30:00.000Z"},"post":{"type":"object","properties":{"id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"body":{"type":"string"},"status":{"type":"string","enum":["draft","scheduled","pending_approval","approved","revision_requested","rejected","queued","publishing","published","failed","cancelled","archived","partially_published"]},"schedule_mode":{"type":"string","enum":["custom","queue","now"]},"channel_ids":{"type":"array","items":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}}},"required":["id","body","status","schedule_mode","channel_ids"],"additionalProperties":false}},"required":["kind","at"],"additionalProperties":false}}},"required":["channel_id","timezone","paused","items"],"additionalProperties":false},"MediaUpload":{"type":"object","properties":{"file":{"type":"string","format":"binary","contentEncoding":"binary"},"alt_text":{"type":"string","maxLength":1500},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"duration_seconds":{"type":"number","exclusiveMinimum":0}},"required":["file"]},"MediaFromUrl":{"type":"object","properties":{"url":{"type":"string","format":"uri","example":"https://example.com/photo.jpg"},"alt_text":{"type":"string","maxLength":1500},"width":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"duration_seconds":{"type":"number","exclusiveMinimum":0}},"required":["url"]},"PostAnalytics":{"type":"object","properties":{"post_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"totals":{"type":"object","properties":{"impressions":{"type":["number","null"]},"likes":{"type":["number","null"]},"comments":{"type":["number","null"]},"shares":{"type":["number","null"]},"saves":{"type":["number","null"]},"clicks":{"type":["number","null"]},"video_plays":{"type":["number","null"]},"watch_time_minutes":{"type":["number","null"]},"engagements":{"type":["number","null"]}},"required":["impressions","likes","comments","shares","saves","clicks","video_plays","watch_time_minutes","engagements"],"additionalProperties":false},"channels":{"type":"array","items":{"type":"object","properties":{"channel_id":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"impressions":{"type":["number","null"]},"likes":{"type":["number","null"]},"comments":{"type":["number","null"]},"shares":{"type":["number","null"]},"saves":{"type":["number","null"]},"clicks":{"type":["number","null"]},"video_plays":{"type":["number","null"]},"watch_time_minutes":{"type":["number","null"]},"fetched_at":{"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))$","example":"2026-11-02T09:30:00.000Z"}},"required":["channel_id","impressions","likes","comments","shares","saves","clicks","video_plays","watch_time_minutes","fetched_at"],"additionalProperties":false}},"synced_at":{"anyOf":[{"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))$","example":"2026-11-02T09:30:00.000Z"},{"type":"null"}],"description":"Oldest snapshot time: the totals are as current as this."}},"required":["post_id","totals","channels","synced_at"],"additionalProperties":false,"description":"Null means the network didn't report that metric, not zero."},"WebhookEndpointList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}},"required":["data"],"additionalProperties":false},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string","example":"ep_2d9Xq8Lw0aZr4kVb1yHc"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"event_types":{"type":"array","items":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"description":"Empty means every event, including ones added later."},"enabled":{"type":"boolean"},"disabled_reason":{"anyOf":[{"type":"string","enum":["manual","failing"]},{"type":"null"}],"description":"`failing`: switched off after 5 days of failed deliveries."},"created_at":{"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))$","example":"2026-11-02T09:30:00.000Z"}},"required":["id","url","description","event_types","enabled","disabled_reason","created_at"],"additionalProperties":false},"WebhookEndpointCreated":{"type":"object","properties":{"id":{"type":"string","example":"ep_2d9Xq8Lw0aZr4kVb1yHc"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"event_types":{"type":"array","items":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"description":"Empty means every event, including ones added later."},"enabled":{"type":"boolean"},"disabled_reason":{"anyOf":[{"type":"string","enum":["manual","failing"]},{"type":"null"}],"description":"`failing`: switched off after 5 days of failed deliveries."},"created_at":{"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))$","example":"2026-11-02T09:30:00.000Z"},"secret":{"type":"string","example":"whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw","description":"Verifies the `webhook-signature` header. Also shown in Settings → Developers."}},"required":["id","url","description","event_types","enabled","disabled_reason","created_at","secret"],"additionalProperties":false},"WebhookEndpointInput":{"type":"object","properties":{"url":{"type":"string","example":"https://example.com/hooks/tesselith"},"description":{"type":"string","maxLength":200},"event_types":{"type":"array","items":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]}}},"required":["url"]}}},"tags":[{"name":"Channels"},{"name":"Posts"},{"name":"Queue"},{"name":"Media"},{"name":"Analytics"},{"name":"Webhooks"}],"webhooks":{"post.created":{"post":{"summary":"A post is created","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"post.scheduled":{"post":{"summary":"A post is scheduled","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"post.published":{"post":{"summary":"A post is published","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"post.failed":{"post":{"summary":"A post fails to publish","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"post.deleted":{"post":{"summary":"A post is deleted","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"queue.updated":{"post":{"summary":"A queue changes","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"channel.connected":{"post":{"summary":"A channel is connected","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"channel.disconnected":{"post":{"summary":"A channel is disconnected","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}},"channel.reconnect_required":{"post":{"summary":"A channel needs reconnecting","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$ref":"#/$defs/WebhookEvent","$defs":{"WebhookEvent":{"type":"object","properties":{"type":{"type":"string","enum":["post.created","post.scheduled","post.published","post.failed","post.deleted","queue.updated","channel.connected","channel.disconnected","channel.reconnect_required"]},"timestamp":{"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))$","example":"2026-11-02T09:30:00.000Z"},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Ids of what changed (`post_id`, `channel_id`, `comment_id`, …). Fetch the object from the API for its current state.","example":{"post_id":"V1StGXR8_Z5jdHi6B-myT","status":"published"}}},"required":["type","timestamp","data"],"additionalProperties":false}}}}}},"responses":{"200":{"description":"Any 2xx acknowledges the event."}}}}},"paths":{"/channels":{"get":{"operationId":"listChannels","tags":["Channels"],"summary":"List channels","description":"Requires the `channel:read` scope.","x-required-scope":"channel:read","responses":{"200":{"description":"Every connected channel, including ones that need reconnecting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelList"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/channels/{id}/schedule":{"get":{"operationId":"getPostingSchedule","tags":["Queue"],"summary":"Get a channel's posting schedule","description":"Requires the `post:read` scope.","x-required-scope":"post:read","responses":{"200":{"description":"The weekly queue slots.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingSchedule"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"put":{"operationId":"setPostingSchedule","tags":["Queue"],"summary":"Replace a channel's posting schedule","description":"Queued posts re-flow into the new slots; any that no longer fit keep their time as fixed-time posts, counted in `stranded_posts`.\n\nRequires the `post:update` scope.","x-required-scope":"post:update","responses":{"200":{"description":"The new schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingScheduleUpdated"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingScheduleInput"}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/posts":{"get":{"operationId":"listPosts","tags":["Posts"],"summary":"List posts","description":"Newest first. Archived posts appear only with `status=archived`.\n\nRequires the `post:read` scope.","x-required-scope":"post:read","responses":{"200":{"description":"A page of posts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostList"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"in":"query","name":"cursor","schema":{"type":"string"},"description":"`next_cursor` from the previous page."},{"in":"query","name":"limit","schema":{"default":30,"type":"integer","minimum":1,"maximum":100}},{"in":"query","name":"status","schema":{"type":"string","enum":["draft","scheduled","pending_approval","approved","revision_requested","rejected","queued","publishing","published","failed","cancelled","archived","partially_published"]}},{"in":"query","name":"channel_id","schema":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"}}]},"post":{"operationId":"createPost","tags":["Posts"],"summary":"Create a draft","description":"Then schedule it for a time, or add it to the queue.\n\nRequires the `post:create` scope.","x-required-scope":"post:create","responses":{"201":{"description":"The draft.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePost"}}}}}},"/posts/{id}":{"get":{"operationId":"getPost","tags":["Posts"],"summary":"Get a post","description":"Requires the `post:read` scope.","x-required-scope":"post:read","responses":{"200":{"description":"The post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"patch":{"operationId":"updatePost","tags":["Posts"],"summary":"Edit a post","description":"Only the fields you send change. `thread` and `channel_ids` replace the whole list.\n\nRequires the `post:update` scope.","x-required-scope":"post:update","responses":{"200":{"description":"The post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePost"}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]},"delete":{"operationId":"deletePost","tags":["Posts"],"summary":"Delete a post","description":"Archives it; it stops publishing and drops out of lists.\n\nRequires the `post:delete` scope.","x-required-scope":"post:delete","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/posts/{id}/schedule":{"post":{"operationId":"schedulePost","tags":["Posts"],"summary":"Schedule for a time","description":"Requires the `post:publish` scope.","x-required-scope":"post:publish","responses":{"200":{"description":"The scheduled post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePost"}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/posts/{id}/queue":{"post":{"operationId":"queuePost","tags":["Posts"],"summary":"Add to the queue","description":"Takes the next slot free on every one of the post's channels.\n\nRequires the `post:publish` scope.","x-required-scope":"post:publish","responses":{"200":{"description":"The queued post with its slot in `scheduled_at`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueuePost"}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/posts/{id}/unschedule":{"post":{"operationId":"unschedulePost","tags":["Posts"],"summary":"Move back to drafts","description":"Requires the `post:update` scope.","x-required-scope":"post:update","responses":{"200":{"description":"The draft.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/queue":{"get":{"operationId":"getQueue","tags":["Queue"],"summary":"Get a channel's queue","description":"Posts in time order with the free slots between them, two weeks ahead.\n\nRequires the `post:read` scope.","x-required-scope":"post:read","responses":{"200":{"description":"The queue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Queue"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"in":"query","name":"channel_id","schema":{"type":"string","example":"V1StGXR8_Z5jdHi6B-myT"},"required":true}]}},"/media":{"post":{"operationId":"uploadMedia","tags":["Media"],"summary":"Upload media","description":"Send the file as multipart `file`, or JSON `{ \"url\" }` to fetch it from a public https URL. Up to 100 MB; pass the returned id in a post's `media_ids`.\n\nRequires the `media:upload` scope.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MediaUpload"}},"application/json":{"schema":{"$ref":"#/components/schemas/MediaFromUrl"}}}},"x-required-scope":"media:upload","responses":{"201":{"description":"The stored file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/analytics/posts/{id}":{"get":{"operationId":"getPostAnalytics","tags":["Analytics"],"summary":"Get a post's metrics","description":"Requires the `analytics:read` scope.","x-required-scope":"analytics:read","responses":{"200":{"description":"Latest numbers per channel and in total.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostAnalytics"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}},"/webhooks":{"get":{"operationId":"listWebhookEndpoints","tags":["Webhooks"],"summary":"List webhook endpoints","description":"Requires the `webhook:manage` scope.","x-required-scope":"webhook:manage","responses":{"200":{"description":"Every endpoint in the workspace, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointList"}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createWebhookEndpoint","tags":["Webhooks"],"summary":"Subscribe a URL to events","description":"The URL must be public HTTPS. Leave `event_types` out to receive every event.\n\nRequires the `webhook:manage` scope.","x-required-scope":"webhook:manage","responses":{"201":{"description":"The endpoint and its signing secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreated"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"array","items":{}},"data":{}},"required":["success","error","data"]}}}},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointInput"}}}}}},"/webhooks/{id}":{"delete":{"operationId":"deleteWebhookEndpoint","tags":["Webhooks"],"summary":"Delete a webhook endpoint","description":"Deliveries still pending for it are dropped.\n\nRequires the `webhook:manage` scope.","x-required-scope":"webhook:manage","responses":{"204":{"description":"Deleted."},"401":{"description":"Missing, invalid, expired or revoked API key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key lacks the scope this needs.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Not found in this workspace.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The request isn't valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited; see `Retry-After`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}]}}}}