Schedule via API

Schedule social posts
with one API call.

Scheduling is one field on the publish call. Same addressing and media as an immediate post. Pass timezone (IANA) with a naive local time, or send UTC with a trailing Z. Invalid media is refused when you schedule, not at fire time.

Get started free →

Free tier. No card · one API for every network · full MCP access

In shortAdd scheduledAt (UTC with a trailing Z, or a naive local time plus timezone) to the same /v1/posts body. Credits charge when it fires. Invalid media is refused at create. Edit/cancel while state is scheduled.

When this guide is for you

You want calendar-style publishing from code or automation without a separate scheduler product.

Before you start

Same setup the docs quickstart uses. Do this once:

  1. Sign up at app.postlake.dev and verify your email (unlocks free credits).
  2. On Channels, create a profile (e.g. my-brand) and connect at least one account. Bluesky is the fastest first channel: no app review. Instagram/TikTok/Facebook need each platform's review before API posting.
  3. Account menu → API Keys → create a key (sk_live_…). It shows once; treat it like a password.

Schedule a post

Same call you'd use to publish now, plus scheduledAt (UTC, or a local time with timezone):

curl -X POST https://api.postlake.dev/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: friday-recap-001" \
  -d '{
    "text": "Friday recap",
    "profile": "my-brand",
    "scheduledAt": "2026-08-13T07:00:00",
    "timezone": "Europe/London"
  }'

# Response state should be "scheduled" until fire time.

Make it work in Scheduling

Tool-specific glue on top of the shared setup above:

  1. Build the same body you'd use to publish now (text + profile / accounts).
  2. Add scheduledAt. UTC with a trailing Z, or a naive local time together with timezone (IANA, e.g. Europe/London).
  3. Call POST /v1/posts/validate first for TikTok photo posts (JPEG/WebP, max 1080×1920; PNG is converted to JPEG with a warning).
  4. Expect state: "scheduled". At fire time it moves to processing then published / partial / failed.
  5. Before it fires: PATCH /v1/posts/{id} to edit, DELETE /v1/posts/{id} to cancel.
  6. Subscribe to webhooks (or poll) for fire-time results instead of assuming success at schedule time.

Read the response (don't skip this)

You get one Post with an overall state and a targets[] array. One entry per account. Always check each target; partial success is normal.

{
  "id": "post_a1b2c3",
  "state": "partial",
  "targets": [
    { "platform": "bluesky",  "state": "published", "url": "https://bsky.app/…" },
    { "platform": "linkedin", "state": "failed",
      "error": { "type": "invalid_request", "message": "…", "retryable": false } }
  ]
}

Where the post goes

Same rules as the docs. Pick one addressing style:

See Publishing: where to post.

Do more (same API)

Pitfalls specific to this path

Prefer an assistant over Scheduling code? Point it at MCP (https://api.postlake.dev/mcp). Prefer the dashboard? Use Quickstart → No code.

Common questions

How do I schedule a social media post with an API?

POST /v1/posts with scheduledAt. Send UTC with a trailing Z, or a naive local time plus timezone (IANA, e.g. Europe/London). PostLake queues it and publishes at that time. See docs → Scheduling.

What time format does scheduledAt use?

ISO-8601. UTC with a trailing Z, or a naive local time together with timezone. Unparseable values and naive times without a zone get a clear 400.

Can I cancel or change a scheduled post?

Yes, while state is scheduled: PATCH /v1/posts/{id} to edit, DELETE /v1/posts/{id} to cancel.

Go deeper in the docs

These guides stay short on purpose. Canonical behaviour lives here:

Also: Media · Errors · MCP · Analytics

Related guides

All guides · Full docs · llms.txt · Markdown

Stuck? The docs are the source of truth, start at Scheduling.

Open the dashboard →