Threads

Publish text, image and video posts to Threads, including reply-threads, via the Meta Threads API. The platform id is threads. As on X, a thread is built from containers: container 0 is the root post, and each subsequent container is published as a reply. Threads ingests media by URL — PostFuze hands the platform the public media URL rather than uploading bytes.

Supported content

  • Text — a text-only post (optionally with a link attachment).
  • Image / GIF — an image post, alt_text carried through.
  • Video — processed asynchronously; PostFuze polls container readiness before publishing.
  • First comment / thread — reply containers are posted as native replies chained off the previous post.

Limits

PropertyValue
Character limit500 (truncated if longer)
MediaOne image or video per post
First comment / threadYes — native replies

Configuration fields

Set under config.threads. All fields are optional.

FieldTypeNotes
reply_controlstringWho may reply: everyone, accounts_you_follow, or mentioned_only.
link_attachmentstringOutbound link for a text-only post (ignored when media is attached).
topic_tagstringA topic tag to attach to the post.

Required scopes

Threads connects through its Meta-hosted OAuth flow using the BYOK app credentials you register with POST /social-networks. Configure the scopes in the scopes array on that network record — typically:

  • threads_basic
  • threads_content_publish — required to publish
  • threads_manage_replies — required for first comments / threads

Create a post

A three-post thread, mixing text and a closing link:

curl
curl https://api.postfuze.com/api/v1/posts \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "accounts": ["acct_th_01"],
    "containers": [
      { "content": "A quick thread on why we standardized every webhook payload on camelCase 🧵" },
      { "content": "Mixed snake_case and int-vs-string ids across events made integrations brittle. One shape fixes that." },
      { "content": "Details in the webhooks docs → https://postfuze.com/docs/webhooks" }
    ],
    "config": { "threads": { "reply_control": "everyone" } }
  }'
201 Created
{
	"id": "post_a90b",
	"status": "queued",
	"default_config": { "threads": { "reply_control": "everyone" } },
	"containers": [
		{ "id": "ctr_h1", "position": 0, "role": "main", "content": "A quick thread on why we standardized every webhook payload on camelCase 🧵" },
		{ "id": "ctr_h2", "position": 1, "role": "first_comment", "content": "Mixed snake_case and int-vs-string ids across events made integrations brittle. One shape fixes that." },
		{ "id": "ctr_h3", "position": 2, "role": "thread", "content": "Details in the webhooks docs → https://postfuze.com/docs/webhooks" }
	],
	"targets": [
		{ "id": "tgt_th1", "social_account_id": "acct_th_01", "platform": "threads", "status": "queued", "platform_post_id": null }
	]
}

Container roles are derived from position: 0 → main, 1 → first_comment, and everything after is thread. After the root post lands, PostFuze publishes the remaining containers as native replies.