---
title: "Threads"
description: "Publishing to Threads via the Octopost API"
---

# Threads

Threads supports text posts, images, videos, carousels, and multi-post reply threads. Octopost handles Meta's two-step container publishing, processing status polling, and reply threading automatically -- you just send us your content.

## Content Limits

| Constraint | Limit |
|---|---|
| Post text | **500 characters** |
| Carousel items | **10 images or videos** |
| Image formats | JPEG, PNG |
| Video formats | MP4, MOV |
| Media URLs | Must be publicly accessible |

## Good to Know

- **URLs count toward the 500-character limit.** Plan your text length accordingly. URLs in post text will render as link previews.
- **No editing after publish.** Once a post goes live on Threads, it cannot be edited via the API. Double-check your content before sending.
- **Unpublished containers expire after 24 hours.** This is a Meta-side constraint. If Octopost encounters a publishing delay, it will retry well within this window.
- **Media must be at a public URL.** Threads fetches images and videos from the URL you provide. If the URL is behind auth or a CDN that blocks Meta's servers, the post will fail.
- **Instagram Business or Creator account required.** Users connect their Threads account through Octopost's account settings. A personal Instagram account won't work -- they'll need to upgrade to Business or Creator first.

## Platform-Specific Features

### Reply Threads

Send multiple posts as a thread. Octopost publishes them in sequence, linking each reply to the previous post:

```json
{
  "thread": [
    { "content": "Starting a thread on Threads..." },
    { "content": "Here's the second part." },
    { "content": "And the conclusion." }
  ],
  "platforms": ["threads"]
}
```

Octopost creates each post and wires up the `reply_to_id` chain for you.

### Carousels

Include up to 10 images or videos. Octopost assembles the individual item containers and the parent carousel container behind the scenes:

```json
{
  "content": "Photo dump from the weekend",
  "platforms": ["threads"],
  "media": {
    "images": [
      "https://example.com/photo1.jpg",
      "https://example.com/photo2.jpg",
      "https://example.com/photo3.jpg"
    ]
  }
}
```

## Rate Limits

Meta does not publish specific rate limits for the Threads API. Octopost tracks request volume and uses conservative pacing to keep your account safe.

## Things Octopost Handles for You

You don't need to worry about any of this, but in case you're curious:

- **Meta OAuth flow.** Threads authentication goes through Meta's OAuth system with `threads_basic`, `threads_content_publish`, and `threads_manage_replies` scopes. Octopost manages the entire connection and token lifecycle.
- **Two-step container publishing.** Threads requires you to first create a media container, then publish it in a separate API call. Octopost does both steps and handles any failures between them.
- **Container processing status polling.** After creating a container, Threads may need time to process media before it can be published. Octopost polls the container status and only publishes once processing is complete.
- **Reply threading via `reply_to_id`.** When you send a multi-post thread, Octopost publishes the first post, captures its ID, then uses it as the `reply_to_id` for the next post, chaining the entire thread together.
- **Carousel container assembly.** Each carousel item must be created as its own container, then a parent carousel container is created referencing all of them. Octopost handles this multi-step process from a single request.
- **Content validation.** Octopost validates the 500-character limit before sending anything to Meta, so you get an immediate error instead of a delayed API failure.
- **Error reporting.** If something goes wrong -- media URL not accessible, account not properly connected, container creation fails -- Octopost reports a clear error describing what happened and why.

## Example

```json
{
  "content": "Hello from Octopost!",
  "platforms": ["threads"],
  "media": {
    "images": ["https://example.com/photo.jpg"]
  }
}
```

That's it. Octopost takes care of the rest.
