curl --request GET \
--url https://descriptapi.com/v1/agent/models \
--header 'Authorization: Bearer <token>'import requests
url = "https://descriptapi.com/v1/agent/models"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://descriptapi.com/v1/agent/models', 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://descriptapi.com/v1/agent/models",
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://descriptapi.com/v1/agent/models"
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://descriptapi.com/v1/agent/models")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://descriptapi.com/v1/agent/models")
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{
"availableModels": [
{
"id": "auto",
"cost": "medium"
},
{
"id": "claude-opus-4.8",
"cost": "high"
},
{
"id": "claude-haiku-4.5",
"cost": "low"
}
],
"aliases": [
{
"id": "claude-opus",
"resolvesTo": "claude-opus-4.8",
"description": "Tracks stable Anthropic Claude Opus",
"cost": "high"
}
]
}{
"error": "unauthorized",
"message": "Missing or invalid authentication token"
}{
"error": "rate_limit_exceeded",
"message": "Too many requests. Please try again later."
}List agent models
List the currently available agent models and the aliases that resolve to them.
The model parameter on POST /jobs/agent accepts any
value listed under availableModels[].id or aliases[].id. Aliases let you target
the latest
recommended model for a given tier without chasing version bumps — for example,
passing claude-opus always routes to whichever Claude Opus version Descript
currently recommends.
The catalog changes as models launch and retire, so this endpoint’s live response is the source of truth — the example below is an abridged illustration, not the full list.
Cost tiers are coarse buckets — low, medium, high — useful for showing
users a relative price/performance signal. Exact pricing is reported per job via
the ai_credits_used field on GET /jobs/.
When model is omitted on POST /jobs/agent, the request defaults to auto, which
selects a recommended model for your account. auto is a medium-cost option. For an
auto request, result.resolved_model on GET /jobs/ reports
auto; for an explicit model or alias it reports the canonical id that ran.
curl --request GET \
--url https://descriptapi.com/v1/agent/models \
--header 'Authorization: Bearer <token>'import requests
url = "https://descriptapi.com/v1/agent/models"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://descriptapi.com/v1/agent/models', 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://descriptapi.com/v1/agent/models",
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://descriptapi.com/v1/agent/models"
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://descriptapi.com/v1/agent/models")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://descriptapi.com/v1/agent/models")
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{
"availableModels": [
{
"id": "auto",
"cost": "medium"
},
{
"id": "claude-opus-4.8",
"cost": "high"
},
{
"id": "claude-haiku-4.5",
"cost": "low"
}
],
"aliases": [
{
"id": "claude-opus",
"resolvesTo": "claude-opus-4.8",
"description": "Tracks stable Anthropic Claude Opus",
"cost": "high"
}
]
}{
"error": "unauthorized",
"message": "Missing or invalid authentication token"
}{
"error": "rate_limit_exceeded",
"message": "Too many requests. Please try again later."
}Authorizations
Personal API token created in Descript Settings → API Tokens. See the Authentication section for details.
Response
Available agent models and aliases
Canonical model ids currently advertised by the public agent API, each tagged with a coarse cost tier.
Show child attributes
Show child attributes
Friendly aliases that resolve to one of the availableModels at
request time. Pass any alias id as model and the agent job
result's result.resolved_model (on
GET /jobs/{job_id}) will report the canonical
id that actually ran.
Show child attributes
Show child attributes

