Threads uses Meta’s Threads Graph API, with a separate OAuth flow at threads.net (distinct from Facebook Login for Business). Connecting Threads does not connect Facebook or Instagram, and vice versa.Documentation Index
Fetch the complete documentation index at: https://docs.letmepost.dev/llms.txt
Use this file to discover all available pages before exploring further.
Connect
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). We refresh ahead of expiry; subscribe totoken.expiring.
Posting
Threads supports four post shapes:- Text-only — text required, no media.
- Single image / single video — text optional.
- Carousel (2–20) — text optional, mixed images and videos.
text-only.json
carousel.json
reply.json
Constraints
- Text: 500 graphemes (
threads.text.max_graphemes) - Carousel: 2–20 items (
threads.media.count_max) - Image mimes: jpeg, png, webp (
threads.media.mime_allowed) - Video mimes: mp4, mov
- Image size: 8 MB max
- Video size: 1 GB max
- Alt text: 1000 graphemes max
Preflight rules
threads.text.requiredthreads.text.max_graphemesthreads.media.count_maxthreads.media.alt_text_max_graphemesthreads.media.mime_allowedthreads.media.image_size_maxthreads.media.video_size_maxthreads.container.expiredthreads.container.error
Notes
- Threads’s two-step publish (create-container → poll-status → publish) is hidden from the caller — the immediate
POST /v1/postscall runs both steps and returns when the publish finishes. - Containers expire after 24 hours. For deferred publishes that exceed that window, the dispatcher creates a fresh container — see
threads.container.expired.