API: Publishing & schedules
Controllers: admin-schedules.controller.ts + admin-episode-media.controller.ts.
Workflow endpoints
Section titled “Workflow endpoints”POST /v1/admin/series/:id/workflow
Section titled “POST /v1/admin/series/:id/workflow”Permission: publishing:write.
Request:
{ "action": "submit"}Legal action: submit (draft→in_review), send_back (in_review→draft), publish (in_review→published), unpublish (scheduled→in_review), archive (published→archived), restore (archived→draft).
POST /v1/admin/episodes/:id/workflow
Section titled “POST /v1/admin/episodes/:id/workflow”Same but for episodes.
Illegal transitions return 400 invalid_transition.
Episode media
Section titled “Episode media”GET /v1/admin/episodes/:id
Section titled “GET /v1/admin/episodes/:id”Permission: catalog:read.
Returns episode detail including linked media.
PUT /v1/admin/episodes/:id/media
Section titled “PUT /v1/admin/episodes/:id/media”Permission: catalog:write.
Link media assets to an episode.
{ "mediaAssetId": "0195...", "thumbAssetId": "0196..."}Schedules
Section titled “Schedules”Mount admin/schedules.
| Method | Path | Perm |
|---|---|---|
| GET | /admin/schedules | publishing:read |
| POST | /admin/schedules | publishing:write |
| POST | /admin/schedules/bulk | publishing:write |
| DELETE | /admin/schedules/:id | publishing:write |
Create schedule
Section titled “Create schedule”{ "refType": "episode", "refId": "0194...", "action": "publish", "runAt": "2026-07-15T14:00:00Z"}Bulk schedule (drop cadence)
Section titled “Bulk schedule (drop cadence)”{ "episodeIds": ["0194a...", "0194b...", "0194c..."], "action": "publish", "startAt": "2026-07-15T14:00:00Z", "cadence": "every_n_days", "cadenceValue": 3}Supported cadence: daily, every_n_days, weekly, custom (with explicit datetime array).
Response: array of created publish_schedules rows.
Publish-scheduler cron
Section titled “Publish-scheduler cron”Runs every minute. Picks up pending schedules whose runAt has passed and executes the workflow transition. See Cron jobs.