# Scheduling posts · PostLake Docs > Markdown version of https://postlake.dev/docs/scheduling — canonical page for humans. > PostLake is the social media API for AI agents: https://postlake.dev/llms.txt Add a `scheduledAt` and the post is queued and fires later. Credits are charged when it publishes — not when you schedule it. ## Schedule a post Add an ISO-8601 **UTC** timestamp. The post comes back with `state: "scheduled"`. ``` { "text": "Friday recap", "accounts": ["acc_123"], "scheduledAt": "2026-08-01T09:00:00Z" } ``` ## Timezones — do this right The API only accepts **UTC** (the trailing `Z`). "9am for the user" depends on *their* timezone, so convert before sending. In JavaScript: ``` // 9:00am on 1 Aug in the user's timezone → UTC ISO const local = new Date("2026-08-01T09:00:00"); // parsed in the runtime's TZ const scheduledAt = local.toISOString(); // e.g. "2026-08-01T08:00:00.000Z" if BST ``` Sending a local time without converting is the #1 scheduling bug — posts fire an hour off. Always convert to UTC first. (The dashboard composer does this for you.) ## Edit or cancel before it fires While a post is `scheduled` you can change it or pull it entirely, by id: | Action | Endpoint | | --- | --- | | Edit the text, media, or time | `PATCH /v1/posts/{id}` | | Cancel it | `DELETE /v1/posts/{id}` | ## What happens at fire time At the scheduled moment the post moves `scheduled → processing → published` (or `partial` / `failed`). Credits are debited then, only for targets that publish. If a target fails at fire time it's marked `failed` with an `error` and costs nothing. Subscribe to [webhooks](https://postlake.dev/docs/api#res-webhooks) to be notified when a scheduled post fires, without polling.