curl --request GET \
--url https://api.pyai.com/v1/voices/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.pyai.com/v1/voices/{id}"
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/{id}', 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/{id}",
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/{id}"
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/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pyai.com/v1/voices/{id}")
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": "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"
],
"speak_emotions": [
"neutral"
],
"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>"
}
}Get a stock voice
curl --request GET \
--url https://api.pyai.com/v1/voices/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.pyai.com/v1/voices/{id}"
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/{id}', 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/{id}",
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/{id}"
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/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pyai.com/v1/voices/{id}")
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": "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"
],
"speak_emotions": [
"neutral"
],
"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_...).
Path Parameters
Canonical stock voice id or permanent alias. Alias lookups return the canonical voice_id.
Response
Stock voice
"voice"
"stock_dorit_en_us"
"Imogen"
M, F Accent / regional flavor.
"UK (England / RP)"
"32"
"polished, reassuring"
"Calm, articulate London front-desk."
"en"
Voice-matched avatar image (PNG).
Optional pre-generated audio preview (MP3). If absent, synthesize a short sample with this voice_id.
Normalized accent label used for matching.
Normalized age band, e.g. 25-34.
Normalized pitch band, e.g. low-medium.
Normalized speaking pace.
Recommended Agent and content use cases.
Search and auto-suggest tags.
Permanent convenience identifiers accepted on the voice's advertised surfaces. API responses report the canonical voice_id.
Product surfaces on which this stock voice can be selected.
speak, omni Verified named delivery controls on Speak for this voice. An empty or absent list means directed emotion is unavailable. These controls apply to streaming and buffered speech; intensity is not supported.
neutral, happy, sad, angry, fearful, surprised Delivery modes accepted for this voice on POST /v1/audio/speech. Every Speak-available voice accepts both; a voice served from a blocking-only fleet answers a streaming request with x-pyai-stream: buffered. An empty list means the voice has no Speak surface at all (check available_on).
streaming, async Customer-facing voice quality tier. The public catalog includes Standard and Natural voices; inspect available_on and synthesis_modes before use.
standard, natural "standard"
Voice-specific pricing on top of the selected product's base rate.
Show child attributes
Show child attributes
Source dataset attribution.
Source voice license identifier.