Models
GET /api/models lists every model a chat session can run, one entry per reasoning effort, and one more per effort for each speed the model is sold at. Pass an entry's value, such as anthropic:opus__xhigh, wherever a route takes a model. In the CLI this is kosuke models list.
| Method | Path | Description |
|---|---|---|
| GET | /api/models | List the models a chat session can start with: value is what --model takes (such as anthropic:opus__xhigh), with its provider, model, reasoning, speed and label. speed is null at standard speed, or a paid tier, fast or ultrafast (openai:gpt-6-astra__high__fast). Retired models carry legacy true. The whole catalog, whichever providers you can run. |
Muse models run on Muse Code access. Gemini models run on your Antigravity sign-in for personal work, or the workspace's selected Antigravity sign-in or Gemini API key for workspace work. There is no personal Google method selection or Gemini API key. Auto and the Model Router route every released provider the work's allowed source can run, Muse and Gemini included. On a workspace Gemini API key, Argon steps down to Flash. Anthropic on AWS Bedrock does not count for Auto.
Response
Any API key can read the list. Everyone gets the same catalog, including providers they cannot run.
curl -s https://app.kosuke.ai/api/models \
-H "Authorization: Bearer $KOSUKE_API_KEY"
{
"data": [
{ "value": "anthropic:opus__xhigh", "provider": "anthropic", "model": "opus", "reasoning": "xhigh", "speed": null, "label": "Claude - Opus 5.5 (xHigh)" },
{ "value": "anthropic:sonnet-5-5__medium", "provider": "anthropic", "model": "sonnet-5-5", "reasoning": "medium", "speed": null, "label": "Claude - Sonnet 5.5 (Medium)" },
{ "value": "openai:gpt-6-astra__high__ultrafast", "provider": "openai", "model": "gpt-6-astra", "reasoning": "high", "speed": "ultrafast", "label": "Codex - GPT 6 Astra (High, Ultrafast)" },
{ "value": "openai:gpt-6-luna__medium__fast", "provider": "openai", "model": "gpt-6-luna", "reasoning": "medium", "speed": "fast", "label": "Codex - GPT 6 Luna (Medium, Fast)" },
{ "value": "openai:gpt-6.1-sol__ultra", "provider": "openai", "model": "gpt-6.1-sol", "reasoning": "ultra", "speed": null, "label": "Codex - GPT 6.1 Sol (Ultra)" },
{ "value": "openai:gpt-6-sol__xhigh", "provider": "openai", "model": "gpt-6-sol", "reasoning": "xhigh", "speed": null, "label": "Codex - GPT 6 Sol (xHigh)", "legacy": true },
{ "value": "zai:glm-5.3__high", "provider": "zai", "model": "glm-5.3", "reasoning": "high", "speed": null, "label": "GLM - GLM-5.3 (High)" },
{ "value": "moonshot:k3.1-pro__high", "provider": "moonshot", "model": "k3.1-pro", "reasoning": "high", "speed": null, "label": "Kimi - Kimi K3.1 Pro (High)" },
{ "value": "deepseek:deepseek-flash__high", "provider": "deepseek", "model": "deepseek-flash", "reasoning": "high", "speed": null, "label": "DeepSeek - DeepSeek V4.1 Flash (High)" }
]
}
The example shows eight entries. The real list holds every model at every reasoning effort.
| Field | Meaning |
|---|---|
value | The whole id, provider:model__reasoning, followed by __speed when speed is set, as in openai:gpt-6-astra__high__fast. It is the only field you pass back. |
provider | anthropic, openai, google, meta, zai, moonshot or deepseek for released providers. |
model | The model family, such as opus or gpt-6.1-sol. |
reasoning | The reasoning effort, such as medium or xhigh. Each effort is its own entry. |
speed | null at standard speed, or a paid speed tier, listed as its own entry at each reasoning effort. fast is on GPT 6.1 Sol, GPT 6 Astra, GPT 6 Luna, GPT 6.1 Terra and the legacy GPT 6 Sol, GPT 5.6 Sol, GPT 5.6 Terra and GPT 5.6 Luna. ultrafast is on GPT 6 Astra only. |
label | The name the web app's model picker shows. |
legacy | Present and true on a retired model. A session can still start on it. |
To list the current models at standard speed only:
kosuke models list | jq -r '.data[] | select((.legacy | not) and .speed == null) | .value'
Where a value goes
| Route | Field | What it sets |
|---|---|---|
POST /api/projects/{projectId}/chat-sessions | model | The model a new chat session starts on. The CLI flag is --model. |
POST /api/projects/{projectId}/chat-sessions/{sessionId}/jobs/chat | model | Switches the session to this model from this message's Turn on. The value is ignored when the message is sent mid-turn and waits Up next. It is also ignored when it is not in the catalog, or when the Assignee cannot run its provider. The Turn then runs on the session's own model. |
PUT /api/projects/{projectId}/chat-sessions/{sessionId} | model | A Backlog session's model, or an Active session's while no Turn is running. Under Review, Archived and Completed sessions refuse a model change. |
PATCH /api/user/subscriptions | defaultModel | Your Default Model, for sessions nobody picks a model for. |
POST /api/organizations/{workspaceId}/crons | model | The model the Cron Agent runs on, and the sessions it files unless the prompt names another. |
PUT /api/projects/{projectId}/settings/agentic-deploy/model | model | The deploy agent's model, on any released provider the project's allowed source can run. |
How switching models works in a running session is on Models in the product guide.
Check which providers you can run
The catalog does not say what you can run. Before you pick a model, read providers from GET /api/organizations/{workspaceId}/access-status. See Workspaces.
A chat session runs on its Assignee's providers, except one booked to Sensei, such as a session a Cron Run filed, which runs on the workspace's Credentials until a member starts or reassigns it. Changing a session's model with PUT, or filing a Backlog session on a model whose provider the Assignee cannot run, answers 400 BAD_REQUEST, and the error says what to do, for example:
{
"error": "You can't run Codex models in this workspace. Connect a Subscription, switch the model, or reassign this task.",
"code": "BAD_REQUEST"
}
Creating a session with a first message on such a model answers 400 BAD_REQUEST with a generic message. Starting a Backlog session names the cause, as above. jobs/chat drops the requested model and runs the Turn on the session's own model.
The deploy agent runs on the workspace's Credentials, or without them on your own Subscription. Its model route refuses a provider with 400 BAD_REQUEST and the message "Neither this Workspace nor your own subscription can run that provider."
Errors
| Status | Code | When |
|---|---|---|
| 400 | VALIDATION_ERROR | A chat session create or update, a Cron, or defaultModel got a value that is not in the catalog. jobs/chat ignores such a value and keeps the session's model. |
| 400 | BAD_REQUEST | The Assignee cannot run the model's provider, or the deploy model route got an unsupported value or a provider neither the workspace nor your Subscription can run. |
| 401 | UNAUTHORIZED | The API key is missing, revoked or expired. |
The full list is in Responses and errors.
Next steps
- Start a session on a model with Chat sessions.
- Save your Default Model with Account.
- Pick the deploy agent's model with Deploys.