Threads publishing API
LivePublish text, image or video to a Threads profile. Text-only posts are first class here, unlike Instagram.
Connect an account and publish today.
What this channel accepts
threads:<threads-user-id>Publish to Threads
One request shape, the same across every channel. Register media first with POST /v1/media, then pass the handles it returns.
POST /v1/posts returns 202 with a post id; the publish itself is asynchronous.
const res = await fetch("https://creasionapp.com/v1/posts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CREASION_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"accounts": [
"threads:17841400000000000"
],
"content": "Text-only posts are first class on Threads.",
"threads": {
"topic_tag": "buildinpublic"
}
}),
});
// 202 Accepted: the post is queued. Poll GET /v1/posts/{id}
// or wait for the post.completed webhook.
const { id } = await res.json();Before you integrate
500 bytes, not 500 characters
Threads counts UTF-8 bytes, so an emoji costs four. We enforce the same measure before sending rather than letting Meta truncate or fail opaquely.
reply_to_id continues a thread
Set threads.reply_to_id to the id of an earlier post to publish a reply rather than a new root post.
Knowing what happened
Publishing is asynchronous, so the create call returns before the post exists on Threads. Poll GET /v1/posts/{id} or register a webhook and receive post.completed instead. When a post targets several accounts, each destination reports its own result, so a partial success names exactly which one failed and why.