Hosted API โ€” Early Access

The hosted API is not yet publicly available. This page documents the API spec for the upcoming launch. Join the waitlist to get early access. In the meantime, you can self-host from the repo.

API Overview

The PodAnchor API turns any URL into a podcast episode and manages per-user RSS feeds. It's built for AI agents, developers, and teams that need reliable audio delivery without building infrastructure.

Base URL
https://api.podanchor.com/v1
REST API
JSON over HTTPS
Async
202 + webhooks
Bearer auth
API key per account

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 once the API launches โ€” join the waitlist to be notified.

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": "nova",                             // optional: alloy|echo|fable|nova|onyx|shimmer
  "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": "nova",
  "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

Available on Agent/API and Team plans. Create isolated podcast feeds per user.

POST /v1/feeds Agent/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://feeds.podanchor.com/feed_xyz789.xml",
  "title": "Alice's Podcast",
  "user_ref": "alice_001",
  "created_at": "2026-02-22T10:00:00Z",
  "episode_count": 0
}

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

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": {
        "LINKTOPOD_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 Early access

PodAnchor is available as an OpenClaw skill for VanDamme instances. The SKILL.md is live in the repo today. Full hosted-API integration requires an API key (waitlist).

Install via OpenClaw
# Install the skill in your VanDamme config
skills:
  - name: PodAnchor
    source: https://github.com/brocktaylor7/pod-anchor/blob/main/SKILL.md
    env:
      LINKTOPOD_API_KEY: "pa_live_xxxx"

The full SKILL.md document defines how VanDamme instances interact with the API, manage per-user feeds, handle errors, and respond to users. It's designed to require zero additional configuration from the agent 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 Personal plan allows 50 credits per month.",
  "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

Rate Limits

Plan Requests/minute Concurrent episodes
Free 5 1
Personal 20 2
Agent/API 60 10
Team 120 20

Rate limit info is returned in every response via X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.