Quickstart
End-to-end cast0 flow. API key, create an episode, poll, subscribe.
The canonical end-to-end flow. If you only read one page, read this one. Each step is self-contained, so jump to whichever one you got stuck on.
Get an API key
Sign in at cast0.ai, create a podcast, and copy the API key (pk_…) from the podcast settings.
export CAST0_API_KEY=pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxThe key identifies you and the target podcast. There is no separate podcast_id in API requests. One podcast = one key. To send to a different podcast, use that podcast's key.
Create an episode
POST /api/episodes with a title and the text to narrate. Plain text only. No SSML, no markdown. The server returns immediately; audio renders in the background.
curl -X POST https://api.cast0.ai/api/episodes \
-H "Authorization: Bearer $CAST0_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Morning briefing: Tuesday",
"text": "Good morning. Three things on the calendar today..."
}'Response:
{
"episode": {
"id": "0d8b3a26-d4f1-4f8a-9e21-b1c6f1c5e3a2",
"title": "Morning briefing: Tuesday",
"status": "queued",
"audioUrl": null,
"durationSeconds": null,
"error": null,
"createdAt": "2026-04-30T07:14:00.000Z"
}
}text is capped at 15,000 characters per episode on the free tier (longer text is rejected with 413 text_too_long). Within the limit, cast0 chunks input transparently and stitches the output into one seamless episode.
Poll for completion (optional)
In most cases you don't need to wait. Once you POST an episode, cast0 renders it in the background and publishes it to your RSS feed automatically. Fire and forget.
Poll only if you need to know when an episode is ready (for example, to link to it elsewhere or to surface it in your own UI). Call GET /api/episodes/:id until status flips from queued to processing to done. Render time is roughly a few seconds per minute of finished audio.
curl https://api.cast0.ai/api/episodes/<id> \
-H "Authorization: Bearer $CAST0_API_KEY"When status = "done", audioUrl points to the rendered MP3 and durationSeconds is set. On failed, error contains a human-readable reason. Polling every 5 to 10 seconds is plenty.
Subscribe to the feed
Each podcast has its own RSS feed:
https://api.cast0.ai/rss/<feed-token>The feed token is shown in the dashboard. It is unguessable but not secret. Anyone with the URL can subscribe, but nobody can create episodes without your API key.
Paste the URL into Apple Podcasts, Overcast, Pocket Casts, or any podcast app's "Add by URL" flow. The feed updates the moment an episode finishes rendering.