> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lumisreach.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Video schedules

> Keep making videos and posting them to your accounts on a cadence, with no one in the loop.

A video schedule is a standing order: "make 2 videos every Monday, Wednesday and Friday and post them to
these accounts at 9am". It is the **Schedules** tab of **Dashboard → Create Video**, and schedules made
here show up there (and the other way round).

| Endpoint | What it does | Scope |
| - | - | - |
| `POST /v1/video-schedules` | Start a schedule | `videos:write` |
| `GET /v1/video-schedules` | Every schedule in the workspace | `videos:read` |
| `GET /v1/video-schedules/{id}` | One schedule, with its next run | `videos:read` |
| `PATCH /v1/video-schedules/{id}` | Change it, or pause and resume it | `videos:write` |
| `DELETE /v1/video-schedules/{id}` | Remove it (its videos stay) | `videos:write` |
| `POST /v1/video-schedules/{id}/skip` | Skip one posting day | `videos:write` |
| `GET /v1/video-schedules/{id}/videos` | The videos it has made | `videos:read` |

## How a posting day runs

1. **Planning** (`notify_hours_before` ahead, default 1 hour): an AI director reads your marketing
   profile, your `direction` and what is trending, and decides each video: template, angle, script and
   caption. You are told what is coming (by email with `notify_by_email`).
2. **Posting** (`post_hour` in `time_zone`): each video is made, its script approved by the schedule
   itself, rendered, and posted to every account in `connection_ids`.

Pausing the schedule or skipping the day before it runs means nothing is made, charged or posted.

## Pricing

Creating and changing schedules is free. **Each video a schedule makes is charged when its script is
approved, like any other video**: at the cost of the providers that make it plus a small markup, from
your included video credits first, then your prepaid balance. `estimated_price_cents_per_video` on the
schedule is about what each costs; when the director picks the template per video
(`estimate_depends_on_template: true`) the real price depends on its pick. Pin the template with
`allowed_templates` (or model the schedule on a video with `source_video_id`) for a steadier price. See
[Videos](/api-reference/videos#pricing) for how videos are priced.

## Start a schedule

Get account ids from `GET /v1/social-connections`.

```bash theme={null}
curl -X POST "https://api.lumisreach.com/api/v1/video-schedules" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Weekday tips",
    "videos_per_day": 1,
    "days_of_week": [1, 3, 5],
    "post_hour": 9,
    "time_zone": "America/New_York",
    "starts_on": "2026-10-05",
    "connection_ids": ["CONNECTION_ID"],
    "direction": "Quick tips for dental offices on answering more calls",
    "allowed_templates": ["talking_avatar", "slideshow"],
    "video_settings": { "target_duration_seconds": 30, "subtitle_style": "bold_words" }
  }'
```

`video_settings` pins parts of every video's recipe (format, length, presenter, style, source); the
director decides the rest. `PATCH` merges new `video_settings` over the pinned ones.

## Pause, skip, stop

```bash theme={null}
# Pause (and later "active" to resume)
curl -X PATCH "https://api.lumisreach.com/api/v1/video-schedules/SCHEDULE_ID" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{ "status": "paused" }'

# Skip the next posting day ({} skips the next one; or send a "day")
curl -X POST "https://api.lumisreach.com/api/v1/video-schedules/SCHEDULE_ID/skip" \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{}'
```

If a video does not go out, `last_error` says why and the schedule keeps running. The videos it made
are ordinary videos: list them with `GET /v1/video-schedules/{id}/videos` and read one with
`GET /v1/videos/{id}`.
