Publishing

Scheduling

Pick a time, a queue slot, or best-time

OpenPost gives you four ways to time a post. Each one is a different tradeoff between control and convenience. Pick the one that fits the content you’re shipping.

1. Publish now

The simplest option. Hit Publish in the composer and the post ships within seconds. We target sub-10-second end-to-end latency for text posts; videos add transcoding time.

json
{
  "content": "We're live!",
  "integrations": ["int_x_abc"]
  // no schedule_at — publishes immediately
}

2. Explicit schedule

Pick an exact date and time. Use this when the post has to land at a specific moment — a product launch, a press embargo, a timezone-sensitive announcement.

json
{
  "content": "v2 is live.",
  "integrations": ["int_x_abc"],
  "schedule_at": "2026-04-20T14:00:00Z"
}

All timestamps are ISO 8601 with a timezone offset. Z means UTC; you can also pass local offsets like -04:00.

Scheduling window

Schedule a post at least 60 seconds in the future. The scheduler picks up work once per minute, so sub-minute schedules publish immediately. Posts can be scheduled up to 180 daysahead — further-out dates are rejected at create time.

3. Next slot

Queues are recurring time windows per channel (see Queues & time slots). “Next slot” drops your post into whatever slot is next open.

1

Set up your queue first

Under Connections → [channel] → Queue, add the recurring times you want to post. E.g., Mon/Wed/Fri at 9am and 2pm.

2

Pick 'Next slot' in the composer

OpenPost shows the resolved time so you can confirm. If all slots in the next 14 days are full, we’ll tell you.

In the API:

json
{
  "content": "Weekly roundup",
  "integrations": ["int_x_abc"],
  "schedule": "next_slot"
}

4. Recurring queue (for regular content)

For content that ships on a cadence — weekly newsletters, daily tips — you can create a post with recurrence and OpenPost will schedule copies into every matching slot for the next N weeks.

json
{
  "content": "This week's build log…",
  "integrations": ["int_x_abc"],
  "recurrence": {
    "rule": "FREQ=WEEKLY;BYDAY=FR",
    "until": "2026-12-31T00:00:00Z"
  }
}

How the scheduler runs

The scheduler runs every minute on Postgres pg_cron. It selects posts where schedule_at has passed and status = 'scheduled', claims each one atomically, and hands it off to the per-channel publisher. See How it works for the full pipeline.

Changing a schedule

You can reschedule a post any time before its schedule_at:

  • Dashboard— drag the post to a new slot on the Calendar view, or edit it from the Posts list.
  • APIPATCH /v1/posts/:id with a new schedule_at.

If the scheduler has already claimed the post (status = 'publishing'), edits are rejected with a 409 — the post is already in flight.

Canceling a scheduled post

curl
curl -X DELETE https://api.openpost.so/v1/posts/po_abc123 \
  -H "Authorization: Bearer $OP_KEY"

Cancelled posts move to canceled and stay in the Posts list for 30 days before being purged. Cancellation is instant.

Timezones

All stored times are UTC. The dashboard renders in your workspace’s display timezone. Queues can have their own timezones if your audience is elsewhere — e.g., a European podcast scheduling for 3pm ET while you’re based in London.

When passing schedule_at from your own system, either send UTC explicitly (Z) or include an offset. Ambiguous local times will be rejected with a 400.
Last updated April 2026 Edit this page