Skip to main content
POST
Schedule a post for later or save it as a draft. Publishing runs through Unsora when the post is published from the scheduler. Posts can target any connected account on: YouTube, TikTok, Instagram, Facebook, LinkedIn, Bluesky, Threads, Pinterest (up to 10 accounts per post, mixed platforms allowed).

Supported content

Connect accounts in the Unsora app, then list them via Get accounts. Note: YouTube accepts video posts only; text-only posts work on Facebook, LinkedIn, Bluesky, and Threads.

Media requirements

Make sure media matches each platform’s rules before creating the post. Media that violates them fails at publish time: the post ends up FAILED (or PARTIALLY_PUBLISHED) with the platform’s error on the affected account — fix the media and create a new post, or use Retry post for accounts that failed for other reasons.
Instagram rejects feed/carousel images outside 4:5 – 1.91:1 (e.g. 9:16 images). When posting the same slideshow to Instagram and TikTok, use 4:5 images (both platforms accept them) — or create separate posts per platform.
Images should be JPEG — Instagram’s API only accepts JPEG, and TikTok photo posts accept JPEG/WebP. PNG images posted to TikTok are converted to JPEG automatically at publish time. Videos should be MP4/MOV (H.264 + AAC) at a publicly reachable URL.

Before you post

  1. Active paid plan + API key or Clerk JWT.
  2. Get accounts → copy each account id.
  3. Pick video or slideshow. For Instagram reels, optional cover_url.

Request body

string
required
Post caption. Legacy alias: mainCaption.
array
required
[{ "id": "<account-uuid>" }] — up to 10 accounts. Each account object also accepts optional title (YouTube video title / Pinterest pin title) and customCaption (overrides caption for that account only).
object | null
object
Optional publish options for Instagram, TikTok, YouTube, and Pinterest. You can also send instagram, tiktok, youtube, or pinterest at the top level of the body (same shape as below). Other keys under settings return 400.
string
ISO 8601 with timezone, ≥ 2 minutes ahead. Omit for draft.
string
Idempotency key (max 128 chars) or use Idempotency-Key header.

Instagram reel cover

Only cover_url — a public image URL:
TikTok reel cover frame: optional settings.tiktok.video_cover_timestamp_ms.

Platform settings (optional)

Supported providers: Instagram, TikTok, YouTube, Pinterest — via settings.<provider> (or the same keys at the top level of the body). Nothing is required; omit settings if you do not need them. YouTube video titles and Pinterest pin titles go on the account object (accounts[].title), not in settings.
Top-level tiktok / instagram / youtube / pinterest keys work the same as their settings.* equivalents.

Response

Examples

Post lifecycle

DRAFT → SCHEDULED → PUBLISHING → one of: For FAILED or PARTIALLY_PUBLISHED posts, call Retry post — it re-attempts only the failed accounts and never double-posts. Per-account results (including publishedUrl and error) are on each post’s postAccounts.

Errors

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

Idempotency-Key
string

Idempotency key, up to 128 characters. Used only with API keys. Longer keys are ignored.

Maximum string length: 128
X-Unsora-Client
string

The Unsora MCP server sends mcp, which records the post source as MCP. Any other value, or no header, records API.

Body

application/json
caption
string
required

Post text, used for every account that has no customCaption. Must not be empty. Alias: mainCaption.

accounts
object[]
required

Accounts to publish to. Platforms can be mixed. Every account must belong to the caller.

Required array length: 1 - 10 elements
media
object

Omit or send null for a text post. Send a video object, a slideshow object, or an array of media items.

type
enum<string>

Overrides the post type inferred from media. Inferred type: no media is TEXT; a video object is VIDEO; a slideshow object is CAROUSEL; an array is CAROUSEL when it has more than one item, VIDEO when its single item is a VIDEO, otherwise IMAGE.

Available options:
VIDEO,
IMAGE,
CAROUSEL,
TEXT
scheduled_at

When to publish, as an ISO 8601 date-time with a UTC offset (Unix time in milliseconds is also accepted). Must be at least 2 minutes in the future. Omit, or send null or an empty string, to save a draft. Alias: scheduledFor.

timezone
string

IANA time zone name, e.g. Europe/Berlin. Stored with the schedule for display; it does not change how scheduled_at is read.

settings
object

Per-platform options. Each account receives only the options for its own platform; accounts on other platforms ignore them. Any other key is rejected with 400.

instagram
object

Same as settings.instagram. Ignored when settings.instagram is present.

tiktok
object

Same as settings.tiktok. Ignored when settings.tiktok is present.

youtube
object

Same as settings.youtube. Ignored when settings.youtube is present.

pinterest
object

Same as settings.pinterest. Ignored when settings.pinterest is present.

google_business
object

Same as settings.google_business. Ignored when settings.google_business is present.

external_id
string

Your own identifier for this request. With an API key and no Idempotency-Key header, its first 128 characters are used as the idempotency key. Not stored on the post.

Response

Post created

success
boolean
required
message
string
required

"Post scheduled" or "Post saved as draft".

data
object
required

Short form of a post returned by POST /posts. Uses lowercase values; GET /posts/{id} returns the full record.