For the complete documentation index, see llms.txt. This page is also available as Markdown.

Schedules and slots

Read, edit, and cancel existing schedules, distinguish UTC slots from queued posts, and preserve user-approved content.

Compact reference for agents making REST requests. All endpoint paths below are relative to https://backend.blotato.com/v2. For task instructions, read the workflow guide. For tool calls, use the MCP reference.

Managing scheduled posts

Resolve the user's requested date and timezone before changing a schedule. Replace example timestamps with the requested future time within the account's scheduling horizon. Use the existing schedule ID, not a post submission ID. Reading schedules does not authorize updates or cancellations.

List scheduled posts:
GET /schedules?limit=20&cursor=OPTIONAL_CURSOR

Response:
{
  "items": [
    {
      "id": "sch_abc123",
      "scheduledAt": "2026-04-01T14:00:00.000Z",
      "account": {
        "id": "98432",
        "name": "Jane Smith",
        "username": "janesmith",
        "profileImageUrl": "https://...",
        "subaccountId": null,
        "subId": null,
        "subaccountName": null
      },
      "draft": {
        "accountId": "98432",
        "content": { "text": "...", "mediaUrls": [], "platform": "twitter" },
        "target": { "targetType": "twitter" }
      }
    }
  ],
  "count": "12",
  "cursor": "eyJzY2hlZHVsZWRBd..."
}

NOTE: "draft" has the same structure as the "post" object in POST /posts.
NOTE: "scheduledAt" is the response field name. "scheduledTime" is the input field name for updates.

Get single schedule:
GET /schedules/:id
Response: { "schedule": { ...same fields as list item... } }

Update schedule (content, time, or both):
PATCH /schedules/:id
{
  "patch": {
    "scheduledTime": "2026-04-05T10:00:00Z",
    "draft": {
      "accountId": "98432",
      "content": { "text": "Updated text", "mediaUrls": [], "platform": "twitter" },
      "target": { "targetType": "twitter" }
    }
  }
}
Response: 204 No Content

RULES:
- At least one of scheduledTime or draft must be provided.
- scheduledTime must be valid ISO 8601 and in the future.
- draft must be a COMPLETE post object (accountId, content, target). The endpoint
  does NOT merge partial drafts. Read GET /schedules/:id first, preserve the
  returned schedule.draft fields, edit only the requested fields, and send the
  complete draft in patch.draft. Do not send the schedule wrapper as draft.
- DO NOT also call POST /posts (or blotato_create_post) when editing a schedule.
  PATCH /schedules/:id updates the existing schedule in place. Calling create
  publishes a separate post and you end up with duplicates at publish time.
- The update endpoint does NOT accept useNextFreeSlot. To reschedule to the next
  available slot, first call POST /schedule/slots/next-available to get the time,
  then pass it as scheduledTime.
- After PATCH, GET /schedules/:id and compare scheduledAt and draft with the
  requested changes. A 204 response has no updated schedule body.
- Changing scheduledTime clears the previous slot association. Editing content
  without changing the time preserves that association.

Delete schedule:
DELETE /schedules/:id
Response: 204 No Content (publishing job is also cancelled)
Cancel only the schedule the user authorized. This is not deletion of a live social post.

Schedule slots (content calendar time windows)

Return to the agent reference index.

Last updated