Threads API

How to post on Threads
via the API

Post and schedule on Threads programmatically using the API. Create a key, connect Threads, and write the post.

the whole flow

Four steps, then it is scheduled

You call PostWing. PostWing publishes to Threads at the time you set. The post also shows up on your calendar.

  1. 01Create an API key
  2. 02Connect Threads
  3. 03Create the post
  4. 04Cross-post to more channels
01

Create an API key

Open Dashboard → AI & API and create a key. Copy it once. It starts with pw_live_. Send it on every request:

Header

Authorization: Bearer pw_live_…

Every URL below starts at https://postwing.io/api/v2.

02

Connect Threads

Connect the Threads account you want to post from. You only do this once.

The simple way is in the dashboard. Open Accounts, choose Threads, and finish the Threads login.

From the API, start that same login. The response includes a url. Open it and approve Threads.

Start connect

curl -s -X POST "https://postwing.io/api/v2/accounts/connect" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "platform": "threads" }'

After you finish in the browser, sync. This imports the account into your workspace and returns the account id.

Sync

curl -s -X POST "https://postwing.io/api/v2/accounts/sync" \
  -H "Authorization: Bearer pw_live_…"

In the response, find the object where platform is threads and copy id. That is the id you send when you create the post.

Sync response

{
  "data": [
    {
      "id": "b8c9d0e1-f2a3-4567-8901-678901234567",
      "platform": "threads",
      "handle": "brand",
      "display_name": "Brand",
      "status": "connected"
    }
  ]
}

Connected Threads in the dashboard instead? List accounts and copy the same field:

List accounts

curl -s -X GET "https://postwing.io/api/v2/accounts" \
  -H "Authorization: Bearer pw_live_…"
03

Create the post

A caption is enough on Threads. Send the text, a future time, and the Threads account id you copied after sync. There are no extra platform options. This call schedules the post. Threads publishes it at scheduled_at. scheduled_at is UTC.

Create a text post

curl -s -X POST "https://postwing.io/api/v2/posts" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "caption": "We just shipped a faster way to publish updates.",
  "scheduled_at": "2026-10-12T15:00:00Z",
  "accounts": [
    { "id": "b8c9d0e1-f2a3-4567-8901-678901234567" }
  ]
}'

You get back three things that matter:

  • id: the post id, for edits or cancelling later
  • status: scheduled until it publishes
  • accounts: each account, with url once it is live and error if it fails

Response

{
  "id": "7c1d2a8e-4b0f-4f8e-9a51-2f7f6b1c9d10",
  "status": "scheduled",
  "caption": "We just shipped a faster way to publish updates.",
  "scheduled_at": "2026-10-12T15:00:00.000Z",
  "accounts": [
    {
      "id": "b8c9d0e1-f2a3-4567-8901-678901234567",
      "platform": "threads",
      "handle": "brand",
      "status": "scheduled",
      "url": null,
      "error": null
    }
  ],
  "dashboard_url": "https://postwing.io/dashboard/post/7c1d2a8e-4b0f-4f8e-9a51-2f7f6b1c9d10"
}

A Threads caption is capped at about 500 characters.

04

Cross-post to all 8 platforms

The same text can go to X and LinkedIn. Connect each channel the way you connected Threads, then copy its id from the sync response.

Connect X

curl -s -X POST "https://postwing.io/api/v2/accounts/connect" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "platform": "x" }'

Connect LinkedIn

curl -s -X POST "https://postwing.io/api/v2/accounts/connect" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "platform": "linkedin" }'

Open each url, finish the login, then sync once. Copy id where platform is x, and where platform is linkedin.

Add those ids to accounts on the create call. One request. Every account publishes at the same scheduled_at. Leave caption off an account to use the shared caption. Set caption on Threads when the shared text is longer than Threads allows.

Create one text post for three channels

curl -s -X POST "https://postwing.io/api/v2/posts" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "caption": "We just shipped a faster way to publish updates from one request.",
  "scheduled_at": "2026-10-12T15:00:00Z",
  "accounts": [
    {
      "id": "b8c9d0e1-f2a3-4567-8901-678901234567",
      "caption": "Faster publishing, now live."
    },
    { "id": "e5f6a7b8-c9d0-1234-ef01-345678901234" },
    { "id": "d4e5f6a7-b8c9-0123-def0-234567890123" }
  ]
}'

Facebook accepts this text with no media. Instagram, TikTok, Pinterest, and YouTube need an image or a video. Pinterest also needs board_id. YouTube also needs a title.

media

Add images or a video

Media is optional. Use the same Threads account id. Images go out with the caption, up to 4. A video is one file.

Create an image post

curl -s -X POST "https://postwing.io/api/v2/posts" \
  -H "Authorization: Bearer pw_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "caption": "A look at the new office.",
  "scheduled_at": "2026-10-12T18:00:00Z",
  "accounts": [
    { "id": "b8c9d0e1-f2a3-4567-8901-678901234567" }
  ],
  "media": [
    { "url": "https://cdn.example.com/office.jpg", "type": "image" }
  ]
}'

Add more image objects in media, up to 4. For a video, send one item with type video instead. Threads has no extra options.

The image or video URL has to be public HTTPS. Videos imported from a URL need to be 100MB or smaller. A file on your computer uses the direct upload URL, covered in the API docs.

Details worth knowing

  • scheduled_at has to be a future time in ISO 8601, usually UTC.
  • POST /posts schedules the post right away. You can still edit or cancel it until it publishes.
  • Threads accepts a caption alone. Images, up to 4, and one video are optional.
  • A Threads caption is capped at about 500 characters.
  • There are no Threads options. The caption is the post.
  • The response includes the post id. Use it to edit with PATCH /posts/{id} or cancel with DELETE /posts/{id}.
  • API access is included on every plan, from $9.99/mo. Posts count as normal posts on your account.

questions

Threads API FAQ

Yes. Create the post with caption, scheduled_at, and the Threads account id. Leave out media.

ready when you are

Schedule your next Threads post from the API

Create a key, connect Threads, and create the post.