Posts
Create, schedule, update, cancel
The posts endpoints are the core of the API. Everything you can do in the composer — schedule, publish now, save a draft, cancel, duplicate — maps to an HTTP call here.
The Post object
{
"data": {
"id": "3a6f1e9e-4c2b-4a1d-9e3a-112233445566",
"status": "scheduled",
"content": "Hello world",
"scheduled_at": "2026-05-01T14:00:00Z",
"published_at": null,
"tags": ["launch"],
"post_targets": [
{ "status": "pending", "platform_post_url": null, "integrations": { "platform": "twitter" } },
{ "status": "pending", "platform_post_url": null, "integrations": { "platform": "bluesky" } }
],
"created_at": "2026-04-16T10:22:14Z"
}
}
| Field | Type | Description |
|---|---|---|
| id | uuid | Stable OpenPost post ID. |
| status | enum | draft, scheduled, publishing, published, failed. |
| content | string | The base post copy. Per-platform overrides live in platform_overrides at create time. |
| scheduled_at | ISO 8601 | null | When to publish. Null means draft. |
| published_at | ISO 8601 | null | Populated once publishing completes. |
| tags | string[] | Internal tags — not published to the platform. |
| post_targets | object[] | Per-platform status: { status, platform_post_url, integrations: { platform } }. |
List posts
/v1/postsauth: Bearer tokenList posts for the workspace. Filter by status.
| Field | Type | Description |
|---|---|---|
| status | string | Filter by a single status (e.g. scheduled, published). |
| limit | int | Page size. Default 20. |
Create a post
/v1/postsauth: Bearer tokenCreate a draft or schedule a post. Omit schedule_at to save a draft.
curl -X POST https://api.openpost.so/v1/posts \
-H "Authorization: Bearer $OP_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Big launch today",
"platforms": ["twitter", "bluesky"],
"schedule_at": "2026-05-01T14:00:00Z",
"tags": ["launch"]
}'
| Field | Type | Description |
|---|---|---|
| content* | string | Base post copy. Override per-platform with platform_overrides. |
| platforms* | string[] | Platform names of connected accounts (e.g. twitter, bluesky). Must match integrations already connected in the workspace. |
| schedule_at | ISO 8601 | When to publish. Omit for draft. Maximum 180 days in the future. |
| tags | string[] | Internal tags — not published to the platform. |
| platform_overrides | object | { [platform]: string } — replace content per platform. |
| platform_settings | object | { [platform]: { ... } } — per-platform options. See per-platform fields below. |
| group_id | uuid | Group a thread/campaign together so GET /v1/posts/group/{id} returns them all. |
| status | enum | Override derived status. Usually left unset. |
Get a single post
/v1/posts/{id}auth: Bearer tokenCurrent state of a post including per-platform publish status on each target.
Update a post
/v1/posts/{id}auth: Bearer tokenOnly editable while the post is draft or scheduled. Published posts reject the update with 400.
Pass any of content, scheduled_at, tags, or status. Only provided fields are updated.
Publish now
/v1/posts/{id}/publishauth: Bearer tokenForces a draft or scheduled post to publish immediately. The cron picks it up within 60 seconds.
curl -X POST https://api.openpost.so/v1/posts/{id}/publish \
-H "Authorization: Bearer $OP_KEY"
Delete a post
/v1/posts/{id}auth: Bearer tokenDeletes a draft or cancels a scheduled post. Published posts are also removed from the workspace (the native platform post is not rolled back).
List posts in a group
/v1/posts/group/{group_id}auth: Bearer tokenList every post that shares a group_id (threads, campaign bulk drafts).
Delete a group
/v1/posts/group/{group_id}auth: Bearer tokenDelete every post in the group.
Per-platform fields
Each platform accepts a different set of optional fields inside platform_settings. Keys are platform names (e.g. twitter, youtube). Fields not listed here are ignored.
X (Twitter)
| Field | Type | Description |
|---|---|---|
| who_can_reply | enum | everyone | following | mentionedUsers | subscribers | verified. |
Instagram (coming soon)
| Field | Type | Description |
|---|---|---|
| post_type | enum | post | story | reel. |
| collaborators | string[] | IG usernames to invite as collaborators. |
YouTube (coming soon)
| Field | Type | Description |
|---|---|---|
| title | string | Video title. Required for YouTube uploads. |
| privacy | enum | public | private | unlisted. |
| made_for_kids | boolean | COPPA flag. |
| youtube_tags | string[] | YouTube discovery tags. |
| thumbnail_url | string | Custom thumbnail URL. JPEG/PNG, up to 2 MB. |
TikTok (coming soon)
| Field | Type | Description |
|---|---|---|
| tiktok_title | string | Overrides the derived title for TikTok. |
| privacy_level | enum | PUBLIC_TO_EVERYONE | MUTUAL_FOLLOW_FRIENDS | SELF_ONLY. |
| allow_duet | boolean | Allow duets on this post when true. |
| allow_stitch | boolean | Allow stitches on this post when true. |
| allow_comment | boolean | Allow comments on this post when true. |
Bluesky
No Bluesky-specific platform_settings fields are wired up today.
{
"content": "Big launch today",
"platforms": ["twitter", "bluesky"],
"platform_overrides": {
"bluesky": "Big launch today on Bluesky too!"
},
"platform_settings": {
"twitter": { "who_can_reply": "following" }
}
}