API Overview
The PodAnchor API is the audio primitive for AI-native products. Convert any URL, text, or content feed into a podcast episode and deliver it to per-user private RSS feeds with no audio infrastructure required. Built for agents that deliver personalized episodes, developers adding audio to their products, and teams that want their users listening instead of reading.
Authentication
Include your API key as a Bearer token in the Authorization header of every request.
Authorization: Bearer pa_live_xxxxxxxxxxxxxxxxxxxx
API keys start with pa_live_ for production and pa_test_ for sandbox. Get your key from the account dashboard at app.podanchor.com.
Quick Start
Create your first episode in under 60 seconds.
# Create an episode curl -X POST https://api.podanchor.com/v1/episodes \ -H "Authorization: Bearer pa_live_xxxx" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/article"}' # Response { "episode_id": "ep_7f3k9m2n", "status": "processing", "poll_url": "https://api.podanchor.com/v1/episodes/ep_7f3k9m2n" }
from podanchor import PodAnchor client = PodAnchor(api_key="pa_live_xxxx") # Create episode (async โ returns immediately) episode = client.episodes.create( url="https://example.com/great-article", webhook_url="https://yourdomain.com/webhook", ) print(episode.episode_id) # ep_7f3k9m2n print(episode.status) # processing # Or wait synchronously (polls every 5s, up to timeout) episode = client.episodes.wait("ep_7f3k9m2n", timeout=120) print(episode.audio_url) # https://cdn.podanchor.com/...
Create Episode
Convert a URL into a podcast episode. Episode creation is asynchronous. The API returns immediately with a processing status. Use the poll_url or webhooks to get notified when done.
Request Body
{
"url": "https://example.com/article", // required
"feed_id": "feed_abc123", // optional
"title": "My Custom Episode Title", // optional
"voice": "zoe", // optional: marcus|zoe|maren|grant|finn
"quality": "hd", // optional: "standard" | "hd"
"webhook_url": "https://..." // optional
}
Response ยท 202 Accepted
{
"episode_id": "ep_7f3k9m2n",
"status": "processing",
"feed_id": "feed_abc123",
"created_at": "2026-02-22T10:00:00Z",
"estimated_ready_at": "2026-02-22T10:02:00Z",
"poll_url": "https://api.podanchor.com/v1/episodes/ep_7f3k9m2n"
}
Get Episode
Retrieve episode status and metadata. Poll this endpoint until status is ready or failed.
{
"episode_id": "ep_7f3k9m2n",
"status": "ready",
"title": "The Future of AI Agents",
"description": "A deep dive into how AI agents...",
"url": "https://example.com/article",
"audio_url": "https://cdn.podanchor.com/episodes/ep_7f3k9m2n.mp3",
"audio_duration_seconds": 312,
"audio_size_bytes": 4981760,
"feed_id": "feed_abc123",
"created_at": "2026-02-22T10:00:00Z",
"ready_at": "2026-02-22T10:01:47Z",
"voice": "zoe",
"quality": "hd"
}
List Episodes
List episodes with optional filtering. Cursor-paginated.
Query params: feed_id=feed_abc123 # filter by feed limit=20 # default 20, max 100 cursor=ep_abc # pagination cursor
Delete Episode
Permanently delete an episode and its audio file. Returns 204 No Content. Irreversible.
Create Feed
Create isolated podcast feeds per user. Available to API customers.
Request
{
"title": "Alice's Podcast",
"user_ref": "alice_001", // your internal user ID
"description": "...", // optional
"language": "en" // optional; default "en"
}
Response ยท 201
{
"feed_id": "feed_xyz789",
"rss_url": "https://api.podanchor.com/feeds/feed_xyz789.xml",
"title": "Alice's Podcast",
"user_ref": "alice_001",
"created_at": "2026-02-22T10:00:00Z",
"episode_count": 0
}
List Feeds
Delete Feed
Permanently delete a feed and all its episodes. Returns 204 No Content. Irreversible.
Account Info
Webhooks
Provide a webhook_url when creating an episode to receive a POST when it's ready. Useful for agents that want to proactively notify users.
{
"event": "episode.ready",
"episode_id": "ep_7f3k9m2n",
"feed_id": "feed_abc123",
"audio_url": "https://cdn.podanchor.com/episodes/ep_7f3k9m2n.mp3",
"title": "Article Title Here",
"duration_seconds": 312,
"timestamp": "2026-02-22T10:01:47Z"
}
# Verify signature (HMAC-SHA256)
X-PodAnchor-Signature: sha256=abc123...
The difference a listener profile makes
A basic API call turns any article into audio.
What makes the episode feel like it was made for someone โ the greeting, the framing, the topics emphasized โ comes from a listener profile. Name, bio, interests. PodAnchor uses it to write the intro and weight what matters.
A default request produces a solid episode. Add a listener profile and your user gets their name at the top, context that fits their background, and more of what they actually care about. Pair it with a host profile. Give your user's narrator a name and a style, and the whole thing feels like a show made for them.
// Without a listener profile { "url": "https://example.com/article", "feed_id": "feed_abc" } // โ "Here's today's episode on AI infrastructure..." // With a listener profile { "url": "https://example.com/article", "feed_id": "feed_abc", "listener_profile_id": "lp_sarah_k" } // โ "Sarah, here's today's episode on AI infrastructure..."
Listener profiles are created once per user and reused across every episode. One profile for Alice. One for Bob. Every episode they receive is written for them specifically.
MCP Server Coming soon
The PodAnchor MCP server is available in the open-source repo. The npm package shown below is not yet published. The config below previews the planned install experience.
{
"mcpServers": {
"PodAnchor": {
"command": "npx",
"args": ["-y", "@podanchor/mcp-server"],
"env": {
"PODANCHOR_API_KEY": "pa_live_xxxx"
}
}
}
}
Available MCP Tools
add_to_podcast
Primary
Convert a URL into a podcast episode and add it to your private RSS feed.
list_recent_episodes
Show your recently added podcast episodes.
get_feed_url
Get your private RSS feed URL for subscribing in a podcast app.
OpenClaw Skill
PodAnchor is available as an OpenClaw skill. Any OpenClaw agent can convert URLs to podcast episodes and deliver them to a user's private RSS feed. Requires an API key. View on ClawHub โ
# Install the PodAnchor skill in your OpenClaw config skills: - name: PodAnchor env: PODANCHOR_API_KEY: "pa_live_xxxx"
Once installed, your OpenClaw agent can convert any URL to a podcast episode and deliver it to a user's private RSS feed with no additional configuration required beyond the API key.
Errors
All errors follow RFC 7807 (Problem Details for HTTP APIs).
{
"type": "https://api.podanchor.com/errors/quota_exceeded",
"title": "Monthly quota exceeded",
"status": 402,
"detail": "Your Obsessed plan includes a daily episode. Next episode scheduled for tomorrow.",
"reset_date": "2026-03-01T00:00:00Z"
}
| Status | Meaning | Common Cause |
|---|---|---|
400 |
Bad Request | Invalid URL, malformed JSON |
401 |
Unauthorized | Missing or invalid API key |
402 |
Payment Required | Monthly quota exceeded |
403 |
Forbidden | Feature requires higher plan |
404 |
Not Found | Invalid episode_id or feed_id |
422 |
Unprocessable | Content too short, paywalled |
429 |
Rate Limited | Too many requests per minute |
500 |
Server Error | Internal error; retry with backoff |
API Pricing
Pay-as-you-go credit packs. No monthly subscription, no expiry (12-month rolling). 1 credit = 1 minute of audio output (rounded up).
| Pack | Price | Credits | Per credit | Episodes equiv. |
|---|---|---|---|---|
| Starter | $5 | 50 | $0.100 | ~5 episodes |
| Standard | $20 | 220 | $0.091 | ~22 episodes |
| Pro | $50 | 600 | $0.083 | ~60 episodes |
| Volume | $100 | 1,300 | $0.077 | ~130 episodes |
| Operation | Credits | Notes |
|---|---|---|
| TTS call | 1/minute (rounded up) | ~8 credits per 1,000 words |
| Full episode (URL โ podcast) | 10 credits | Includes fetch, TTS, RSS packaging |
| Episode | 10 credits | Variable length, up to 15 min |
A more predictable billing unit
Most TTS APIs charge per character or per request, which makes costs hard to estimate before you build. PodAnchor charges per minute of audio output. You know what a 10-minute episode costs before you generate it. Rates drop at volume, and episode packaging, RSS delivery, and feed management are included.
Rate Limits
| Plan | Requests/minute | Concurrent episodes |
|---|---|---|
| Trial | 5 | 1 |
| Curious | 20 | 2 |
| Obsessed | 40 | 5 |
| API | 120 | 20 |
Rate limit info is returned in every response via X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.