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.

Base URL
https://api.podanchor.com/v1
REST API
JSON over HTTPS
Async
202 + webhooks
Bearer auth
API key per account
Machine-readable spec: openapi.json ยท Interactive docs

Authentication

Include your API key as a Bearer token in the Authorization header of every request.

HTTP Header
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.

cURL
# 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"
}
Python SDK Coming soon
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

POST /v1/episodes Async ยท 202

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

GET /v1/episodes/{episode_id}

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

GET /v1/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

DELETE /v1/episodes/{episode_id}

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.

POST /v1/feeds API

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
}
// Tip: add a listener profile to make every episode feel like it was written for this user → POST /v1/listener-profiles

List Feeds

GET /v1/feeds

Delete Feed

DELETE /v1/feeds/{feed_id}

Permanently delete a feed and all its episodes. Returns 204 No Content. Irreversible.

Account Info

GET /v1/account

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.

Webhook Payload
{
  "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.

claude_desktop_config.json
{
  "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 โ†’

OpenClaw config (preview)
# 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.