Posts

Create posts

Creates one post per target entry. A single call can fan out an upload to multiple platforms; you'll receive one post object per target back, each with its own status that progresses asynchronously.

Publish modes

  • immediate - publish as soon as processing finishes
  • scheduled - publish at scheduled_for (top-level or per-target)
  • draft - save without publishing; can be promoted via PATCH /posts/{id}

Captions and copy

Top-level caption is the default for every non-YouTube target; per-target caption overrides it. first_comment works the same way: top-level is the default, per-target overrides. YouTube targets ignore caption — they read per-target title and description instead (no top-level title/description; use target.title / target.description if you need them set).

Platform-specific fields like TikTok privacy levels live under target.platform_options.

Workspace defaults

Anything you leave out of top-level caption / first_comment, per-target caption / title / description / first_comment, or target.platform_options falls back to the workspace's saved preferences. This keeps API-created posts in the same "complete settings" state the dashboard would produce.

Precedence, highest to lowest:

  1. target.<field> and target.platform_options.<platform>.<field>
  2. Top-level caption / first_comment
  3. Workspace preferences for this workspace
  4. Field stays unset (publish will fail later if the platform requires it)

Workspace defaults that get applied today include YouTube privacy_status / notify_subscribers / category_id / default_language / playlist_ids / tags / upload_early_for_review, TikTok privacy_level / is_aigc / post_mode, Instagram share_to_story / collaborators / user_tags / prepend_audio_to_caption, Facebook share_to_story, LinkedIn visibility, Discord silent / mention / username / threadName, plus the top-level caption / first_comment and the YouTube-only title / description. To intentionally publish without a workspace default, send the field explicitly with the value you want (an empty string clears text fields).

Partial failure

Request-shape problems (missing required fields, unknown upload_id, invalid scheduled_for) return 400 and create no posts.

Per-target operational problems (the connection's token expired, the upstream platform rejected the post, the upload isn't ready yet) do not fail the whole request. You'll get 201 back with one post object per target; failed targets carry status: "failed" and a populated error object. Always iterate data and check each post's status instead of relying solely on the HTTP code.

post/posts

Request

  • Base URL: https://api.shortsync.app/v1
  • URL: https://api.shortsync.app/v1/posts
  • Auth: HTTP bearer

Headers

Idempotency-Keystring

Optional client-generated unique key (e.g. a UUID) to make POST operations safe to retry. Replays within 24h return the original response body and status code. Use a fresh key per logical operation.

Request body

upload_idstring required

ID returned from POST /uploads. Required in v1: text-only posts (no upload_id) are reserved for a later release.

publish_mode'immediate' | 'scheduled' | 'draft' required
scheduled_forstring date-time

Required when publish_mode=scheduled (unless every target specifies its own scheduled_for).

notify_on_successboolean

Send the org owner an email when publishing succeeds.

captionstring

Default caption applied to every non-YouTube target. Per-target caption overrides it. YouTube targets ignore this and read target.title + target.description instead.

first_commentstring

Default first comment applied to every target that supports first comments: YouTube, Instagram, Facebook, Threads, Bluesky, X, LinkedIn, Mastodon, Discord, and Pixelfed. Per-target first_comment overrides it.

custom_thumbnail_urlstring

Public https:// URL to a cover image (jpeg, png, webp, or gif, max 20 MB). ShortSync downloads and stores it. Send an empty string to clear. Mutually exclusive with thumbnail_timestamp_ms and custom_thumbnail_upload_id.

thumbnail_timestamp_msinteger

Extract a frame from the video at this timestamp (milliseconds) and use it as the cover. Video-only. Mutually exclusive with custom_thumbnail_url and custom_thumbnail_upload_id.

custom_thumbnail_upload_idstring

upload_id from POST /uploads whose bytes are an image. ShortSync copies the image into the post's thumbnail slot and then deletes the source upload. Mutually exclusive with custom_thumbnail_url and thumbnail_timestamp_ms.

Response

Posts created. Each target produced one post. Some posts may carry status: "failed" if an operational issue prevented them, so inspect each entry in data.

Changes

No recorded changes to this operation across all 1 revision of this API.