Posts

Publish an existing draft now

Its own verb because it is irreversible and carries its own idempotency key (`Idempotency-Key` header). Fans out to every channel immediately; the response's channel entries carry the per-destination results as the worker fills them in — poll `GET /posts/{id}` for the outcome. A post that is not `ready` is refused with the post itself under `error.post`. Guard against publishing someone else's concurrent edit with `expected_updated_at` (or the `If-Match` header holding the `ETag` your read returned) — a post that moved since is refused 409.

POST/posts/{id}/publish

Its own verb because it is irreversible and carries its own idempotency key (Idempotency-Key header). Fans out to every channel immediately; the response's channel entries carry the per-destination results as the worker fills them in — poll GET /posts/{id} for the outcome. A post that is not ready is refused with the post itself under error.post. Guard against publishing someone else's concurrent edit with expected_updated_at (or the If-Match header holding the ETag your read returned) — a post that moved since is refused 409.

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

id*string

Query Parameters

organization?string

Organization slug (OAuth actors with several orgs); API keys imply theirs.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://example.com/posts/string/publish" \  -H "Content-Type: application/json" \  -d '{    "expected_updated_at": "2026-07-21T09:00:00-07:00"  }'
{  "id": "string",  "status": "draft",  "scheduled_at": "string",  "ready": true,  "content": {    "markdown": "string",    "text": "string"  },  "channels": [    {      "channel_id": "string",      "provider": "string",      "name": "string",      "format": "post",      "ready": true,      "source": "adapted",      "content": {        "markdown": "string",        "text": "string",        "length": 0,        "limit": 0      },      "errors": [        {          "code": "string",          "field": "content",          "message": "string",          "fixes": [            {              "kind": "trim_to_fold",              "label": "string",              "max_length": 0            }          ]        }      ],      "warnings": [        {          "code": "string",          "message": "string",          "detail": {            "property1": null,            "property2": null          }        }      ],      "options": {        "property1": null,        "property2": null      },      "ink_estimate": 0,      "status": "draft",      "external_post_id": "string",      "url": "string",      "error": "string",      "published_at": "string"    }  ],  "media": [    {      "id": "string",      "ready": true,      "failed": true,      "alt_text": "string",      "source_url": "string"    }  ],  "labels": [    {      "id": "string",      "name": "string"    }  ],  "campaign": "string",  "approval": {    "required": true,    "state": "not_requested"  },  "fixes_applied": [    {      "channel_id": "string",      "provider": "string",      "kind": "string"    }  ],  "ink_estimate": 0,  "created_at": "string",  "updated_at": "string",  "published_at": "string"}