Connect Threads first
- 01
Open Accounts in 1Post and choose Connect.
- 02
Pick Threads.
- 03
Sign in with Threads and approve access for the account you want to post to.
- 04
Choose the account in 1Post. It is ready to pick in the composer.
Then GET /v1/accounts returns the id of the Threads account to use in the request.
Send a post to Threads
curl https://api.get1post.com/v1/posts \
-H "Authorization: Bearer $ONEPOST_API_KEY" \
-H "Idempotency-Key: threads-first-post" \
-d '{"accounts":["ACCOUNT_ID"],"text":"Small update on the schedule.","schedule_at":"2026-11-02T15:00:00Z"}'The reply is 202 with the post (status scheduled) and one destination for Threads, which moves from queued to published or failed.
What you can send to Threads
- Text
- Image
- Video
- Carousel
- Threads (reply chains)
- Reply control
What Threads publishes
- Text posts are limited to 500 characters, and emoji are counted by their number of UTF-8 bytes.
- Images are JPEG or PNG up to 8 MB with an aspect ratio no wider than 10:1; widths are scaled into the range of 320 to 1440 pixels.
- Videos are MOV or MP4 up to 5 minutes and 1 GB, at 23 to 60 frames per second, up to 1920 pixels wide.
Threads rules the request is checked against
| Rule | What 1Post checks |
|---|---|
| Text limit | 500 characters, counted by code points |
| Media accepted | Images, Video |
| Images per post | 20 |
| Videos per post | 20 |
| Image size | Up to 8 MB |
| Image width | 320 to 1440 pixels |
| Video size | Up to 1 GB |
| Video length | Any to 5 minutes |
| Carousel | 2 to 20 items |
| Threads | Yes, as a chain of replies |
| First comment | Yes |
| Posts per day, per connected account (1Post) | 200 |
The same table with sources is on the Threads specs page.
Threads options in the request
- Thread: send parts instead of text. Each part is one post in the chain, up to 100 parts, and each is counted on its own.
- First comment: add first_comment with text to an account object, and delay_min if it should wait.
{
"accounts": [
"ACCOUNT_ID"
],
"parts": [
{
"text": "1/ The short version."
},
{
"text": "2/ The detail.",
"delay_min": 1
}
],
"use_next_free_slot": true
}Check the post before it is queued
Add "dry_run": true to test a post: nothing is kept, a valid one answers 200 and a broken one answers 422 naming the rule.
{
"error": {
"code": "invalid_for_platform",
"message": "threads refuses this post: Threads counts 532 of 500 characters in part 1. (text_too_long).",
"fix": "Fix the rule named in the message and send the post again.",
"retryable": false,
"request_id": "REQUEST_ID"
}
}An assistant connected to the MCP server sends the same fields to create_post; set one up.