curl --request POST \
--url https://api.openpmm.com/v1/workspaces/{workspace_id}/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"confirmed": true,
"when": "now",
"group": "launch-2026-08",
"posts": [
{
"destination_id": "dest_x_01JABCDEF",
"body": [
"First post in the thread",
"Second post"
],
"media": [
"ast_01JABCDEF"
]
},
{
"destination_id": "dest_linkedin_01JABCDEF",
"body": [
"The LinkedIn version, written differently."
],
"media": [
"ast_01JABCDEF"
],
"destination_options": {
"linkedin": {
"visibility": "public",
"allow_resharing": true
}
}
}
]
}
'{
"object": "post_set",
"group": "launch-2026-08",
"posts": [
{
"id": "send_01JABCDEF",
"object": "post",
"group": "launch-2026-08",
"channel": "x",
"state": "draft",
"editable": true,
"terminal": true,
"action_required": true,
"next_action_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"available_actions": [
"update"
],
"version": 2,
"payload": {
"headline": "<string>",
"body": [
"<string>"
],
"destination_options": {
"bluesky": {
"languages": [
"<string>"
],
"content_labels": [
"porn"
],
"alt_text_by_asset_id": {}
}
}
},
"asset_ids": [
"ast_01JABCDEF"
],
"destination_id": "dest_01JABCDEF",
"scheduled_at": "2026-08-09T12:00:00.000Z",
"time_zone": "Europe/Berlin",
"schedule_mode": "now",
"queue_local_date": "2023-12-25",
"queue_window_id": "<string>",
"attempt_count": 1,
"deferred": {
"reason": "publishing_velocity",
"until": "2026-08-09T12:00:00.000Z"
},
"last_error": {
"code": "provider_rejected",
"message": "The provider rejected the post.",
"retryable": true,
"retry_safety": "safe",
"user_action": "retry"
},
"created_at": "2026-08-09T12:00:00.000Z",
"updated_at": "2026-08-09T12:00:00.000Z",
"published_at": "2026-08-09T12:00:00.000Z",
"cancelled_at": "2026-08-09T12:00:00.000Z",
"missed_at": "2026-08-09T12:00:00.000Z",
"receipts": [
{
"id": "rcpt_01JABCDEF",
"object": "receipt",
"item_index": 0,
"provider_object_id": "1844029112345678901",
"url": "<string>",
"state": "published",
"published_at": "2026-08-09T12:00:00.000Z"
}
],
"destination": {
"display_name": "<string>",
"external_id": "<string>",
"profile_image_url": "<string>"
},
"assets": [
{
"id": "ast_01JABCDEF",
"type": "card",
"label": "<string>",
"content_type": "<string>",
"item_index": 1
}
],
"attempts": [
{
"id": "att_01JABCDEF",
"object": "publishing_attempt",
"number": 2,
"trigger": "initial",
"status": "started",
"started_at": "2026-08-09T12:00:00.000Z",
"finished_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"user_action": "retry"
},
"provider": {
"operation": "<string>",
"request_id": "<string>",
"status_code": 349,
"error_code": "<string>",
"subcode": "<string>"
}
}
]
}
]
}Create Post
Create one or more Posts. Set when to publish now, schedule, or save drafts. X, Bluesky, Mastodon, and Threads publish later body items as replies. Use media_items to attach Assets to a body item. A Bluesky body item accepts up to four images or one MP4 video. Bluesky images require alt text. A Facebook Post with a video uses the Reel placement automatically. Immediate publication returns before provider work completes. Active provider work returns 202 and Retry-After. Read the Post while terminal and action_required are both false. Do not send Create Post again. Publishing requires confirmed: true and a live credential. X Post bodies cannot contain URLs.
curl --request POST \
--url https://api.openpmm.com/v1/workspaces/{workspace_id}/posts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"confirmed": true,
"when": "now",
"group": "launch-2026-08",
"posts": [
{
"destination_id": "dest_x_01JABCDEF",
"body": [
"First post in the thread",
"Second post"
],
"media": [
"ast_01JABCDEF"
]
},
{
"destination_id": "dest_linkedin_01JABCDEF",
"body": [
"The LinkedIn version, written differently."
],
"media": [
"ast_01JABCDEF"
],
"destination_options": {
"linkedin": {
"visibility": "public",
"allow_resharing": true
}
}
}
]
}
'{
"object": "post_set",
"group": "launch-2026-08",
"posts": [
{
"id": "send_01JABCDEF",
"object": "post",
"group": "launch-2026-08",
"channel": "x",
"state": "draft",
"editable": true,
"terminal": true,
"action_required": true,
"next_action_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"available_actions": [
"update"
],
"version": 2,
"payload": {
"headline": "<string>",
"body": [
"<string>"
],
"destination_options": {
"bluesky": {
"languages": [
"<string>"
],
"content_labels": [
"porn"
],
"alt_text_by_asset_id": {}
}
}
},
"asset_ids": [
"ast_01JABCDEF"
],
"destination_id": "dest_01JABCDEF",
"scheduled_at": "2026-08-09T12:00:00.000Z",
"time_zone": "Europe/Berlin",
"schedule_mode": "now",
"queue_local_date": "2023-12-25",
"queue_window_id": "<string>",
"attempt_count": 1,
"deferred": {
"reason": "publishing_velocity",
"until": "2026-08-09T12:00:00.000Z"
},
"last_error": {
"code": "provider_rejected",
"message": "The provider rejected the post.",
"retryable": true,
"retry_safety": "safe",
"user_action": "retry"
},
"created_at": "2026-08-09T12:00:00.000Z",
"updated_at": "2026-08-09T12:00:00.000Z",
"published_at": "2026-08-09T12:00:00.000Z",
"cancelled_at": "2026-08-09T12:00:00.000Z",
"missed_at": "2026-08-09T12:00:00.000Z",
"receipts": [
{
"id": "rcpt_01JABCDEF",
"object": "receipt",
"item_index": 0,
"provider_object_id": "1844029112345678901",
"url": "<string>",
"state": "published",
"published_at": "2026-08-09T12:00:00.000Z"
}
],
"destination": {
"display_name": "<string>",
"external_id": "<string>",
"profile_image_url": "<string>"
},
"assets": [
{
"id": "ast_01JABCDEF",
"type": "card",
"label": "<string>",
"content_type": "<string>",
"item_index": 1
}
],
"attempts": [
{
"id": "att_01JABCDEF",
"object": "publishing_attempt",
"number": 2,
"trigger": "initial",
"status": "started",
"started_at": "2026-08-09T12:00:00.000Z",
"finished_at": "2026-08-09T12:00:00.000Z",
"retry_safety": "safe",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"user_action": "retry"
},
"provider": {
"operation": "<string>",
"request_id": "<string>",
"status_code": 349,
"error_code": "<string>",
"subcode": "<string>"
}
}
]
}
]
}Authorizations
Send an account API key in the Authorization: Bearer <key> header.
Headers
Optional request ID. OpenPMM returns this value when it is valid. Otherwise, OpenPMM creates a request ID.
128Required when you publish or schedule a post. Optional when you create a draft.
1 - 200Path Parameters
Unique workspace ID.
"ws_01JABCDEF"
Body
1 - 100 elements- Option 1
- Option 2
Show child attributes
Show child attributes
Set to true when you publish or schedule. Omit this field when you create a draft.
Use now to publish, draft to save a draft, queue to use the next posting window, or an ISO 8601 timestamp to schedule. A timestamp must include a UTC offset.
now, draft, queue IANA time zone for now or an exact schedule. Omit this field for queue; OpenPMM uses the Workspace time zone.
"Europe/Berlin"
A value that groups related posts.
1 - 200^[A-Za-z0-9_-]+$"launch-2026-08"
