Skip to content

API: Publishing & schedules

Controllers: admin-schedules.controller.ts + admin-episode-media.controller.ts.

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).

Same but for episodes.

Illegal transitions return 400 invalid_transition.

Permission: catalog:read.

Returns episode detail including linked media.

Permission: catalog:write.

Link media assets to an episode.

{
"mediaAssetId": "0195...",
"thumbAssetId": "0196..."
}

Mount admin/schedules.

MethodPathPerm
GET/admin/schedulespublishing:read
POST/admin/schedulespublishing:write
POST/admin/schedules/bulkpublishing:write
DELETE/admin/schedules/:idpublishing:write
{
"refType": "episode",
"refId": "0194...",
"action": "publish",
"runAt": "2026-07-15T14:00:00Z"
}
{
"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.

Runs every minute. Picks up pending schedules whose runAt has passed and executes the workflow transition. See Cron jobs.