Skip to main content

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.

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.

Connect

OAuth 2.0 against threads.net. Start at POST /v1/accounts/connect/threads, send the user through the redirect, and the callback completes the handshake.

Scopes

scoperequested
threads_basicalways — required to call GET /me.
threads_content_publishalways — unlocks create-container + publish.
threads_manage_repliesonly when the caller opts into extended scopes.
threads_read_repliesonly when the caller opts into extended scopes.
The publisher uses neither replies scope — Threads supports replying via 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 to token.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
{
  "account": { "platform": "threads", "id": "..." },
  "text": "Threads-only thought"
}
carousel.json
{
  "account": { "platform": "threads", "id": "..." },
  "text": "Mixed carousel",
  "media": [
    { "kind": "image", "mediaId": "med_…", "altText": "first" },
    { "kind": "video", "mediaId": "med_…", "altText": "second" },
    { "kind": "image", "mediaId": "med_…", "altText": "third" }
  ]
}
reply.json
{
  "account": { "platform": "threads", "id": "..." },
  "text": "Replying to my own post",
  "threads": { "replyToId": "<thread id>" }
}

Constraints

Preflight rules

Notes

  • Threads’s two-step publish (create-container → poll-status → publish) is hidden from the caller — the immediate POST /v1/posts call 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.