curl --request GET \
--url https://api.pyai.com/v1/voices \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.pyai.com/v1/voices"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.pyai.com/v1/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.pyai.com/v1/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.pyai.com/v1/voices"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.pyai.com/v1/voices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pyai.com/v1/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"object": "voice",
"voice_id": "stock_dorit_en_us",
"name": "Imogen",
"gender": "M",
"region": "UK (England / RP)",
"age": "32",
"tone": "polished, reassuring",
"bio": "Calm, articulate London front-desk.",
"language": "en",
"avatar_url": "<string>",
"preview_url": "<string>",
"accent": "<string>",
"age_band": "<string>",
"pitch_band": "<string>",
"pace": "<string>",
"use_cases": [
"<string>"
],
"search_tags": [
"<string>"
],
"aliases": [
"<string>"
],
"available_on": [
"speak"
],
"synthesis_modes": [
"streaming"
],
"tier": "standard",
"pricing": {
"included_in_base_price": true,
"additional_price_usd_per_minute": 0
},
"source_dataset": "<string>",
"license": "<string>"
}
]
}{
"error": {
"message": "<string>",
"type": "<string>",
"code": "invalid_request_error",
"param": "<string>"
}
}List voices
Your unified voice library: the prebuilt PyAI catalog (with presentation metadata; some entries include an avatar or pre-generated audio preview) merged with your saved designed voices, each tagged by source (stock | design). Any active key may read it (no specific scope). Inspect available_on before using a stock voice with Speak or Omni, and inspect synthesis_modes before choosing streaming or async Speak delivery. tier is the customer-facing quality tier. pricing reports only the voice-specific amount on top of that product’s base rate. aliases are permanent convenience inputs on the advertised surfaces; responses report the canonical voice_id. Cloned voices are listed separately via GET /v1/voice/clones.
curl --request GET \
--url https://api.pyai.com/v1/voices \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.pyai.com/v1/voices"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.pyai.com/v1/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.pyai.com/v1/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.pyai.com/v1/voices"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.pyai.com/v1/voices")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pyai.com/v1/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"object": "voice",
"voice_id": "stock_dorit_en_us",
"name": "Imogen",
"gender": "M",
"region": "UK (England / RP)",
"age": "32",
"tone": "polished, reassuring",
"bio": "Calm, articulate London front-desk.",
"language": "en",
"avatar_url": "<string>",
"preview_url": "<string>",
"accent": "<string>",
"age_band": "<string>",
"pitch_band": "<string>",
"pace": "<string>",
"use_cases": [
"<string>"
],
"search_tags": [
"<string>"
],
"aliases": [
"<string>"
],
"available_on": [
"speak"
],
"synthesis_modes": [
"streaming"
],
"tier": "standard",
"pricing": {
"included_in_base_price": true,
"additional_price_usd_per_minute": 0
},
"source_dataset": "<string>",
"license": "<string>"
}
]
}{
"error": {
"message": "<string>",
"type": "<string>",
"code": "invalid_request_error",
"param": "<string>"
}
}Authorizations
Use Authorization: Bearer pyai_live_... (or pyai_test_...).
Query Parameters
Filter stock voices by gender (case-insensitive exact match).
M, F Filter stock voices by region/accent (case-insensitive substring match, e.g. us, india, scotland).
Filter stock voices by stable language code.
en, fr, es, de, hi Filter stock voices by customer-facing quality tier.
standard, natural Rank stock voices by matching tokens across name, aliases, accent, language, age band, pitch, tone, use cases, and search tags.
Return only one kind of voice. Omit for the merged library.
stock, design