# Threads (/docs/platforms/threads)




What you can post [#what-you-can-post]

| Type         | Supported | Max media | Notes                                    |
| ------------ | --------- | --------- | ---------------------------------------- |
| Text only    | ✅         | 0         | First URL in text becomes a link preview |
| Single image | ✅         | 1         | JPEG, PNG. Max 8 MB                      |
| Single video | ✅         | 1         | MP4/MOV. Max 1 GB, max 5 min             |
| Carousel     | ✅         | 20        | Mix of images and videos. Min 2 items    |

<Callout title="Limitations" type="warn">
  * **500 character limit.** Emojis count as their UTF-8 byte length, not as 1 character. A single emoji like 🚀 uses 4 bytes, so heavy emoji use reduces your effective limit.
  * **250 API-published posts per 24-hour moving period.** Carousels count as 1 post. This is a Threads API limit, not a PublishQ limit.
</Callout>

<Callout title="Posting to Threads alongside other platforms" type="info">
  Threads has a **500-character limit**, but platforms like Facebook or LinkedIn allow much longer content. You don't need to create a separate post — use `postOverrides` on the Threads account entry to provide shorter content just for Threads while keeping the full text for other platforms.

  ```json
  {
    "content": "Your long-form content for Facebook, LinkedIn, etc...",
    "accounts": [
      { "accountId": "facebook-account-id" },
      { "accountId": "linkedin-account-id" },
      {
        "accountId": "threads-account-id",
        "postOverrides": {
          "content": "Short version for Threads 🧵"
        }
      }
    ],
    "publishNow": true
  }
  ```
</Callout>

Quick start [#quick-start]

Post text [#post-text]

<Tabs items="['cURL']">
  <Tab value="cURL">
    ```bash
    curl -X POST https://publishq.com/api/v1/posts \
      -H "Authorization: Bearer pq_live_..." \
      -H "Content-Type: application/json" \
      -d '{
        "content": "First post from the API 🚀",
        "accounts": [
          { "accountId": "your-threads-account-id" }
        ],
        "publishNow": true
      }'
    ```
  </Tab>
</Tabs>

Post an image with text [#post-an-image-with-text]

<div className="fd-steps">
  <div className="fd-step">
    Get your media ready [#1-get-your-media-ready]

    You can upload new media or use existing media from your library.

    <Tabs items="['Upload new media', 'Use existing media']">
      <Tab value="Upload new media">
        ```bash
        curl -X POST https://publishq.com/api/v1/media \
          -H "Authorization: Bearer pq_live_..." \
          -F "file=@photo.jpg"
        ```
      </Tab>

      <Tab value="Use existing media">
        ```bash
        curl https://publishq.com/api/v1/media \
          -H "Authorization: Bearer pq_live_..."
        ```

        Pick the `id` of the media you want to use from the response.
      </Tab>
    </Tabs>
  </div>

  <div className="fd-step">
    Create the post [#2-create-the-post]

    <Tabs items="['cURL']">
      <Tab value="cURL">
        ```bash
        curl -X POST https://publishq.com/api/v1/posts \
          -H "Authorization: Bearer pq_live_..." \
          -H "Content-Type: application/json" \
          -d '{
            "content": "Check this out",
            "mediaIds": ["media-id-from-step-1"],
            "accounts": [
              { "accountId": "your-threads-account-id" }
            ],
            "publishNow": true
          }'
        ```
      </Tab>
    </Tabs>
  </div>
</div>

Post a carousel [#post-a-carousel]

Attach 2–20 media items. You can mix uploaded and existing media. Photos and videos can also be mixed.

<div className="fd-steps">
  <div className="fd-step">
    Get your media ready [#1-get-your-media-ready-1]

    Upload new files or list your existing media using the steps above. You need at least 2 media IDs.
  </div>

  <div className="fd-step">
    Create the post [#2-create-the-post-1]

    <Tabs items="['cURL']">
      <Tab value="cURL">
        ```bash
        curl -X POST https://publishq.com/api/v1/posts \
          -H "Authorization: Bearer pq_live_..." \
          -H "Content-Type: application/json" \
          -d '{
            "content": "Photo dump",
            "mediaIds": ["media-id-1", "media-id-2", "media-id-3"],
            "accounts": [
              { "accountId": "your-threads-account-id" }
            ],
            "publishNow": true
          }'
        ```
      </Tab>
    </Tabs>
  </div>
</div>

Platform-specific settings [#platform-specific-settings]

Pass these inside `platformSpecificSettings` on the Threads account entry.

{/* Fields: topicTag (string, optional) - Topic tag without # prefix, max 50 chars, no periods (.) or ampersands (&). Overrides auto-detected topics from inline hashtags. */}

<PlatformSettingsTable platform="THREADS" />

<small>
  Full schema: 

  [ThreadsPlatformSpecificSettings](/docs-scalar#model/ThreadsPlatformSpecificSettings)
</small>

```json
{
  "content": "My best shots from this week",
  "mediaIds": ["media-id-1", "media-id-2", "media-id-3"],
  "accounts": [
    {
      "accountId": "threads-account-id",
      "platformSpecificSettings": {
        "topicTag": "photography"
      }
    }
  ],
  "publishNow": true
}
```

Media specs [#media-specs]

Images [#images]

| Spec          | Value                         |
| ------------- | ----------------------------- |
| Formats       | JPEG, PNG                     |
| Max file size | 8 MB                          |
| Max width     | 1440px (downscaled if larger) |
| Min width     | 320px (upscaled if smaller)   |
| Aspect ratio  | Up to 10:1                    |

Videos [#videos]

| Spec           | Value                             |
| -------------- | --------------------------------- |
| Formats        | MP4, MOV                          |
| Max file size  | 1 GB                              |
| Duration       | 0–300 seconds (5 min)             |
| Frame rate     | 23–60 FPS                         |
| Max resolution | 1920px wide                       |
| Aspect ratio   | 0.01:1 to 10:1 (9:16 recommended) |
| Video codec    | H.264 or HEVC                     |
| Audio codec    | AAC, max 48kHz, mono or stereo    |

Not yet supported [#not-yet-supported]

* **GIF attachments** — Threads only supports GIFs from GIPHY. Personal GIF uploads are not allowed by the Threads API.
* **First comment** (coming soon)
* **Reposts and quote posts**
* **Polls**
* **Spoiler tags**
