---
title: "Threads API: post and schedule from code"
url: "https://get1post.com/developers/threads.md"
canonical_url: "https://get1post.com/developers/threads"
last_updated: "2026-10-26"
type: "reference"
summary: "Post and schedule to Threads with the 1Post API and MCP server: the request, the reply, every rule it is checked against and a dry run."
related: ["https://get1post.com/platforms/threads.md", "https://get1post.com/platforms/threads/specs.md", "https://get1post.com/docs/api-posts.md", "https://get1post.com/docs/mcp.md"]
---

# Threads API: post and schedule from code

Post and schedule to Threads with the 1Post API and MCP server: the request, the reply, every rule it is checked against and a dry run.

Post to Threads from code with one request: POST /v1/posts with your account id, the text and a schedule_at time. Threads text is limited to 500 characters, counted by code points. 1Post allows up to 200 posts a day for each connected account, and a dry run checks a post against every rule first.

## Connect Threads first

1. Open Accounts in 1Post and choose Connect.
2. Pick Threads.
3. Sign in with Threads and approve access for the account you want to post to.
4. 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

**Schedule a post**

```bash
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](https://get1post.com/platforms/threads/specs.md).

## 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.

**A two-part thread in the next free slot**

```json
{
  "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.

**A refused request, abridged**

```json
{
  "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](https://get1post.com/docs/mcp.md) sends the same fields to create_post; [set one up](https://get1post.com/assistants.md).

## Questions

**Can I post to Threads with an API key?**

Yes. A key with write scope can create, change and cancel Threads posts for the workspace it belongs to, with the role of the member who made it. See [API authentication](https://get1post.com/docs/api-authentication.md).

**What happens if a Threads post breaks a rule?**

The request is refused with invalid_for_platform and the failing rule is named. Fix it and send the request again, or send it with dry_run to test the fix first.

**How many Threads posts can I send in a day?**

Up to 200 for each connected account. A request that would pass that answers daily_cap with the time the day frees up.

**How does Threads count emoji?**

By UTF-8 bytes, so most emoji count for more than one character. Leave a little room when a post has emoji; the [character counter](https://get1post.com/tools/character-counter.md) shows the plain count.

## Sources

- [Threads API: posts](https://developers.facebook.com/docs/threads/posts), read 2026-10-22

## Related

- [Schedule Threads posts: formats, limits, setup](https://get1post.com/platforms/threads.md)
- [Threads specs and limits: text, media, daily cap](https://get1post.com/platforms/threads/specs.md)
- [Creating and changing posts with the API: 1Post docs](https://get1post.com/docs/api-posts.md)
- [The MCP server: 1Post docs](https://get1post.com/docs/mcp.md)
