Skip to content
Reading with an AI assistant?View as MarkdownOpen in ClaudeOpen in ChatGPT

Guides

Publish to Threads with the API

Threads mirrors X's shape: quote another Threads post, control who can reply, and optionally chain a connected series of posts with the post-level thread field.

Browse docs

6 min read

What do you need before you publish?#

You need one connected account for the platform. Connect it in the SkedCast console. If a client owns the account, create a connect link with POST /v1/clients/{id}/connect-invites and send it to them. They authorize from that page without a SkedCast login.

GET /v1/accounts lists the connected accounts with their ids. Pass that id in targets.accountIds below.

How do you schedule a Threads post with the API?#

bash
curl -X POST https://api.skedcast.com/v1/posts \
  -H "Authorization: Bearer sked_live_YOUR_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "<clientId>",
    "content": "Launch day is here 🚀",
    "mediaIds": ["<mediaAssetId>"],
    "targets": { "mode": "selection", "accountIds": ["<threadsAccountId>"] },
    "schedule": { "type": "at", "scheduledAt": "2030-01-15T15:00:00Z" }
  }'
A minimal Threads post, scheduled for a specific time.

Which Threads fields can you set?#

Put everything platform-specific in one variants entry with "platform": "threads" and an overrides object. Send only threads keys on a threads variant. SkedCast reads the keys in the table below and ignores the rest.

FieldTypeValues / defaultNotes
quotePostIdstring—The id of the Threads post to quote.
replyControlenumeveryone \| accounts_you_follow \| mentioned_onlyOmit for Threads' default (everyone can reply).
firstCommentstring—Posted as a self-reply to the published post. Needs the account's threads_manage_replies permission. Without it the comment is held back at publish and firstCommentIssue says so. Best-effort: a failed comment never fails the post. The outcome is reported as firstCommentIssue on GET /v1/post-targets/{id}.
replyApprovalsbooleanfalseReplies wait for your approval before others see them.

How do you add Threads-specific settings?#

json
{
  "clientId": "<clientId>",
  "content": "Same launch, different feed 👀",
  "mediaIds": [],
  "targets": { "mode": "selection", "accountIds": ["<threadsAccountId>"] },
  "variants": [
    { "platform": "threads", "overrides": { "replyControl": "accounts_you_follow" } }
  ],
  "schedule": { "type": "at", "scheduledAt": "2030-01-15T15:00:00Z" }
}
The same POST /posts body, with a variants entry added.

How do you check that the post published?#

Publishing creates one post target per account. GET /v1/post-targets/{id} (or GET /v1/posts/{id}) reports status, plus externalId (Threads's own post id) and permalink (its public URL) once published. To avoid polling, subscribe to the target.published and target.failed webhooks (see the webhooks guide).

threadsapipublish

FAQ

Can I publish a thread of connected posts?
Yes. The post-level thread field ({ segments: [...] }) works the same on X, Bluesky and Threads: segment 0 is the head post and each later segment replies to the one before it. On Threads every later segment is a reply and needs the account's threads_manage_replies permission. A connection without it publishes segment 0 only, as a normal post.

Ready to broadcast everywhere?

Sign up free — no credit card. You land on the Free plan, and you can start a one-time 7-day Studio trial from your workspace whenever you are ready. Connect your first accounts, import a batch, and watch one post fan out across every platform.