Create and schedule a social media post
Create a post to be published across one or more social media platforms. Supports text, images, and video (1 video per post). The image count per post is platform-specific: Twitter/X, Bluesky, and Mastodon allow up to 4; Instagram, LinkedIn, Facebook, and Telegram allow up to 10; Threads allows up to 20. There is no separate "carousel" field — a carousel is formed implicitly by attaching multiple images to one postGroupId (Instagram: 2-10 images = carousel, 1 image = single photo), in upload order. See the Media Uploads guide for the full matrix. If scheduledTime is provided, the post will be published at that time. If omitted, the post is saved as a draft.
Headers
Managed user ID (workspace only)
Opt-in idempotency. Omit the header for the previous behaviour — every call creates a new post.
Send a unique value (a UUID is a good choice) per logical operation to make retries safe:
- Same key + identical body, original request finished → the original status code and response body are replayed. No second post.
- Same key + identical body, original request still in flight → 409 (IDEMPOTENCY_IN_FLIGHT). Retry shortly.
- Same key + different body → 422 (IDEMPOTENCY_KEY_CONFLICT). Nothing is created.
Keys are scoped to the acting user (the managed user when x-publora-user-id is set), so they never collide across accounts. Records expire 24 hours after they are created; reusing a key after that window is treated as a brand-new request.
Request body
Example request
{
"content": "Excited to share our new product launch! 🚀 #launch",
"platforms": [
"twitter-123456789",
"linkedin-ABC123"
],
"scheduledTime": "2027-03-01T14:00:00.000Z",
"platformSettings": {
"instagram": {
"coverUrl": "https://cdn.example.com/covers/reel-cover.jpg",
"cover_url": "https://cdn.example.com/covers/reel-cover.jpg"
},
"youtube": {
"playlist": {
"id": "PLxxxxxxxx",
"platformId": "youtube-UCxxxxxxxx"
},
"thumbnail": {
"mediaId": "665f...",
"url": "https://media.publora.com/..."
}
},
"twitter": {
"replyTo": "https://x.com/customer/status/1234567890123456789",
"quoteTweet": "987654321098765432"
}
}
}Response
Post created
Example response
{
"success": true,
"postGroupId": "507f1f77bcf86cd799439011",
"scheduledTime": "2026-03-01T14:00:00.000Z",
"warnings": [
{
"code": "SCHEDULED_TIME_COERCED",
"message": "Requested scheduled time 2026-03-01T14:00:00.000Z was in the past and was changed to server time 2026-03-01T14:02:11.412Z.",
"requested": "2026-03-01T14:00:00.000Z",
"effective": "2026-03-01T14:02:11.412Z",
"mediaFileId": "507f1f77bcf86cd799439012",
"mediaStatus": "uploading",
"pendingCode": "MEDIA_VALIDATION_PENDING",
"attempts": 3
}
]
}Changes
No recorded changes to this endpoint across all 1 revision of this API.