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_textcarried 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
| Property | Value |
|---|---|
| Character limit | 500 (truncated if longer) |
| Media | One image or video per post |
| First comment / thread | Yes — native replies |
Configuration fields
Set under config.threads. All fields are optional.
| Field | Type | Notes |
|---|---|---|
reply_control | string | Who may reply: everyone, accounts_you_follow, or mentioned_only. |
link_attachment | string | Outbound link for a text-only post (ignored when media is attached). |
topic_tag | string | A 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_basicthreads_content_publish— required to publishthreads_manage_replies— required for first comments / threads
Create a post
A three-post thread, mixing text and a closing link:
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" } }
}'{
"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.