REST API
Versioned public API for scripts and integrations. Cookie-session product routes are unchanged; this surface uses Bearer API keys only.
Base URL
https://app.audioworm.fm/api/v1Authentication
curl -H "Authorization: Bearer aw_..." https://app.audioworm.fm/api/v1/meCreate keys in Settings → API keys. Internal worker routes under /v1/* and JOBS_SECRET are not part of this API.
Endpoints
GET /me— org + key metadataGET|POST /projects— list / create (JSON text or multipart manuscript)GET|PATCH /projects/:id— detail / update title, voice, or manuscriptGET /projects/:id/chaptersGET /projects/:id/chapters/:chapterId/download?format=mp3|wav|txtGET|POST /projects/:id/deliverablesGET /projects/:id/deliverables/download?format=m4b|wav|mp3GET /voicesPOST /tts/previewPOST /projects/:id/production— start production via pay-as-you-go (off-session charge) or Checkout fallback ($50 minimum); returns{ mode, amount_cents, … }POST /projects/:id/checkout/production— hosted Checkout URL only ($50 minimum); returns{ url, amount_cents }GET /billing— pay-as-you-go readiness for the API key's organizationPOST /billing/setup— URL to save a card for pay-as-you-go (browser)POST /billing/portal— Stripe Customer Portal URL
Payment (pay-as-you-go)
- MCP & API: $0.001 per character — charged when you
POST …/production. - Owner saves a card in Settings → Billing. Keys never carry card numbers.
- Without a card: Checkout URL fallback (in-app Checkout has a $50 minimum).
Create a project
curl -X POST https://app.audioworm.fm/api/v1/projects \
-H "Authorization: Bearer aw_..." \
-H "Content-Type: application/json" \
-d '{"title":"My book","text":"Chapter 1\n\nOnce upon a time..."}'Errors
401— missing or invalid key403— missing scope404— project not in key org (or not found)- Body shape:
{ "error": "…" }
Prefer agents? See MCP setup.