Quick reference
| Limit / capability | Value |
|---|---|
| Character limit | 500 graphemes |
| Items per carousel | 2 – 20 (mixed image + video allowed) |
| Image formats | jpeg, png, webp |
| Image size | 8,000,000 bytes (8 MB) |
| Video formats | mp4, mov |
| Video size | 1,000,000,000 bytes (1 GB) |
| Video duration | ≤ 5 min (platform-enforced) |
| Alt text per item | 1000 graphemes |
| Post types supported | text, single image, single video, carousel, reply |
| Scheduling | Yes (via scheduledAt) |
| Reply support | Yes (threads.replyToId) |
| First comment | Not supported |
| Inbox / DM | Not supported in v1 |
| Analytics | Not supported in v1 |
Connect an account
OAuth 2.0 against threads.net. Start atPOST /v1/accounts/connect/threads, send the user through the redirect, and the callback completes the handshake.
Scopes
| scope | requested |
|---|---|
threads_basic | always — required to call GET /me. |
threads_content_publish | always — unlocks create-container + publish. |
threads_manage_replies | only when the caller opts into extended scopes. |
threads_read_replies | only when the caller opts into extended scopes. |
replyToId on the request body, which is a write and needs no extra scope.
Token lifecycle
Threads issues long-lived tokens (~60 days, refreshable after the first 24 h). The publisher refreshes ahead of expiry; subscribe totoken.expiring to know when a user-prompt re-auth is on the horizon.
Post types
Text post
text.json
Single image
single-image.json
Single video
single-video.json
Carousel (mixed)
Threads accepts 2 – 20 items per carousel, and unlike most platforms it allows mixed image + video in a single carousel.carousel.json
Reply
Replies to an existing thread under the same account.reply.json
Wisdom (platform-specific things that bite)
Common errors
| Error rule | What it means | How to fix |
|---|---|---|
threads.text.max_graphemes | Caption exceeded 500 graphemes | Trim to ≤500 graphemes. |
threads.text.required | Text-only post had no text | Provide text or attach media[]. |
threads.media.count_max | More than 20 items in a carousel | Reduce to ≤20, or split into multiple posts. |
threads.media.mime_allowed | Unsupported image/video mime | Images: jpeg/png/webp. Videos: mp4 or mov. |
threads.media.image_size_max | Image > 8 MB | Re-encode under 8,000,000 bytes. |
threads.media.video_size_max | Video > 1 GB | Compress under 1,000,000,000 bytes. |
threads.container.expired | Container aged past Threads’ 24 h window | Re-create and publish in one flow (the publisher does this for scheduled posts automatically). |
threads.container.error | Threads transcoder or policy filter rejected the container | Inspect platformResponse.error_message for the upstream reason. |
What you can’t do (yet)
- First comment (Threads has no comment-as-author surface distinct from a reply).
- Quote posts, polls, edits.
- Reading replies / engagement (would require
threads_read_replies+ the inbox feature, neither in v1). - DMs — Threads has no DM API.
- Cross-posting fan-out to Instagram in a single call; Threads and Instagram are separate connects.
API reference
POST /v1/posts— primary publish.POST /v1/media— upload images/videos formediaIdreferences.POST /v1/accounts/connect/threads— start a Threads OAuth flow.

