Text posts
A post of words only: a question, an update or a link to something new. It can have up to 500 characters, links and hashtags included. A post with neither text nor a file is refused, since Threads would have nothing to show.
Threads posting
Status 200 Uploads publishes to Threads for you: a text post of up to 500 characters, text with an image or a video, or a carousel of up to 20 files, now or at a time you pick. Send it from the dashboard, the REST API, Python, n8n or an AI app such as Claude, alongside the same post on your other networks. You sign in on Threads itself; our own Meta app does the publishing.
A post of words only: a question, an update or a link to something new. It can have up to 500 characters, links and hashtags included. A post with neither text nor a file is refused, since Threads would have nothing to show.
Text with one video of up to 1 GB and 5 minutes. The answer gives the post's permalink once Threads has published it.
Text with one image of up to 8 MB. A larger image is refused before Threads is called.
Text with 2 to 20 files in one post, which people swipe through on Threads.
When we change or flag something in a Threads post, the answer (and History) names it with one of these codes. Your original file is never changed.
unknown_field: A field we do not read is not used, and the answer says so (with the field name we think you meant, when there is one). The post still goes out.
field_not_used: A field we read but could not use for this post (for example another network's block, or a setting that does not apply to this kind of post) is named in the answer. The post still goes out.
options_outside_post: An option sent next to "post" instead of inside it is not used, and the answer says where it belongs.
media_url_not_kept: A scheduled post that names its media by web address fetches the file when it goes out, and we keep no copy: the answer reminds you the file must still be there then.
posts_close_together: The answer warns when another Threads post of the account is scheduled within 20 seconds: leave at least a minute between them.
caption_over_limit: In a dry run or a scheduled post, a caption longer than Threads allows is flagged. We send it as it is; Threads may refuse it or cut it short.
moved_to_next_day: When the daily limit of the profile is reached while a scheduled post is going out, the networks that did not fit move to the next day as a scheduled post of their own, and the post read back says so.
queued_for_next_day: On a plan with a daily limit, a post over the day's limit is queued for the next day instead of failing (answer 202), and the answer gives the time.
The same Threads post from the dashboard, the REST API, Python, n8n or an AI app.
curl -X POST 'https://status200uploads.com/api/v2/posts' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer rl_your_api_key' \
-H 'Idempotency-Key: threads-launch-note' \
-d '{
"post": {
"accountId": "@yourprofile",
"platform": "threads",
"content": {
"text": "Version 2 is out today. What should we build next?"
}
}
}'from status200uploads import Status200
s200 = Status200() # STATUS200_API_KEY in the environment
text = "Version 2 is out today. What should we build next?"
if len(text) > 500:
raise SystemExit("Threads refuses text over 500 characters")
result = s200.publish({"accountId": "@yourprofile", "platform": "threads", "content": {"text": text}}, wait=True)
print(result.final.get("permalink") if result.final else result.code){
"post": {
"accountId": "@yourprofile",
"platform": "threads",
"content": { "text": "{{ $json.text }}" }
}
}Write a short Threads post about our new opening hours and post it at 18:00 today.
The app drafts the text, checks it with status200_validate_post (a text over the Threads limit is flagged before anything is sent) and schedules it with status200_schedule_post. You get the scheduled post's id back, and the app can move or cancel it for you before 18:00.
The code in the answer, what it means and what to do. Each one is in the API reference.
| HTTP | Code | What it means | What to do |
|---|---|---|---|
| 400 | api_error | The text is over 500 characters, or the post has neither text nor a file. Nothing was sent to Threads. | Shorten the text, or add the missing text or file, and send it again. |
| 413 | MEDIA_TOO_LARGE | The video is larger than Threads takes. | Use a video of at most 1 GB. |
| 500 | platform_error | Threads answered with a server error that named no code. | Send it again once, with the same Idempotency-Key. |
| 404 | media_not_found | The mediaID is not a file of your account, or it was removed after 7 days. | Upload the video again and use its new mediaID. |
| 409 | media_processing | The video you imported is still being fetched into your library. | Wait the seconds in Retry-After and send the post again. |
Yes. Send a POST to https://status200uploads.com/api/v2/posts with platform threads and your API key; a text post needs no file. It works on every plan, Free included, with no Meta developer app of your own.
Up to 500 characters. Unlike most networks, where a dry run only warns, a longer Threads text is refused with 400 api_error before Threads is called, so you can shorten it and send it again.
Yes: one video per post, up to 1 GB and 5 minutes, with your text above it.
Yes. Pick all three in the dashboard, or send one request per network to the API. Each network keeps its own limit, so keep the text within the shortest one, or give LinkedIn a longer text of its own.
The answer to a published post carries Threads' thread_id and the permalink. Our own id is in status200.post_id; read the post back with GET /api/v2/posts/{id}, or open History, to see it again later.
Yes, up to 365 days ahead: choose a time in the dashboard, or add post.scheduledFor to the API request.
Threads is on every plan, Free included. Everything on this page was checked on 26 October 2026.