Publishing

Threads & replies

Multi-tweet threads and reply chains

Threads and reply chains are first-class in OpenPost. A thread publishes as a native thread — reply-chained from tweet to tweet or post to post — not as separate posts with numbers in front.

What counts as a thread

X (Twitter)

Reply-chained tweets

Threads (Meta)

Native thread chain

Bluesky

Reply-chained posts

LinkedIn

Not supported (single post only)

Instagram

Not supported (single caption)

Others

Not supported; single post only

Split rules

The composer splits your content into thread parts using these rules, in order:

  1. Explicit break — three dashes on their own line (---) force a split.
  2. Double newline— a blank line between paragraphs.
  3. Character cap— if no splits are found and content exceeds the platform limit, we split on the nearest sentence boundary.
Explicit splits
Intro tweet — the hook.
 
---
 
Details of point 1.
Numbers and a link.
 
---
 
Details of point 2.
 
---
 
CTA tweet with link.
You can see the split preview in real-time on the right side of the composer — each tweet renders as its own card with its own character count.

Thread in the API

json
{
  "content": "Intro tweet — the hook.\n\n---\n\nDetails of point 1…",
  "integrations": ["int_x_abc"],
  "post_type": "thread"
}

Or pass an explicit array if you prefer to bypass parsing:

json
{
  "integrations": ["int_x_abc"],
  "post_type": "thread",
  "thread_parts": [
    { "content": "Intro tweet — the hook." },
    { "content": "Details of point 1…" },
    { "content": "Details of point 2…", "media": ["med_chart"] },
    { "content": "CTA tweet with link." }
  ]
}

Media per thread part

Each part can have its own media. Useful when part 2 of a thread shows a chart and part 3 shows a screenshot. Just attach different assets to different parts in the composer, or use thread_parts[n].media in the API.

Partial-failure handling

If part 3 of a 5-part thread fails, we stop publishing the later parts to avoid an out-of-order chain. The post moves to partial_failure with a list of which parts succeeded. You can manually retry from the failed index with a single click.

Replies

Reply to an existing post by passing its URL:

json
{
  "content": "Great point — we already shipped this.",
  "integrations": ["int_x_abc"],
  "reply_to": "https://x.com/someone/status/1234567890"
}

OpenPost validates the URL before scheduling — broken links are rejected at create-time, not at publish-time, so you don’t get a failure hours later.

Quote posts

Quote a post with quote_of:

json
{
  "content": "💯",
  "integrations": ["int_x_abc"],
  "quote_of": "https://x.com/someone/status/1234567890"
}

The referenced post is embedded as a native quote card. Works on X, Threads, and Bluesky.

Last updated April 2026 Edit this page