Skip to content

List all voices

GET
/v2/voices
curl https://texttospeech.responsivevoice.org/v2/voices -H 'X-API-Key: YOUR_API_KEY' -H 'X-API-Secret: YOUR_API_SECRET'

Returns the full voice collection: user-facing responsive voices and internal system voices used for voice resolution. When platform parameters are provided, platform-specific availability rules are applied — voices unavailable on the given browser/OS combination are excluded. Also includes premium BYOK (Bring Your Own Key) provider voices when the user has configured API credentials for their website. Each voice in the response includes HATEOAS _links for self-discovery, synthesis, and streaming navigation.

browser
string

Browser name (e.g. “Chrome”, “Firefox”, “Safari”). Used to filter voices by platform-specific availability rules.

browserVersion
string

Browser version string (e.g. “120.0”). Refines platform filtering for version-specific voice support.

os
string

Operating system name (e.g. “Windows”, “macOS”, “Android”, “iOS”). Used to filter voices by OS-specific availability.

osVersion
string

OS version string (e.g. “10”, “14.2”). Refines platform filtering for version-specific voice support.

Voice collection containing user-facing voices with HATEOAS navigation links, system voices for internal resolution, and a total count. Supports ETag-based conditional requests.

Media type application/json

Voice collection with HATEOAS navigation

object
voices
required
Array<object>

User-facing voice with HATEOAS links

object
name
required
string
flag
required
string
gender
required
string
Allowed values: f m
lang
required
string
voiceIDs
required
Array<number>
deprecated
boolean
isByok
boolean
provider
string
_links
required

HATEOAS links on a voice resource

object
self
required

HATEOAS link with absolute URL

object
href
required
string
synthesize
required

HATEOAS synthesize action link

object
href
required
string
method
required
string
Allowed values: POST
body
required
object
voice
required
string
lang
string
synthesize:stream
required

HATEOAS streaming synthesize link (HTTP audio streaming)

object
href
required
string
method
required
string
Allowed values: POST
body
required
object
voice
required
string
lang
string
stream
required
boolean
accept
required
string
Allowed values: text/event-stream
premium
required
boolean
stream:websocket
required

HATEOAS WebSocket stream link

object
href
required
string
protocol
required
string
Allowed values: websocket
message
required
object
type
required
string
voice
required
string
lang
string
premium
required
boolean
systemVoices
required
Array<object>

Low-level system voice mapping

object
id
required
number
name
required
string
lang
string
rate
number
pitch
number
timerSpeed
number
fallbackVoice
boolean
service

Available TTS service backends

string
Allowed values: g1 g2 g3 g5 gwn msv oai
voiceName
string
gender
string
volume
number
deprecated
boolean
count
required
number
_links
required

HATEOAS links on the voice collection

object
self
required

HATEOAS link with absolute URL

object
href
required
string
Example
{
"voices": [
{
"gender": "f",
"_links": {
"synthesize": {
"method": "POST"
},
"synthesize:stream": {
"method": "POST",
"accept": "text/event-stream"
},
"stream:websocket": {
"protocol": "websocket"
}
}
}
],
"systemVoices": [
{
"service": "g1"
}
]
}
X-RateLimit-Limit
required

Maximum requests permitted for the authenticated key per minute.

integer

Maximum requests permitted for the authenticated key per minute.

X-RateLimit-Remaining
required

Requests remaining in the current per-minute window; 0 once the per-minute limit is reached. Reflects the per-minute limit, not the burst check — a burst 429 may report a value above 0.

integer

Requests remaining in the current per-minute window; 0 once the per-minute limit is reached. Reflects the per-minute limit, not the burst check — a burst 429 may report a value above 0.

Not modified (ETag match)

API key required

Media type application/json

API error response

object
error
required
object
message
required
string
code
string
statusCode
required
number
errors
Example generated
{
"error": {
"message": "example",
"code": "example",
"statusCode": 1,
"errors": "example"
}
}

Rate limit exceeded. The body code is RATE_LIMIT_EXCEEDED (per-minute tier limit) or BURST_RATE_LIMIT_EXCEEDED (per API key + client IP burst).

Media type application/json

API error response

object
error
required
object
message
required
string
code
string
statusCode
required
number
errors
Example generated
{
"error": {
"message": "example",
"code": "example",
"statusCode": 1,
"errors": "example"
}
}
X-RateLimit-Limit
required

Maximum requests permitted for the authenticated key per minute.

integer

Maximum requests permitted for the authenticated key per minute.

X-RateLimit-Remaining
required

Requests remaining in the current per-minute window; 0 once the per-minute limit is reached. Reflects the per-minute limit, not the burst check — a burst 429 may report a value above 0.

integer

Requests remaining in the current per-minute window; 0 once the per-minute limit is reached. Reflects the per-minute limit, not the burst check — a burst 429 may report a value above 0.

Retry-After
required

Seconds to wait before retrying. Dynamic — varies with how far over the limit the request went; honor this header rather than assuming a fixed delay.

integer

Seconds to wait before retrying. Dynamic — varies with how far over the limit the request went; honor this header rather than assuming a fixed delay.