Threads API: Posting Reference
Threads is supported via Meta's Threads API. Only accounts linked to a Threads profile can be connected. The account must be a public profile.
Channel ID: threads
Supported content types
| Type | Supported |
|---|---|
| Feed post | โ |
| Story | - |
| Reel | - |
Minimal example
Code
Text-only posts are supported. Media is optional.
Platform-specific options
| Field | Type | Description |
|---|---|---|
threads.thread_parts | array | Publish as a chained thread instead of a single post. See Posting threads. |
threads.location_id | string | Tag a location on the post. See Location tagging. |
threads.location | object | Alternative to location_id: the full search result { id, name, address, city, country }, so your app can show the place name without another lookup. Only id is required; location_id wins when both are given. |
Threads has no required option fields. The default create-post body is sufficient for a single post.
Posting threads
To publish a thread (a chain of connected posts), pass threads.thread_parts. Each part becomes its own post, published as a reply to the previous one from the same account.
Rolling out. Chaining posts needs the Threads reply permission (threads_manage_replies), which Meta is still reviewing for OmniSocials. Until that review passes, thread_parts is rejected with a 400 that says Threads threads are not available yet. Once enabled, Threads accounts connected before that date need a one-time reconnect under Settings -> Organisation -> Workspaces.
Code
Rules:
-
2 to 25 parts. For a single post, omit
thread_partsand usecontent.threads(orcontent.default) instead. -
Each
textis required, non-empty, and โค 500 characters. Parts that exceed the limit are rejected with a400. -
media_urls(ormedia_ids) is optional per part, up to 10 items per part. A part with several items publishes as a carousel, and images and videos can be mixed in the same part, exactly like a single Threads post. Any entry can be an object with alt text:Code -
When
content.threadsis provided alongsidethread_parts,thread_partswins: the first part is the post's caption. -
The first part's URL becomes the post's Threads URL. If a later part fails,
POST /posts/:id/retryresumes from the first unpublished part instead of re-posting the ones that already landed.
To convert a thread back into a single post on update, send threads.thread_parts: null to PATCH /posts/:id.
Location tagging
Tag a physical place on a Threads post by passing threads.location_id. The tag shows on the post like a location tag in the Threads app.
Rolling out. Location tagging needs the Threads location permission (threads_location_tagging), which Meta is still reviewing for OmniSocials. Until that review passes, threads.location_id is rejected with a 400 that says location tagging is not available yet, and GET /locations/search?platform=threads answers error.code = not_available. Once enabled, Threads accounts connected before that date need a one-time reconnect under Settings -> Organisation -> Workspaces.
Find an id with the locations search, using platform=threads. You can search by name or by coordinates (latitude + longitude):
Code
Then create the post with the id:
Code
Rules:
- Threads location ids are NOT Facebook Place IDs. Never reuse an Instagram
location_idhere; always search withplatform=threads. - On a multi-post thread (
thread_parts), the tag goes on the first post. - On
PATCH /posts/:id,threads.location_id: null(orthreads.location: null) removes the tag. - The connection must have the
threads_location_taggingpermission; without it, create/update/publish return a400naming the reconnect, and the search answerserror.code = threads_reauth_required. - Threads allows 500 location searches per account per rolling 24 hours.
The post object echoes the tag back as threads.location ({ id, name, address, city, country }, with the display fields as you stored them).
Social Inbox
Replies people leave on your Threads posts, and posts that mention you, land in the Social Inbox. You can reply (published as a native Threads reply) and hide or unhide replies on your own posts via POST /inbox/messages/{id}/hide.
Rolling out. The Threads inbox needs Threads permissions that Meta is still reviewing for OmniSocials. Until that review passes, Threads conversations do not appear and Threads inbox replies and hides return a clear 400 saying the feature is not available yet. Once enabled, Threads accounts connected before that date need a one-time reconnect under Settings -> Organisation -> Workspaces.
- Conversation types:
comment(replies on your posts, grouped per root post) andmention. Threads has no DM API. - Replies need the Threads reply permission on the connection; otherwise the reply returns
401 reauth_required. - Only incoming top-level replies on your posts can be hidden; nested replies return
400 not_hideable.
See the Social Inbox guide for endpoints, payloads, and error handling.
Media requirements
| Media | Requirement |
|---|---|
| Image | JPEG or PNG. Max 8 MB. Up to 10 per post. |
| Video | MP4, up to 5 minutes, max 1 GB |
Threads supports a single image, a single video, or a carousel of up to 10 items per post. Carousel items can mix images and videos.
Alt text. Threads delivers per-media alt text natively. Pass it by using an object entry instead of a bare string: { "url": "https://example.com/bike.jpg", "alt": "A red bicycle leaning against a brick wall" } in media_urls (or { "id": "...", "alt": "..." } in media_ids, including per-part thread media; max 1500 characters). It is sent as the media container's alt_text on images and videos, single posts and carousel items alike.
Limitations
- Threads enforces a 500 character limit per post (and per part of a thread)
- Posting a reply to an arbitrary post is not supported;
thread_partsonly chains replies to your own previous part, and the Social Inbox replies to replies on your posts and to mentions - Private Threads accounts cannot be connected