Audyo API

Send a URL or markdown and get a page with human-quality audio, a public listen page, and an embeddable player.

Authentication

Create a key in Settings, on the API tab. API access is part of Audyo Pro. Send the key with every request as Authorization: Bearer or as x-api-key. Each key can make 60 requests a minute.

Audio you generate through the API counts toward the same monthly minutes as the editor.

Endpoints

POST /api/v1/pages

Creates a page from a URL or from markdown in text. Optional: title, voice, generate to start the audio, and public to publish the page.

curl https://audyo.ai/api/v1/pages \
  -H "Authorization: Bearer $AUDYO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/my-post", "generate": true, "public": true}'

→ 201 { "id", "url", "embedUrl", "status", "generationError" }

GET /api/v1/pages/{id}

Returns the page's generation status and, when the audio is ready, its MP3 URL and duration. Status is idle, generating, rendering, or failed.

curl https://audyo.ai/api/v1/pages/PAGE_ID \
  -H "Authorization: Bearer $AUDYO_API_KEY"

→ { "id", "title", "status", "progress", "error",
    "audioUrl", "durationSeconds", "public",
    "url", "embedUrl", "sourceUrl", "createdAt", "updatedAt" }

GET /api/v1/voices

Lists every voice. Pass a voice key as voice when you create a page.

curl https://audyo.ai/api/v1/voices \
  -H "x-api-key: $AUDYO_API_KEY"

→ { "defaultVoice": "EN_NOVA",
    "voices": [{ "key", "label", "gender", "provider", "trait" }] }

GET /api/v1/me

Returns the account that owns the key.

curl https://audyo.ai/api/v1/me \
  -H "x-api-key: $AUDYO_API_KEY"

→ { "username", "plan" }

Errors

Errors answer with { "error": { "code", "message" } }.

400The request body is not valid.
401The API key is missing, unknown, or revoked.
402The account is on the Free plan. The API needs Audyo Pro.
404The page does not exist or belongs to another account.
422The URL could not be imported.
429More than 60 requests in a minute. Retry-After says when to try again.