---
title: "Start scheduling posts"
method: POST
path: "/api/apps/{app_id}/social-calendar/posts/schedule"
---

# Start scheduling posts

`POST /api/apps/{app_id}/social-calendar/posts/schedule`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Hands the app's approved posts to the publisher, so each one goes out at its own scheduled time.

The work runs in the background. This endpoint answers 202 with a `job_id`; poll [Get scheduling job](/api-reference/get-scheduling-job) to see how it went. A second start for the same app fails with a 409 while the first one is still starting.

Calling it again for the same window normally returns the job already in flight instead of starting a second one, but treat that as best-effort rather than a guarantee: a retry sent in the moment before the job starts running can come back with a new `job_id`. Nothing is published twice when that happens, because both runs resolve the same automation for a given post.

It takes the posts whose `scheduled_at` falls in `[scheduled_from, scheduled_until)` and that aren't handed over yet, which means the posts you approved plus the ones an earlier run couldn't place. A post still in `proposal` isn't taken at all, so approve it first. A range holding more than 100 such posts fails with a 422; schedule it in smaller ranges.

Placing a post can fail for reasons this endpoint can't check up front, and each one is counted in the job's `result` rather than failing the request:

- The workspace is on the free plan. Publishing scheduled posts needs a paid workspace plan, and those posts are counted in `plan_limited`.
- The app has no connected account for the post's platform with publishing permission, or it has more than one. Those posts move to `needs_reconnect` and are counted there, and a later run picks them up once you fix the connection.
- The post's platform can't be published to at all, or its scheduled time has already passed. Those posts move to `failed`, which is final.

The social calendar endpoints share two rate limits: 20 requests per minute across creating, editing, deleting and approving posts, and 40 requests per minute across the rest. This endpoint counts against the 40.

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

## Path parameters

- `app_id` string, required — ID of the app whose social calendar you want.

## Request body

- SchedulePostsRequest
  - `scheduled_from` string, date-time, required — Start of the range to schedule, inclusive, as an ISO 8601 timestamp carrying an offset. A timestamp without one fails with a 422.
  - `scheduled_until` string, date-time, required — End of the range, exclusive, as an ISO 8601 timestamp carrying an offset. It has to be later than `scheduled_from`.

## Response `202`

The scheduling job that is now running, or the one already in flight for this range.

- SchedulePostsResponse
  - `job_id` string, required — ID of the scheduling job. Pass it as `job_id` to [Get scheduling job](/api-reference/get-scheduling-job).
  - `status` string, required — State of the job: `pending` before it starts, `running` while it hands posts over, then `completed` or `failed`. A range holding nothing to schedule comes back `completed` straight away.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have editor access to this app, or you used a workspace API key.
- `404` — App not found, or the social calendar is not enabled for your account.
- `409` — Scheduling is already starting for this app. Retry the request.
- `422` — Validation Error
- `429` — Rate limit exceeded (40 requests per minute).

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/base44/base44-app-management-api/revisions/173e4e9c63c2/schema)
