Processing
Processing queue management
POST /feeds/{slug}/reprocess-all
Section titled “POST /feeds/{slug}/reprocess-all”Reprocess all episodes for a feed
Queue all processed episodes of a podcast for reprocessing. Useful when ad detection logic has improved and you want to re-detect ads across all episodes.
Parameters
Section titled “Parameters”slug(path, string, required): Podcast feed slug identifier
Request body (application/json)
Section titled “Request body (application/json)”mode(string, one ofreprocess,full,llm): Processing mode: - reprocess: Use pattern DB + AI (leverages learned patterns) - full: AI only, skip pattern DB (fresh analysis) - llm: Re-detect + re-cut using each saved transcript (skips re-transcription); episodes without a transcript are skipped Defaultreprocess.
Responses
Section titled “Responses”| Status | Description | Body |
|---|---|---|
| 200 | Episodes queued for reprocessing | object |
| 400 | Bad request - invalid input | Error |
| 404 | Resource not found | Error |
200 response body
Section titled “200 response body”message(string)queued(integer): Number of episodes queuedskipped(integer): Number of episodes skippedmode(string)episodes(object)episodes.queued(array of object)episodes.queued[].episodeId(string)episodes.queued[].title(string)episodes.skipped(array of object)episodes.skipped[].episodeId(string)episodes.skipped[].reason(string)
POST /feeds/{slug}/episodes/{episode_id}/reprocess
Section titled “POST /feeds/{slug}/episodes/{episode_id}/reprocess”Force reprocess an episode (legacy)
Legacy URL for the mode-aware reprocess endpoint. Accepts the same modes
as /episodes/{slug}/{episode_id}/reprocess; the default is reprocess.
Parameters
Section titled “Parameters”slug(path, string, required): Podcast feed slug identifierepisode_id(path, string, required): Episode identifier: a 12-character MD5-hex string for a subscribed feed’s episode, or an sNNeNN id (e.g. s01e05) for a local feed’s.
Request body (application/json)
Section titled “Request body (application/json)”mode(string, one ofreprocess,full,llm,recut): Defaultreprocess.
Responses
Section titled “Responses”| Status | Description | Body |
|---|---|---|
| 202 | Reprocessing started or queued | object |
| 400 | Bad request - invalid input | Error |
| 404 | Resource not found | Error |
| 409 | Episode is currently processing | Error |
| 500 | Internal server error | Error |
202 response body
Section titled “202 response body”message(string)episodeId(string)mode(string)status(string, one ofprocessing,queued)reason(string)jobState(string, one ofqueued,processing)
POST /feeds/{slug}/episodes/{episode_id}/queue-priority
Section titled “POST /feeds/{slug}/episodes/{episode_id}/queue-priority”Change a queued episode’s priority
Direct per-row write on the pending auto_process_queue row (#696). Send priority for an absolute value or delta to nudge the stored one; a delta is applied in SQL so a stepper cannot lose a click to a stale read. Exactly one of the two is required. Unlike the monotonic MAX() rule on re-enqueue, either can raise or lower, and both clamp to [-1000, 1000]. A later feed-level queuePriority change restamps the row and overwrites this value.
Parameters
Section titled “Parameters”slug(path, string, required)episode_id(path, string, required)
Request body (application/json, required)
Section titled “Request body (application/json, required)”priority(integer): New dequeue priority; higher processes sooner.delta(integer): Amount to add to the stored priority. Applied server-side, then clamped to the same bounds.
Responses
Section titled “Responses”| Status | Description | Body |
|---|---|---|
| 200 | Priority updated | object |
| 400 | Body is not a JSON object, neither or both of priority/delta were given, or the value is not an integer within bounds | |
| 404 | Feed not found, or the episode has no pending queue row |
200 response body
Section titled “200 response body”message(string)episodeId(string)slug(string)priority(integer): The priority now stored, after clamping.
POST /feeds/{slug}/episodes/{episode_id}/cancel
Section titled “POST /feeds/{slug}/episodes/{episode_id}/cancel”Cancel episode processing
Cancel a running or queued episode. If the episode is processing, the
worker thread is signalled to stop and the row is reset to pending. If
the episode is queued (waiting on the processing lock), it is dropped
from the display queue and its auto_process_queue row is closed so
the background worker will not pick it up. Returns 400 only when the
episode is neither processing nor queued.
Parameters
Section titled “Parameters”slug(path, string, required): Podcast feed slug identifierepisode_id(path, string, required): Episode identifier: a 12-character MD5-hex string for a subscribed feed’s episode, or an sNNeNN id (e.g. s01e05) for a local feed’s.
Responses
Section titled “Responses”| Status | Description | Body |
|---|---|---|
| 200 | Episode canceled (running) or removed from queue (queued) | object |
| 400 | Episode is neither processing nor queued | Error |
| 404 | Resource not found | Error |
200 response body
Section titled “200 response body”message(string): “Episode canceled and reset to pending” (running) or “Episode removed from queue” (queued).episodeId(string)slug(string)
GET /episodes/processing
Section titled “GET /episodes/processing”List processing and queued episodes
Returns active jobs, then waiting jobs in dequeue order. offset and limit page the waiting list. Queued rows include queuePosition and admission. queueTotal is the full waiting count and excludes active jobs.
Parameters
Section titled “Parameters”offset(query, integer): Waiting-list rows to skip (0-based). Defaults to 0.limit(query, integer): Maximum waiting-list rows to return. Defaults to 200, capped at 1000.
Responses
Section titled “Responses”| Status | Description | Body |
|---|---|---|
| 200 | List of processing episodes | array of ProcessingEpisode |