Publishing

Create a post

Compose one post, publish everywhere

The composer is where every post starts. It’s opinionated in one direction only: you write once, pick channels, and OpenPost handles the platform-specific differences for you. When a channel needs something different — a shorter caption for X, a first-comment hashtag on Instagram — you can override per-channel with one tap.

Open the composer

1

Click Create in the left nav

The full-screen composer opens. If you prefer a smaller modal, press C from anywhere in OpenPost.

2

Pick your channels

At the top, toggle the destinations. Each connected integration appears with its avatar. You can pick just one or all of them.

3

Write the content

The editor supports plain text, emoji, hashtags, and @mentions. As you type, the preview column on the right renders the post exactly as it will appear on each selected channel — character counts update live, media re-crops, links unfurl.

4

Attach media

Drag a file into the composer or click + Media. OpenPost accepts images up to 30 MB and videos up to 1 GB. We auto-transcode to each platform’s spec, so you don’t need to pre-export in multiple aspects.

5

Choose when to publish

Three options:

  • Publish now— ships within seconds.
  • Schedule— pick a date and time.
  • Next slot— we drop it into the next open queue slot for every selected channel.

Per-channel overrides

Below the main editor, each selected channel has its own tab. By default it shows “Uses main content.” Tap Edit for channelto override — text, media, hashtags, any field. The main editor stays unchanged. Useful when:

  • Your main content is too long for X but fits LinkedIn.
  • You want hashtags in Instagram’s first comment but in LinkedIn’s body.
  • A YouTube description should include a full chapter list that’s overkill on other channels.
Per-channel overrides are additive, not destructive. Going back to “Uses main content” restores the default — your override is remembered if you toggle back.

API equivalent

Everything the composer does maps to a single POST /v1/posts call. The minimum viable request:

json
{
  "content": "Ship day — v2 is live.",
  "integrations": ["int_x_abc", "int_ig_def"]
}

Add schedule, media, and overrides as you need:

json
{
  "content": "Ship day — v2 is live.",
  "integrations": ["int_x_abc", "int_ig_def"],
  "schedule_at": "2026-04-20T14:00:00Z",
  "media": ["med_hero"],
  "overrides": {
    "int_x_abc": {
      "content": "Ship day. v2 is live. Thread 🧵",
      "post_type": "thread"
    },
    "int_ig_def": {
      "first_comment": "#launch #saas #productivity"
    }
  }
}

Fields reference

FieldTypeDescription
content*stringThe main post text. Used as default for all channels.
integrations*string[]Array of integration IDs to publish to.
schedule_atISO 8601 timestampOmit to publish immediately.
mediastring[]Media asset IDs. Attached to all channels unless overridden.
post_typeenumFor channels that support variants: thread, carousel, reel, etc.
overridesRecord<integrationId, PostOverride>Per-channel content/media/settings.
reply_tostring (URL)For X, Threads, Bluesky — roots the post as a reply.
first_commentstringFor Instagram — hashtags in first comment.

What to read next

Last updated April 2026 Edit this page