{"openapi":"3.0.0","paths":{"/public/v1/upload-link":{"post":{"description":"Mints a link the account holder can open in any browser, signed out, to drop images or videos straight into this workspace media library. Valid for two hours, takes several files. Read back what arrived with GET /upload-link/{id} and attach each file path to a post.","operationId":"createUploadLink","parameters":[],"responses":{"201":{"description":"A browser upload link for this workspace. Hand `url` to the person; read back what they dropped with GET /upload-link/{id}.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The link id, for GET /upload-link/{id}."},"url":{"type":"string","format":"uri","description":"The page to open. Works signed out."},"expiresAt":{"type":"string","format":"date-time"}},"required":["id","url","expiresAt"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Create a browser upload link","tags":["Public API"]}},"/public/v1/upload-link/{id}":{"get":{"description":"The media items that arrived through an upload link so far, oldest first, with the hosted path to attach to a post. `status` is \"empty\" until the first file lands. Scoped to the caller workspace: an id from another workspace finds nothing.","operationId":"getUploadLinkFiles","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"What has arrived through the link so far, oldest first. Attach each `path` to a post. `status` is \"empty\" until the first file lands.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["empty","ready"]},"count":{"type":"integer"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"The name the person gave the file."},"path":{"type":"string","format":"uri","description":"The hosted URL. This is the post attachment."},"type":{"type":"string","description":"\"image\" or \"video\"."}},"required":["id","name","path","type"]}}},"required":["id","status","count","files"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"List the files uploaded through a link","tags":["Public API"]}},"/public/v1/upload":{"post":{"description":"Uploads an image or video (up to 1 GB) into the workspace media library and returns its id and hosted path. Identical bytes are deduplicated server-side, so re-uploading the same asset reuses one row.","operationId":"uploadMedia","parameters":[],"responses":{"201":{"description":"The stored media item. Attach `path` to a post.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","description":"The stored file name."},"originalName":{"type":"string","nullable":true,"description":"The name the file was uploaded under, when one was sent."},"path":{"type":"string","description":"The hosted URL. THIS is what a post attachment takes, not the id.","example":"https://media.posty.hu/iRIB4vSHa0.jpg"},"thumbnail":{"type":"string","nullable":true},"alt":{"type":"string","nullable":true}},"required":["id","name","path"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Upload a media file","tags":["Public API"]}},"/public/v1/upload-from-url":{"post":{"description":"Fetches a public http(s) URL and stores it in the media library, returning the same shape as /upload. The fetch is SSRF-guarded: private and link-local addresses are refused.","operationId":"uploadMediaFromUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadDto"}}}},"responses":{"201":{"description":"The stored media item. Attach `path` to a post.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","description":"The stored file name."},"originalName":{"type":"string","nullable":true,"description":"The name the file was uploaded under, when one was sent."},"path":{"type":"string","description":"The hosted URL. THIS is what a post attachment takes, not the id.","example":"https://media.posty.hu/iRIB4vSHa0.jpg"},"thumbnail":{"type":"string","nullable":true},"alt":{"type":"string","nullable":true}},"required":["id","name","path"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Import media from a public URL","tags":["Public API"]}},"/public/v1/find-slot/{id}":{"get":{"description":"Returns the next publication time that fits the workspace posting schedule, optionally for one channel.","operationId":"findNextSlot","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The next free publication time, in UTC.","content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date-time"}},"required":["date"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Find the next free posting slot","tags":["Public API"]}},"/public/v1/posts":{"get":{"description":"Returns the posts in the requested window with their state, channel and publication time. This is the read half of the calendar.","operationId":"listPosts","parameters":[],"responses":{"200":{"description":"The posts whose publication time falls in the requested window. A key scoped to particular channels sees only those.","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"content":{"type":"string","description":"The post body, as HTML."},"publishDate":{"type":"string","format":"date-time","description":"When it publishes, in UTC."},"state":{"type":"string","enum":["QUEUE","PUBLISHED","ERROR","DRAFT"],"description":"QUEUE is scheduled and waiting; ERROR failed and will not retry itself."},"releaseURL":{"type":"string","nullable":true,"description":"The platform URL, once it has published."},"group":{"type":"string","description":"One editor session posting to several channels shares one group. Deleting by group removes all of them."}},"required":["id","publishDate","state"]}}},"required":["posts"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"List posts in a date range","tags":["Public API"]},"post":{"description":"Creates a draft, schedules a post, or publishes immediately, on one or more channels. Sending an existing group id updates that post in place instead of creating a second one.","operationId":"createPost","parameters":[],"responses":{"201":{"description":"One entry per channel written. `postId` is what delete and status changes take. An empty array means nothing was created, which a caller should treat as a failure to investigate rather than a success.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"postId":{"type":"string"},"integration":{"type":"string","description":"The channel this row was written for."}},"required":["postId","integration"]}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Create or update a post","tags":["Public API"]}},"/public/v1/posts/{id}":{"delete":{"description":"Removes a single post and terminates its pending publication workflow. A post that already published on the platform cannot be removed from the platform by deleting it here.","operationId":"deletePost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted. The body is `{ \"error\": true }` for historical reasons and carries no meaning: the status code is the result. A published post cannot be removed from the platform this way.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Delete one post","tags":["Public API"]}},"/public/v1/posts/group/{group}":{"delete":{"description":"Deletes the whole group: one editor session that went to several channels is one post in Posty, and this removes all of its rows at once.","operationId":"deletePostGroup","parameters":[{"name":"group","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted, across every channel of the group. The body is `{ \"error\": true }` and carries no meaning; the status code is the result.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Delete a post across every channel","tags":["Public API"]}},"/public/v1/is-connected":{"get":{"description":"Answers 200 when the presented key or token resolves to a workspace. The cheapest call for a client to verify its configuration at startup.","operationId":"isConnected","parameters":[],"responses":{"200":{"description":"The credential resolves to a workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"connected":{"type":"boolean","enum":[true]}},"required":["connected"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Check the credential","tags":["Public API"]}},"/public/v1/groups":{"get":{"description":"Returns the workspace customer groups, which are the buckets channels can be filed under.","operationId":"listGroups","parameters":[],"responses":{"200":{"description":"The workspace customer groups.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"List customer groups","tags":["Public API"]}},"/public/v1/integrations":{"get":{"description":"Returns every connected channel with its id, name, @handle, platform and whether it is disabled or needs reconnecting. Channel ids from here are what every other route takes.","operationId":"listChannels","parameters":[{"name":"group","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Every connected channel. Skip the ones whose `disabled` is true: they cannot publish.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The channel id every other route takes."},"name":{"type":"string","description":"The account name as the user knows it."},"identifier":{"type":"string","description":"The platform: facebook, instagram, youtube, x, linkedin, …","example":"youtube"},"picture":{"type":"string","nullable":true},"disabled":{"type":"boolean","description":"A disabled channel cannot publish until it is switched on."},"profile":{"type":"string","nullable":true,"description":"The @handle. Quote it back to a user: it is what separates two same-named accounts."},"customer":{"type":"object","nullable":true,"description":"The customer group this channel is filed under, when any.","properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"required":["id","name","identifier"]}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"List connected channels","tags":["Public API"]}},"/public/v1/social/{integration}":{"get":{"description":"Returns the provider authorization URL a human must open to connect or refresh a channel. The consent step cannot be completed by an API client.","operationId":"startChannelConnect","parameters":[{"name":"integration","required":true,"in":"path","schema":{"type":"string"}},{"name":"refresh","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The provider authorization URL a human must open. An API client cannot complete the consent step itself.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Begin connecting a channel","tags":["Public API"]}},"/public/v1/notifications":{"get":{"description":"Returns the workspace notification feed, most recent first, paginated.","operationId":"listNotifications","parameters":[],"responses":{"200":{"description":"One page of the workspace notification feed.","content":{"application/json":{"schema":{"type":"object","properties":{"notifications":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}},"count":{"type":"integer"}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"List workspace notifications","tags":["Public API"]}},"/public/v1/integration-settings/{id}":{"get":{"description":"Returns the validation rules, the character limit resolved for that specific account, and the settings schema a post to this channel must satisfy.","operationId":"getChannelSettings","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The rules a post to this channel must satisfy. `settings` is a JSON Schema whose shape differs per provider, which is why it is not described further here.","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"type":"object","properties":{"rules":{"type":"string","description":"Human-readable constraints, e.g. \"YouTube must have one video attachment\"."},"maxLength":{"type":"integer","description":"The character limit resolved for THIS account, not for the platform in general."},"settings":{"type":"object","additionalProperties":true,"description":"JSON Schema for the per-channel settings object."},"tools":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Get one channel settings schema","tags":["Public API"]}},"/public/v1/posts/{id}/missing":{"get":{"description":"Returns the settings and content a post is still missing before it can publish, without attempting to publish it.","operationId":"getPostMissingContent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"What the post still needs before it can publish. Shape follows the channel, so it is not narrowed here.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Report what a post still needs","tags":["Public API"]}},"/public/v1/posts/{id}/status":{"put":{"description":"Flips one post between DRAFT and QUEUE, starting or terminating its publication workflow to match.","operationId":"changePostStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePostStatusDto"}}}},"responses":{"200":{"description":"The post after the change.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"content":{"type":"string","description":"The post body, as HTML."},"publishDate":{"type":"string","format":"date-time","description":"When it publishes, in UTC."},"state":{"type":"string","enum":["QUEUE","PUBLISHED","ERROR","DRAFT"],"description":"QUEUE is scheduled and waiting; ERROR failed and will not retry itself."},"releaseURL":{"type":"string","nullable":true,"description":"The platform URL, once it has published."},"group":{"type":"string","description":"One editor session posting to several channels shares one group. Deleting by group removes all of them."}},"required":["id","publishDate","state"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Move a post between draft and scheduled","tags":["Public API"]}},"/public/v1/posts/{id}/release-id":{"put":{"description":"Stores the platform post id and URL for a post published outside Posty, so the calendar and analytics can find it.","operationId":"updateReleaseId","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The post after the platform id and URL were recorded.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"content":{"type":"string","description":"The post body, as HTML."},"publishDate":{"type":"string","format":"date-time","description":"When it publishes, in UTC."},"state":{"type":"string","enum":["QUEUE","PUBLISHED","ERROR","DRAFT"],"description":"QUEUE is scheduled and waiting; ERROR failed and will not retry itself."},"releaseURL":{"type":"string","nullable":true,"description":"The platform URL, once it has published."},"group":{"type":"string","description":"One editor session posting to several channels shares one group. Deleting by group removes all of them."}},"required":["id","publishDate","state"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Record the platform release id","tags":["Public API"]}},"/public/v1/analytics/{integration}":{"get":{"description":"Returns the metrics the platform exposes for one connected channel over the requested period. Availability differs per platform.","operationId":"getChannelAnalytics","parameters":[{"name":"integration","required":true,"in":"path","schema":{"type":"string"}},{"name":"date","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The metrics this platform exposes. Every platform reports a different set, so the entries are named but not enumerated: read `label` and `data` rather than expecting a fixed key.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"percentageChange":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"total":{"type":"string"},"date":{"type":"string"}}}}}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Read channel analytics","tags":["Public API"]}},"/public/v1/analytics/post/{postId}":{"get":{"description":"Returns the platform metrics for a single published post.","operationId":"getPostAnalytics","parameters":[{"name":"postId","required":true,"in":"path","schema":{"type":"string"}},{"name":"date","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The platform metrics for one published post. Same per-platform variation as the channel analytics above.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Read one post analytics","tags":["Public API"]}},"/public/v1/integration-trigger/{id}":{"post":{"description":"Invokes a provider-specific helper on a connected channel, for example listing the boards, subreddits or pages a post can target.","operationId":"triggerChannelTool","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Whatever the provider tool returns — a board list, a subreddit list, a page list. The shape belongs to the provider, so it is carried through untouched under `output`.","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"additionalProperties":true,"type":"object"}}}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Call a channel-specific tool","tags":["Public API"]}},"/public/v1/status":{"get":{"description":"Returns the API version, the current server time, and absolute URLs for every machine-readable document Posty publishes: the OpenAPI spec, the OAuth metadata, the MCP endpoint and the developer documentation. It also states the scopes that exist and how a human obtains a key. This is the only route that answers without a credential, and it reads no workspace data.","operationId":"getStatus","parameters":[],"responses":{"200":{"description":"The API version, the server clock, and where every machine-readable document lives.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"status":{"type":"string","enum":["ok"]},"version":{"type":"string","example":"v1"},"time":{"type":"string","format":"date-time"},"documentation":{"type":"object","additionalProperties":true},"authentication":{"type":"object","additionalProperties":true},"mcp":{"type":"object","additionalProperties":true},"scopes":{"type":"object","additionalProperties":true},"rateLimits":{"type":"object","additionalProperties":true},"versioning":{"type":"object","additionalProperties":true}},"required":["name","status","version","time"]}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}}},"400":{"description":"The request body or a parameter did not validate. Permanent: fix the request, do not retry unchanged.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Missing, malformed, expired or unknown credential, or the workspace plan does not include API access. Permanent until the credential changes.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Authenticated, but this key lacks the scope or the channel this route needs. The body names the missing scope and the key owner's role.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No such object in this workspace. Also returned for an object that exists in another workspace, deliberately: an id is not a way to probe for it.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Retryable: wait for the number of seconds in `Retry-After`, or until the instant in `RateLimit-Reset`.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Unexpected failure on our side. Retryable with backoff.","headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window for this route.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window. Self-throttle on this.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets. A delta, not a timestamp.","schema":{"type":"integer"}},"RateLimit-Policy":{"description":"The quota and window, e.g. `60;w=3600`.","schema":{"type":"string"}},"Link":{"description":"RFC 8594 `rel=\"sunset\"` pointer to the deprecation policy. Present on every response; a `Sunset` header appears beside it only once a route is actually being retired.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"summary":"Service status and API discovery (no credential required)","tags":["Public API"]}}},"info":{"title":"Posty API","description":"REST API for Posty (posty.hu), the Hungarian social media scheduler: schedule, preview, publish and delete posts across connected channels, upload media, and read analytics.\n\n## Authentication\nSend a per-workspace API key as the whole Authorization header (`Authorization: psty_...`), or an OAuth 2.1 + PKCE access token (`Authorization: Bearer pos_...`) minted for the resource `https://api.posty.hu/public/v1`. Keys are self-serve: sign up at https://posty.hu/regisztracio, then Settings, Developers. No sales contact and no waiting list.\n\n## Versioning\nThe version is in the path: every route lives under `/public/v1`. A breaking change ships as `/public/v2`; `/public/v1` keeps its contract. Additive changes (a new optional field, a new route, a new enum value) ship inside v1, so a client must ignore fields it does not know.\n\n## Deprecation\nA route that is going away answers with `Deprecation: true` and a `Sunset` header carrying the RFC 9110 date after which it stops working, alongside a `Link` header with `rel=\"deprecation\"` pointing at the notes. A sunset date is never less than 180 days from the first `Deprecation` header on that route. Nothing is deprecated today.\n\n## Rate limits\nEvery response carries the IETF RateLimit headers (draft-ietf-httpapi-ratelimit-headers) `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` and `RateLimit-Policy` for the route you called. Each route has its own bucket, keyed to the API key. A 429 adds `Retry-After` in seconds. Self-throttle on `RateLimit-Remaining` rather than waiting for the 429.\n\n## Errors\nEvery failure answers with the `ApiError` schema. See the response descriptions on any operation for what each status means and whether retrying can help.","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://api.posty.hu","description":"Posty production API"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"Authorization","description":"A Posty API key, sent as the whole header value: `Authorization: psty_...`. Keys are minted per workspace and carry scopes."},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://posty.hu/oauth/authorize","tokenUrl":"https://api.posty.hu/oauth/token","scopes":{"posts:read":"Read scheduled and published posts.","posts:draft":"Create and edit drafts. Cannot publish or schedule.","posts:publish":"Schedule and publish posts.","channels:read":"List connected channels and their settings.","channels:write":"Connect, edit and disconnect channels.","media:write":"Upload media.","analytics:read":"Read analytics.","mcp:read":"MCP endpoint only: read tools (list channels, preview, list posts). Not used by any REST route.","mcp:write":"MCP endpoint only: write tools (create and delete posts, upload media). Not used by any REST route."}}},"description":"OAuth 2.1 authorization code with PKCE (S256). Request the resource `https://api.posty.hu/public/v1` so the token is accepted here."}},"schemas":{"UploadDto":{"type":"object","properties":{}},"ChangePostStatusDto":{"type":"object","properties":{}},"ApiError":{"type":"object","additionalProperties":true,"properties":{"msg":{"type":"string","description":"Human-readable failure. Present on every error raised by Posty itself (auth, scopes, quota, validation of a post body).","example":"This API key is missing the required permission: posts:publish"},"statusCode":{"type":"integer","description":"Present only on framework-level request-validation failures, where it repeats the HTTP status.","example":400},"message":{"type":"array","items":{"type":"string"},"description":"Present only on framework-level request-validation failures: one entry per field that failed.","example":["type must be one of the following values: draft, schedule, now"]},"error":{"type":"string","description":"Present only on framework-level failures: the status name.","example":"Bad Request"},"required":{"type":"array","items":{"type":"string"},"description":"On a 403 from the scope guard: the scopes the route needs.","example":["posts:publish"]},"granted":{"type":"array","items":{"type":"string"},"description":"On a 403 from the scope guard: the scopes this key actually holds.","example":["posts:read","posts:draft"]},"role":{"type":"string","description":"On a 403 from the scope guard: the key owner's current role in the workspace, which is the usual cause.","example":"VIEWER"}}}}},"externalDocs":{"description":"Developer documentation","url":"https://posty.hu/fejlesztok"}}