Skip to main content

API reference

Voices

Listing available voices.

Beta. Every endpoint on this page is live and documented as shipped. Shapes can still change before general availability.

Overview

The Voices API is a read-only catalog of every voice your organization can give a Finn. Use it to find a voice_id, then pass it as voice when you create or update a Finn. See api-finns.

Base URL: https://api.hirefinn.ai/api/v1. Auth: Authorization: Bearer finn_live_.... See authentication.

GET /voices returns the voices of every voice provider your plan includes, merged into one list: the same voices as the voice picker in the dashboard. You never choose a provider: setting a Finn's voice is enough, and Finn sets everything else up for that voice.

Your organization may be limited to one voice provider. Then only that provider's voices are listed and accepted.

Endpoints

MethodPathRate limit (per API key)
GET/voices60 per minute, shared with GET /voices/{voice_id}
GET/voices/{voice_id}Same bucket

Catalog lookups call the providers, so this limit is lower than other reads. Cache the results on your side.

The voice object

FieldTypeNotes
voice_idstringPass this as voice on a Finn.
namestring or nullDisplay name.
descriptionstringEmpty string when the provider has none.
preview_urlstring or nullAudio sample URL, when the provider offers one.
categorystring or nullProvider category, for example premade.
labelsobjectProvider tags such as accent, gender or age. Empty object when there are none.
languagesstring[]Languages the provider has verified for the voice. Often empty for providers that do not report them.

List voices

GET /voices

Query parameterTypeDefaultNotes
searchstringnoneUp to 100 characters. Filters every provider's voices by name, voice ID or description.
curl "https://api.hirefinn.ai/api/v1/voices?search=rachel" \
  -H "Authorization: Bearer $FINN_API_KEY"
{
  "success": true,
  "data": [
    {
      "voice_id": "21m00Tcm4TlvDq8ikWAM",
      "name": "Rachel",
      "description": "Calm, young American female voice.",
      "preview_url": "https://example.com/voices/rachel-preview.mp3",
      "category": "premade",
      "labels": { "accent": "american", "gender": "female", "age": "young" },
      "languages": ["en"]
    }
  ]
}

The list is not paginated: the whole result comes back in one response. Narrow it with search. A voice ID offered by more than one provider appears once.

If one provider's catalog can't be loaded, the request still succeeds with the voices of the others, so a voice can be missing from one response and back in the next. If no catalog can be loaded, the request returns 502 voices_unavailable.

Retrieve a voice

GET /voices/{voice_id}

ParameterInNotes
voice_idpath1 to 128 characters of letters, digits, _, :, . and -.
curl "https://api.hirefinn.ai/api/v1/voices/21m00Tcm4TlvDq8ikWAM" \
  -H "Authorization: Bearer $FINN_API_KEY"

Returns { "success": true, "data": { ... } } with one voice object, from whichever provider has it. Some providers have more voices than their list shows, so this can find a voice that GET /voices didn't return.

Finn writes check voice the same way: a voice this endpoint finds is accepted on POST /finns and PATCH /finns/{finn_id}; a voice it can't find returns 400 invalid_request (voice is not one of the voices from GET /voices).

Errors

StatuserrorWhen
400invalid_requestsearch is longer than 100 characters, or voice_id has invalid characters.
401api_key_requiredNo Bearer finn_live_... key.
401invalid_api_keyKey unknown or revoked.
403feature_not_allowedYour plan includes no voice provider. Upgrade at action_url.
404voice_not_foundGET /voices/{voice_id} only: none of your organization's voice providers has a voice with that ID.
429rate_limitedMore than 60 voice lookups per minute on this key.
500internal_errorUnexpected server error.
502voices_unavailableNo voice catalog could be loaded, or, for GET /voices/{voice_id}, the voice wasn't found while a catalog was unavailable. Retry later. Also returned when your organization is limited to a voice provider whose voices can't be listed through the API; retrying doesn't help then, and a Finn's voice is saved without being checked.

Error bodies have the shape { "error": "...", "message": "..." }; internal_error has no message. See api-errors.