# OmniSocials Threads API

> Publish posts, carousels, threads of up to 25 posts and polls to Threads. Answer replies and mentions, and read insights. One API key, on OmniSocials’ approved Meta app.

This is the machine-readable version of [omnisocials.com/threads-api](https://omnisocials.com/threads-api), maintained for AI agents. Facts checked against the OmniSocials app and API on October 17, 2026. Platform reference: [docs.omnisocials.com/platforms/threads](https://docs.omnisocials.com/platforms/threads). API reference: [docs.omnisocials.com/api](https://docs.omnisocials.com/api).

## Basics

- Base URL: `https://api.omnisocials.com/v1`
- Auth: `Authorization: Bearer omsk_live_...`. One key belongs to one workspace. Keys are created in the app under Settings, API.
- Channel id in `accounts`: `threads`. The account connects inside the OmniSocials app, not through the API.
- Rate limit: 100 requests per minute per key. A 429 carries `Retry-After`.
- Responses use a `{ "data": ... }` envelope. Create returns `201`.
- Webhooks: `post.scheduled`, `post.published`, `post.failed`, `post.approved`, `post.rejected`, signed with HMAC-SHA256 in `X-OmniSocials-Signature`.

## Skip the Meta app review

Threads’ own API needs a Meta app, an App Review for replies and mentions, long-lived tokens and a media container you poll before every post. OmniSocials already did that work.

- On your own: Meta app, App review, Tokens, Hosting, Containers, Polling, Reply chains, Retries, then the first post.
- Permissions your own app must get approved: `threads_basic`, `threads_content_publish`, `threads_manage_insights`, `threads_manage_replies`, `threads_read_replies`, `threads_manage_mentions`, `threads_delete`.
- On OmniSocials: sign in, create an API key, POST. All 7 scopes already approved.

## Schedule a post

```bash
curl -X POST https://api.omnisocials.com/v1/posts/create \
  -H "Authorization: Bearer $OMNISOCIALS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "content": "Reply to Threads replies from your own code.",
  "accounts": ["threads"],
  "media_urls": [
    { "url": "https://cdn.example.com/inbox-api.png",
      "alt": "The Social Inbox next to an API request" }
  ],
  "schedule_at": "2026-10-22T18:00:00Z"
}'
```

The answer (`201`, shortened):

```json
{
  "data": {
    "id": "1024",
    "status": "scheduled",
    "app_url": "https://app.omnisocials.com/create-post/1024"
  }
}
```

## Every format, one request

Posts, carousels of images and videos, threads and polls share one request shape. Add media URLs with alt text, thread parts or poll options, and a time. OmniSocials checks the post against Threads’ rules before it publishes.

- **Posts and carousels.** Text, one image or video, or a carousel of up to 20 images and videos mixed. Every image can carry alt text. (`media_urls`, `{ url, alt }`)
- **Threads.** 2 to 25 posts in one request, each with up to 500 characters and its own media. Every post replies to the one before. (`threads.thread_parts`)
- **Polls.** The post text is the question, with 2 to 4 options. Threads closes the poll after 24 hours. (`threads.poll`)

### Post

```json
{
  "content": "Reply to Threads replies from your own code.",
  "accounts": ["threads"],
  "media_urls": [
    { "url": "https://cdn.example.com/inbox-api.png",
      "alt": "The Social Inbox next to an API request" }
  ],
  "schedule_at": "2026-10-22T18:00:00Z"
}
```

### Carousel

```json
{
  "content": "What shipped this month, in one carousel.",
  "accounts": ["threads"],
  "media_urls": [
    "https://cdn.example.com/pdf-uploads.mp4",
    { "url": "https://cdn.example.com/bluesky.png",
      "alt": "A Bluesky thread" },
    { "url": "https://cdn.example.com/mastodon.png",
      "alt": "A Mastodon thread" }
  ],
  "schedule_at": "2026-10-23T09:00:00Z"
}
```

### Thread

```json
{
  "content": "",
  "accounts": ["threads"],
  "threads": {
    "thread_parts": [
      { "text": "Threads on Bluesky and Mastodon, too.",
        "media_ids": [
          { "id": "4821", "alt": "A Bluesky thread" },
          { "id": "4822", "alt": "A Mastodon thread" }
        ] },
      { "text": "Write it once. Each post replies to the last." },
      { "text": "Up to 25 posts, 500 characters each." }
    ]
  },
  "schedule_at": "2026-10-24T10:00:00Z"
}
```

### Poll

```json
{
  "content": "Which channel do you schedule first?",
  "accounts": ["threads"],
  "threads": {
    "poll": {
      "options": ["Threads", "Bluesky", "Mastodon"]
    }
  },
  "schedule_at": "2026-10-23T12:00:00Z"
}
```

## A whole thread in one request

Send up to 25 posts in thread_parts. OmniSocials publishes them in order, each one as a reply to the one before, and keeps track of every post that went out.

`POST /v1/posts/create-and-publish`:

```json
{
  "content": "",
  "accounts": ["threads"],
  "threads": {
    "thread_parts": [
      { "text": "Our SDKs are out: post to Threads from code.",
        "media_urls": [
          { "url": "https://cdn.example.com/sdks.png",
            "alt": "Post from your own code, a Node.js sample" }
        ] },
      { "text": "Node, Python, PHP, Ruby, Go, Java, .NET, Rust." },
      { "text": "Each one wraps the same REST API." }
    ]
  }
}
```

The answer:

```json
{ "data": { "id": "1025", "status": "posting",
  "accounts": { "threads": true } } }
```

- **2 to 25 posts.** Each post holds up to 500 characters and up to 20 images or videos, mixed, with alt text on every image. (`threads.thread_parts`, `{ url, alt }`)
- **Retries pick up where they stopped.** The posts that went out are saved. A retry starts at the first post that did not, so nothing is published twice. (`POST /v1/posts/:id/retry`)
- **A poll on the first post.** Add threads.poll to a thread and the poll goes on its first post. Threads closes it after 24 hours; the results come with the analytics. (`threads.poll`, `metrics.poll`)

## Connect Threads once, post from code

Sign in with Threads once inside OmniSocials. Create an API key, and your code posts, replies and reports for that profile.

- **Threads sign-in.** Sign in with your Threads profile once. OmniSocials keeps the token fresh: it lasts 60 days and is renewed at day 30.
- **A key per workspace.** A key only reaches its own workspace. Inbox access is switched on per key.
- **What the profile can post.** The accounts call lists the connected profile with its formats, and says when the connection needs a reconnect. (`GET /v1/accounts`, `needs_reconnect`)

`GET /v1/accounts?platform=threads` answers:

```json
{
  "data": [
    {
      "id": "4127_threads",
      "platform": "threads",
      "username": "omnisocials_",
      "content_types": ["post"],
      "status": "active",
      "needs_reconnect": false
    }
  ],
  "workspace_name": "OmniSocials"
}
```

## Answer replies and mentions

List the replies on your Threads posts and the posts that mention you, then reply or hide a reply from your own code. Each answer goes out as a native Threads reply.

- **Replies.** Answer any reply on your posts as a native Threads reply. Each conversation comes with the post it sits on. (`/conversations/:id/reply`)
- **Hide a reply.** Hide or unhide a top-level reply on your own post. Nested replies can’t be hidden, and replies can’t be deleted. (`/inbox/messages/:id/hide`)
- **Mentions.** Posts that mention your profile land in the same list. New replies come in by webhook and a check every 15 minutes. (`type=mention`)

`GET /v1/inbox/conversations?platform=threads&type=comment` lists the conversations. Reply with `POST /v1/inbox/conversations/threads_comment_904/reply`:

```json
{
  "text": "Yes. Threads replies use the same endpoints."
}
```

## Read what Threads reports

Views, likes, replies, reposts, quotes and shares per post, poll results, and the profile’s followers per day. For a thread, the API adds up all of its posts.

- **Per post and per thread.** Views, likes, replies, reposts, quotes and shares. A thread adds up its posts, and a poll adds the share of each option. (`/analytics/posts/:id`, `thread_parts`)
- **Per profile and workspace.** A daily snapshot of the profile: followers, views, likes, replies, reposts and link clicks per URL. Plus a workspace overview. (`/analytics/accounts`, `/analytics/overview`)
- **Best times to post.** Days and hours worked out from your own Threads history, once 15 of your posts are analyzed. (`/analytics/best-times`)

`GET /v1/analytics/posts/1019` answers:

```json
{
  "data": {
    "post_id": "1019",
    "platforms": {
      "threads": {
        "thread_parts": 1,
        "metrics": {
          "views": 214, "likes": 17,
          "replies": 5, "reposts": 3,
          "quotes": 1, "shares": 2,
          "engagement": 28
        }
      }
    }
  }
}
```

## Threads’ rules, in one place

OmniSocials checks every post against them before it reaches Threads, so a long post or a bad file fails in your request, not at publish time.

| Limit | Value |
| --- | --- |
| Text | 500 characters per post |
| Links | Up to 5 per post |
| Media | Up to 20 images or videos per post |
| Images | JPEG, PNG or WebP, up to 8 MB |
| Video | 5 minutes, 100 MB in media_urls, 1 GB via upload-from-url |
| Threads | 2 to 25 posts |
| Polls | 2 to 4 options of 25 characters, 24 hours |
| Posts | 250 per profile in 24 hours |
| Replies | 1,000 a day per workspace |
| Accounts | Threads profiles, one per workspace |

## Your first thread in three steps

About five minutes from sign-up to a scheduled thread on Threads. Then hand the key to your coding agent.

1. **Create an API key** (`Settings › API`). Start your trial, open Settings, API and create a key. It is shown once.
2. **Connect Threads** (`GET /v1/accounts`). Sign in with Threads in OmniSocials once. Then list the profile from your code.
3. **Send your first thread** (`POST /v1/posts/create`). Post now with create-and-publish, or add schedule_at to plan it.

## FAQ

### Do I need my own Meta app or an app review?

No. Threads connects through OmniSocials’ approved Meta app, with Threads’ own sign-in. You call the OmniSocials API with an API key and never handle Threads tokens.

### Which Threads accounts can I post to?

The Threads profile you sign in with. Each workspace connects one Threads profile; a second profile goes in a second workspace with its own key.

### Can I post a thread of several posts?

Yes. Send threads.thread_parts with 2 to 25 posts of up to 500 characters each. Every post can carry up to 20 images or videos with alt text, and every post after the first goes out as a reply to the one before. If a thread stops halfway, the posts that went out are kept and a retry continues with the next one.

### Can I add a poll?

Yes. Add threads.poll with 2 to 4 options of up to 25 characters; the post text is the question. Threads closes the poll 24 hours after it is published. A poll goes on a post without media, and on a thread it goes on the first post. The results come back with the post analytics.

### Can I post carousels with videos?

Yes. Send 2 to 20 media URLs and OmniSocials publishes a carousel, with images and videos mixed. Pass an item as { url, alt } to send alt text with it.

### Can I schedule Threads posts through the API?

Yes. Send schedule_at with the request and OmniSocials keeps the queue and publishes on time, with a webhook when it is live.

### Can I read and answer replies?

Yes. The inbox endpoints list the replies on your posts and the posts that mention you, reply to them, and hide or unhide a top-level reply. Threads DMs and deleting replies are not available.

### Can I post to Threads and Instagram in one request?

Yes. Put both accounts in accounts. content takes one text for both or a text per platform, and the threads object carries the thread parts or the poll.

### What happens when a Threads post fails to publish?

OmniSocials retries it up to 3 times, 15 minutes apart. A thread continues from the first post that did not go out, so no post shows up twice. Then post.published or post.failed fires.

### What are the rate limits?

100 requests per minute per API key, and 1,000 inbox replies a day per workspace. Threads itself allows a profile 250 posts in 24 hours.

### Is the Threads API free?

Meta doesn’t charge for the Threads API, but your own app needs Meta’s App Review before it can post for other accounts. Through OmniSocials you post on its approved Meta app, and the API is part of the plan, $10 per seat per month billed annually.

### How much does OmniSocials cost?

One plan with every feature included: $10 per seat per month billed annually, or $12 billed monthly. Team members and client seats cost the same. Every account starts with a 14-day free trial.

The REST API, the SDKs, the CLI, webhooks and the MCP server are part of that one plan.

## Pricing

From $10 per seat a month, API included. 14-day free trial.

## Related

- [Threads scheduler](https://omnisocials.com/threads.md)
- [Threads MCP server](https://omnisocials.com/threads-mcp.md)
- [All channels](https://omnisocials.com/channels.md)
- [Threads character limits](https://omnisocials.com/threads-character-limits)
- [Threads video lengths](https://omnisocials.com/threads-video-lengths)

## Links

- Page: https://omnisocials.com/threads-api
- Threads platform docs: https://docs.omnisocials.com/platforms/threads
- API reference: https://docs.omnisocials.com/api
- REST API overview: https://omnisocials.com/api.md
- MCP server: https://omnisocials.com/mcp.md
- Sign up: https://app.omnisocials.com/signup
