curl --request GET \
--url https://api.in.talqing.com/v1/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.in.talqing.com/v1/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.in.talqing.com/v1/catalog', 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.in.talqing.com/v1/catalog",
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.in.talqing.com/v1/catalog"
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.in.talqing.com/v1/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.in.talqing.com/v1/catalog")
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{
"avatar": [
{
"channel": [
"<string>"
],
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>"
}
],
"cost_estimate_usage_per_minute": {
"llm_cached_input_tokens": 123,
"llm_input_tokens": 123,
"llm_output_tokens": 123,
"realtime_audio_input_tokens": 123,
"realtime_audio_output_tokens": 123,
"realtime_cached_audio_input_tokens": 123,
"realtime_text_input_tokens": 123,
"realtime_text_output_tokens": 123,
"screenshare_input_tokens": 123,
"stt_batch_audio_seconds": 123,
"stt_streaming_audio_seconds": 123,
"tts_characters": 123,
"tts_input_tokens": 123,
"tts_output_tokens": 123
},
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"llm": [
{
"base_url": "<string>",
"builtin_tools": [
{
"description": "<string>",
"label": "<string>",
"price_note": "<string>",
"type": "<string>",
"fixed": {},
"options": [
{
"key": "<string>",
"label": "<string>",
"path": [
"<string>"
],
"type": "boolean",
"choices": [
"<string>"
],
"conflicts_with": [
"<string>"
],
"description": "<string>",
"max_items": 123,
"required": false
}
]
}
],
"channel": [
"<string>"
],
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"priority": {
"pricing": {
"cached_input_per_1m": 123,
"input_per_1m": 123,
"output_per_1m": 123
},
"confirms": true,
"value": "priority"
},
"provider": "<string>",
"reasoning_efforts": [
"none"
],
"vision": false
}
],
"noise_cancellation": [
{
"channel": [
"<string>"
],
"description": "<string>",
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>"
}
],
"platform_fee_per_minute": {
"text": 123,
"video": 123,
"voice": 123
},
"providers": {},
"realtime": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"default_voice": "<string>",
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"speed_max": 2,
"speed_min": 0.5,
"supports_speed": false,
"vision": false,
"voices": [
{
"id": "<string>",
"description": "<string>",
"gender": "<string>",
"name": "<string>",
"sample_url": "<string>",
"tags": [
"<string>"
]
}
]
}
],
"stt": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"streaming": true
}
],
"system_vars": [
{
"description": "<string>",
"example": "<string>",
"key": "<string>",
"voice_only": true
}
],
"tts": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"default_voice": "<string>",
"expressive": {
"prompt": "<string>"
},
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"speed_max": 2,
"speed_min": 0.5,
"supports_speed": false,
"supports_voice_settings": false,
"voices": [
{
"id": "<string>",
"description": "<string>",
"gender": "<string>",
"name": "<string>",
"sample_url": "<string>",
"tags": [
"<string>"
]
}
]
}
],
"turn_detector_languages": [
{
"code": "<string>",
"name": "<string>"
}
]
}{
"detail": {
"errors": [
"<string>"
],
"message": "<string>"
}
}{
"detail": {
"errors": [
"<string>"
],
"message": "<string>"
}
}Get Catalog
The provider catalog: every LLM, STT, TTS, realtime and avatar model that agents may use.
The authoritative source for provider/model pairs and for what each
entry supports — channels, language codes, speed range, default voice. A
config naming anything not listed here is rejected.
realtime lists the speech-to-speech models. One of those replaces stt,
llm and tts together, so an agent sets either realtime or the three
cascade slots, never both.
curl --request GET \
--url https://api.in.talqing.com/v1/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.in.talqing.com/v1/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.in.talqing.com/v1/catalog', 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.in.talqing.com/v1/catalog",
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.in.talqing.com/v1/catalog"
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.in.talqing.com/v1/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.in.talqing.com/v1/catalog")
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{
"avatar": [
{
"channel": [
"<string>"
],
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>"
}
],
"cost_estimate_usage_per_minute": {
"llm_cached_input_tokens": 123,
"llm_input_tokens": 123,
"llm_output_tokens": 123,
"realtime_audio_input_tokens": 123,
"realtime_audio_output_tokens": 123,
"realtime_cached_audio_input_tokens": 123,
"realtime_text_input_tokens": 123,
"realtime_text_output_tokens": 123,
"screenshare_input_tokens": 123,
"stt_batch_audio_seconds": 123,
"stt_streaming_audio_seconds": 123,
"tts_characters": 123,
"tts_input_tokens": 123,
"tts_output_tokens": 123
},
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"llm": [
{
"base_url": "<string>",
"builtin_tools": [
{
"description": "<string>",
"label": "<string>",
"price_note": "<string>",
"type": "<string>",
"fixed": {},
"options": [
{
"key": "<string>",
"label": "<string>",
"path": [
"<string>"
],
"type": "boolean",
"choices": [
"<string>"
],
"conflicts_with": [
"<string>"
],
"description": "<string>",
"max_items": 123,
"required": false
}
]
}
],
"channel": [
"<string>"
],
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"priority": {
"pricing": {
"cached_input_per_1m": 123,
"input_per_1m": 123,
"output_per_1m": 123
},
"confirms": true,
"value": "priority"
},
"provider": "<string>",
"reasoning_efforts": [
"none"
],
"vision": false
}
],
"noise_cancellation": [
{
"channel": [
"<string>"
],
"description": "<string>",
"label": "<string>",
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>"
}
],
"platform_fee_per_minute": {
"text": 123,
"video": 123,
"voice": 123
},
"providers": {},
"realtime": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"default_voice": "<string>",
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"speed_max": 2,
"speed_min": 0.5,
"supports_speed": false,
"vision": false,
"voices": [
{
"id": "<string>",
"description": "<string>",
"gender": "<string>",
"name": "<string>",
"sample_url": "<string>",
"tags": [
"<string>"
]
}
]
}
],
"stt": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"streaming": true
}
],
"system_vars": [
{
"description": "<string>",
"example": "<string>",
"key": "<string>",
"voice_only": true
}
],
"tts": [
{
"channel": [
"<string>"
],
"default_language": "<string>",
"default_voice": "<string>",
"expressive": {
"prompt": "<string>"
},
"label": "<string>",
"language_required": false,
"languages": [
{
"code": "<string>",
"name": "<string>"
}
],
"model": "<string>",
"note": "<string>",
"pricing": {},
"provider": "<string>",
"speed_max": 2,
"speed_min": 0.5,
"supports_speed": false,
"supports_voice_settings": false,
"voices": [
{
"id": "<string>",
"description": "<string>",
"gender": "<string>",
"name": "<string>",
"sample_url": "<string>",
"tags": [
"<string>"
]
}
]
}
],
"turn_detector_languages": [
{
"code": "<string>",
"name": "<string>"
}
]
}{
"detail": {
"errors": [
"<string>"
],
"message": "<string>"
}
}{
"detail": {
"errors": [
"<string>"
],
"message": "<string>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Response
Successful Response
Show child attributes
Show child attributes
Usage assumptions for the dashboard's client-side $/min estimator.
Provider prices still come from catalog entry pricing blocks; these quantities turn token/character-priced services into an approximate per-minute display.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Our margin per minute, per channel. Every channel is required: a missing key must fail the catalog load, never quietly make a channel free.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes