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.
{
"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.
{
"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
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.
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.
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:
{
"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.
{
"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.
- API —
PATCH /v1/posts/:idwith a newschedule_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 -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.
schedule_at from your own system, either send UTC explicitly (Z) or include an offset. Ambiguous local times will be rejected with a 400.