# Threads API guide: publishing posts and carousels, limits, permissions and tokens

Canonical: https://status200uploads.com/platforms/threads/api-guide

Checked on 26 October 2026.

The Threads API publishes in two steps: create a media container with POST /{threads-user-id}/threads (text, an image, a video, or a carousel of 2 to 20 items), then publish it with POST /{threads-user-id}/threads_publish. Your app needs the threads_basic and threads_content_publish permissions, approved through App Review before people without a role on the app can grant them, and each Threads profile can publish 250 posts through the API in a moving 24-hour period. This guide sums up the Threads developer pages, read on 15 October 2026.

Sources read on 15 October 2026.

## How Threads publishing works: container, then publish

Media is fetched by URL, never uploaded: "We will cURL your image using the URL provided so it must be on a public server." The same goes for videos. [TH1]

Text-only posts can skip the second step with auto_publish_text, added on 4 June 2025. Since 6 June 2025 the API answers on both graph.threads.com and graph.threads.net. [TH7, TH9]

1. Create a container: POST /{threads-user-id}/threads with media_type TEXT, IMAGE, VIDEO or CAROUSEL, and text, image_url or video_url. The answer is the container id. [TH1]
2. Wait. Threads recommends waiting "on average 30 seconds before publishing a Threads media container", and for videos you can check that the container's status is FINISHED. [TH1, TH8]
3. Publish: POST /{threads-user-id}/threads_publish with creation_id set to the container id. The answer is the Threads media id of the new post. [TH1]

Create an image container, then publish it (the Threads API, not ours)

```bash
curl -X POST 'https://graph.threads.net/{threads-user-id}/threads' \
  -d 'media_type=IMAGE' \
  -d 'image_url=https://example.com/opening-night.jpg' \
  -d 'text=Opening night at the studio' \
  -d 'access_token={access_token}'

# about 30 seconds later, with the id from the first answer
curl -X POST 'https://graph.threads.net/{threads-user-id}/threads_publish' \
  -d 'creation_id={container_id}' \
  -d 'access_token={access_token}'
```

## Access: the app, permissions and App Review

- Create an app and "pick the Threads Use Case"; you then use the Threads app id and app secret. [TH3]
- Permissions: threads_basic is required for every endpoint; threads_content_publish for publishing; threads_manage_replies for POST calls to reply endpoints; threads_read_replies for GET calls to them; threads_manage_insights for insights. Since 25 March 2026, sharing a post to Instagram as a Story needs threads_share_to_instagram. [TH3, TH9]
- Before people with no role on your app can grant a permission, "each permission must first be approved through the App Review process" and the app must be published. [TH3]
- Threads Testers can grant permissions at any time: invite them under App roles, Roles, Add People, Threads Tester, and they accept under Website permissions in their Threads settings. [TH3]
- App Review time, business verification and price: not listed on the Threads pages. [TH3]
- Since 23 September 2025: "The Threads API is now available to Threads profiles without a linked Instagram account." [TH9]

## Sign-in and tokens

- Authorize at https://threads.com/oauth/authorize with client_id, redirect_uri, scope (threads_basic is required), response_type=code and an optional state. "Authorization codes are valid for 1 hour and can only be used once." [TH4]
- Threads appends #_ to the redirect URI, and it "is not part of the code itself, so strip it out." Then exchange the code at POST https://graph.threads.com/oauth/access_token. [TH4]
- The redirect URI must exactly match one in the app's list; the dashboard may add a trailing slash. [TH4]
- Short-lived tokens last 1 hour. Exchange one on your server, with the app secret, at GET https://graph.threads.net/access_token with grant_type=th_exchange_token: "Long-lived tokens are valid for 60 days." [TH3, TH5]
- Refresh with GET /refresh_access_token and grant_type=th_refresh_token. The token must be "at least 24 hours old but have not expired", and "Tokens that have not been refreshed in 60 days will expire and can no longer be refreshed." [TH5]
- Permission grants from users with public profiles are valid for 90 days, and a refresh extends them for another 90 days. [TH3]

## Post types and options

- Text: "Text posts are limited to 500 characters." "Emojis are counted as the number of UTF-8 bytes", so one emoji can use several of the 500. [TH1]
- Carousel: create each item as a container with is_carousel_item=true, then a CAROUSEL container with the items as children. It takes 2 to 20 items and counts as one post toward the rate limit. [TH1, TH2]
- Links: link_attachment works on text-only posts; without it, the first link in a text-only post becomes the preview. "The number of links is restricted to 5 or less", and since 22 December 2025 more fails at container creation with THREADS_API__LINK_LIMIT_EXCEEDED. [TH1, TH9]
- reply_control: everyone, accounts_you_follow, mentioned_only, parent_post_author_only or followers_only; the last two arrived on 7 July 2025. enable_reply_approvals, added on 13 February 2026, holds replies until you approve them. [TH6, TH9]
- alt_text: "The maximum length of alt_text is 1,000 characters." [TH7]
- topic_tag: 1 to 50 characters, with no periods or ampersands, and "Only the first valid tag counts". [TH1]
- Also in the publishing reference: quote_post_id, poll_attachment (14 April 2025), location_id (27 May 2025), text_attachment and spoilers through is_spoiler_media and text_entities (3 October 2025), gif_attachment (GIPHY only; Threads set 31 March 2026 as the end of Tenor support), is_ghost_post (15 December 2025), allowlisted_country_codes and reply_to_id. [TH7, TH9]

## Media specs

| Item | Image | Video |
| --- | --- | --- |
| Format | JPEG and PNG are officially supported | MOV or MP4, moov atom at the front, no edit lists |
| Largest file | 8 MB | 1 GB |
| Size and shape | Width 320 to 1,440 pixels (scaled); aspect ratio up to 10:1; sRGB | Width up to 1,920 pixels; aspect ratio 0.01:1 to 10:1, 9:16 recommended |
| Encoding | Not listed | HEVC or H264, 23 to 60 frames a second, AAC audio up to 48 kHz, variable bitrate up to 100 Mbps |
| Length | Not applicable | Up to 300 seconds (5 minutes) |

Sources: [TH2]

## Limits and quotas

- "Threads profiles are limited to 250 API-published posts within a 24-hour moving period." A carousel counts as one post. [TH2]
- Also per 24 hours: 1,000 replies, 100 deletions and 500 location searches. [TH2]
- GET /{threads-user-id}/threads_publishing_limit returns quota_usage and config (quota_total and quota_duration), with the same figures for replies, deletions and location searches. [TH2]
- Calls are limited too: calls within 24 hours = 4800 times the number of impressions, counting at least 10 impressions. [TH2]

## Container status and errors

GET /{container-id}?fields=status,error_message tells you where a container stands. Threads recommends "querying a container's status once per minute, for no more than 5 minutes." [TH8]

| status | What it means |
| --- | --- |
| IN_PROGRESS | Still being processed. |
| FINISHED | Ready to publish. |
| PUBLISHED | Already published. |
| ERROR | Failed; error_message names the cause. |
| EXPIRED | Not published within 24 hours. |

Sources: [TH8]

- error_message values: FAILED_DOWNLOADING_VIDEO, FAILED_PROCESSING_AUDIO, FAILED_PROCESSING_VIDEO, INVALID_ASPEC_RATIO (Threads' spelling), INVALID_BIT_RATE, INVALID_DURATION, INVALID_FRAME_RATE, INVALID_AUDIO_CHANNELS, INVALID_AUDIO_CHANNEL_LAYOUT and UNKNOWN. [TH8]
- Other publishing error codes: not listed on the troubleshooting page. The one dated addition is THREADS_API__LINK_LIMIT_EXCEEDED for more than 5 links. [TH8, TH9]

## What changed in 2025 and 2026

The Threads changelog dates every change; its newest entry when we read it was 12 August 2026. [TH9]

- 2025: deleting posts (6 March), polls (14 April), location tagging (27 May), auto-publish for text (4 June), the graph.threads.com host (6 June), two more reply audiences (7 July), topic tags (14 July), webhooks for mentions, deletes and publishes (July and August). [TH9]
- Later in 2025: no Instagram account needed (23 September), spoilers and text attachments (3 October), GIFs (17 October), ghost posts (15 December), the 5-link limit (22 December). [TH9]
- 2026: reply approvals (13 February), GIPHY with the Tenor sunset (27 February), sharing to an Instagram Story (25 March), and token_type in token answers (12 August). [TH9]

## Gotchas developers hit

- Publishing a container before it is FINISHED, or forgetting it: an unpublished container expires after 24 hours. [TH1, TH8]
- Media URLs that are not public: Threads fetches the file itself. [TH1]
- Emoji counted in UTF-8 bytes against the 500 characters, and more than 5 links in one post. [TH1, TH9]
- link_attachment on a post with media: it works on text-only posts. [TH1]
- Treating the 250 posts as a calendar day: the window moves. [TH2]
- Leaving the #_ on the authorization code. [TH4]
- Refreshing a token younger than 24 hours, or not refreshing it within 60 days. [TH5]
- Testing with people outside the Threads Tester list before App Review. [TH3]

## Posting to Threads through Status 200 Uploads

Status 200 Uploads posts to Threads through its own Threads app: you sign in on Threads itself and never create a developer app or go through App Review. The facts below are the ones our Threads page shows, as checked on that page's own date.

- **What you can post:** Text on its own, text with one image or one video, or a carousel of 2 to 20 files.
- **Largest video:** 1 GB per file.
- **Video length:** Up to 5 minutes, Threads' own limit.
- **Largest image:** 8 MB per image.
- **Text:** Up to 500 characters. Longer text is refused before Threads is called, so nothing is cut without you knowing.
- **Scheduling:** Schedule a post up to 365 days ahead, or send it now.
- **Plans:** Threads is on every plan, Free included.

## Questions

### How do I publish a post with the Threads API?

Create a container with POST /{threads-user-id}/threads, wait about 30 seconds as Threads recommends, then publish it with POST /{threads-user-id}/threads_publish and the container id as creation_id.

### How many posts can I publish per day with the Threads API?

250 API-published posts per profile in a moving 24-hour period, where a carousel counts as one post, plus 1,000 replies.

### Which permissions does the Threads API need for publishing?

threads_basic and threads_content_publish. For people without a role on your app, each must be approved through App Review and the app must be published; Threads Testers can use them before that.

### How do I post a carousel on Threads with the API?

Create a container for each item with is_carousel_item=true, then a CAROUSEL container with 2 to 20 of them as children, then publish that container.

### What are the Threads API image and video requirements?

Images: JPEG or PNG, up to 8 MB. Videos: MOV or MP4, up to 1 GB and 5 minutes, 23 to 60 frames a second.

### What is the Threads API character limit?

500 characters, with emoji counted as their UTF-8 byte length, and at most 5 links.

### How long do Threads API tokens last?

Short-lived tokens last 1 hour and long-lived tokens 60 days. A long-lived token can be refreshed once it is at least 24 hours old and still valid.

### Do I need an Instagram account to use the Threads API?

No. Since 23 September 2025 the Threads API is available to Threads profiles without a linked Instagram account.

## More on Threads

- [Threads](https://status200uploads.com/platforms/threads)
- [Threads errors](https://status200uploads.com/platforms/threads/errors)

## Related

- [Instagram](https://status200uploads.com/platforms/instagram)
- [X](https://status200uploads.com/platforms/x)
- [REST API](https://status200uploads.com/integrations/rest-api)
- [Python](https://status200uploads.com/integrations/python)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [The API reference](https://status200uploads.com/docs/api)
- [File limits of every network](https://status200uploads.com/docs/file-limits)

## Threads' own pages

Sources read on 15 October 2026.

- TH1. [Posts](https://developers.facebook.com/docs/threads/posts)
- TH2. [Overview (rate limits, media specifications)](https://developers.facebook.com/docs/threads/overview)
- TH3. [Get started](https://developers.facebook.com/docs/threads/get-started)
- TH4. [Get access tokens and permissions](https://developers.facebook.com/docs/threads/get-started/get-access-tokens-and-permissions)
- TH5. [Long-lived tokens](https://developers.facebook.com/docs/threads/get-started/long-lived-tokens)
- TH6. [Reply management](https://developers.facebook.com/docs/threads/reply-management)
- TH7. [Publishing reference](https://developers.facebook.com/docs/threads/reference/publishing)
- TH8. [Troubleshooting](https://developers.facebook.com/docs/threads/troubleshooting)
- TH9. [Threads API changelog](https://developers.facebook.com/docs/threads/changelog)
