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. |
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": "Anthropic - Opus 5.5 (xHigh)" },
{ "value": "anthropic:sonnet-5-5__medium", "provider": "anthropic", "model": "sonnet-5-5", "reasoning": "medium", "speed": null, "label": "Anthropic - Sonnet 5.5 (Medium)" },
{ "value": "openai:gpt-6-astra__high__ultrafast", "provider": "openai", "model": "gpt-6-astra", "reasoning": "high", "speed": "ultrafast", "label": "OpenAI - GPT 6 Astra (High, Ultrafast)" },
{ "value": "openai:gpt-6-luna__medium__fast", "provider": "openai", "model": "gpt-6-luna", "reasoning": "medium", "speed": "fast", "label": "OpenAI - GPT 6 Luna (Medium, Fast)" },
{ "value": "openai:gpt-6.1-sol__ultra", "provider": "openai", "model": "gpt-6.1-sol", "reasoning": "ultra", "speed": null, "label": "OpenAI - GPT 6.1 Sol (Ultra)" },
{ "value": "openai:gpt-6-sol__xhigh", "provider": "openai", "model": "gpt-6-sol", "reasoning": "xhigh", "speed": null, "label": "OpenAI - GPT 6 Sol (xHigh)", "legacy": true },
{ "value": "zai:glm-5.3__high", "provider": "zai", "model": "glm-5.3", "reasoning": "high", "speed": null, "label": "Z.ai - GLM-5.3 (High)" },
{ "value": "moonshot:k3__high", "provider": "moonshot", "model": "k3", "reasoning": "high", "speed": null, "label": "Moonshot AI - Kimi K3 (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, zai or moonshot. |
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 5.6 Terra and the legacy GPT 6 Sol, GPT 5.6 Sol 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. Anthropic and OpenAI models only. |
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 filed from a Slack Thread, which runs on the workspace's Credentials, and one booked to Kosuke, such as a session a Cron Run filed, which does too until a member 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 OpenAI models in this workspace. Connect a Subscription, switch the model, or reassign this session.",
"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. Its model route refuses a GLM or Kimi model and a provider the workspace holds no Credentials for, both with 400 BAD_REQUEST.
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, a GLM or Kimi model, or a provider without workspace Credentials. |
| 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.