
## List models

> **The response comes in raw OpenAI format.**
>
> The `{success, data}` envelope used across the other Vibecode endpoints — `/v1/deals`, `/v1/tasks` and others — is not present here.
>
> This is done for compatibility with the OpenAI SDK. If you have a single client with an `if (!response.success)` check, add an exception for the AI Router.

`GET /v1/models`

Returns the catalog of AI models available to the current API key. The response format is fully compatible with `GET /v1/models` from the OpenAI API. Free Bitrix24 models are visible to everyone. Models from third-party providers are visible only to keys that have access to that provider's credentials.

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `capability` (query) | string | no | Selects models by one declared capability instead of scanning the full list on the client side. Honored only for keys with the `vibe:cowork` scope. Ignored for all other keys: the response does not change for any value, including an unknown one. The set of allowed values is closed and grows together with the capabilities the platform serves for Cowork and Code |

## Examples

### curl — personal key

```bash
curl https://vibecode.bitrix24.com/v1/models \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl https://vibecode.bitrix24.com/v1/models \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/models', {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})

const { data } = await res.json()
data.forEach((m) => {
  console.log(`${m.id} — ${m.name}, context ${m.context_length}, price ${m.pricing.prompt}/${m.pricing.completion} Vibe credits per 1M tokens`)
})
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/models', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { data } = await res.json()
console.log('Models available:', data.length)
```

## Response fields

| Field | Type | Description |
|------|-----|----------|
| `object` | string | Always `list` |
| `data` | array | Array of models |
| `data[].id` | string | Model ID — use it in the `model` field of a request to [`/v1/chat/completions`](/docs/ai/chat/completions) |
| `data[].object` | string | Always `model` |
| `data[].created` | number | Unix timestamp of the model's registration in the Vibecode catalog (`0` for platform models) |
| `data[].owned_by` | string | System name of the provider: `bitrix`, `openai`, `anthropic`, `openrouter`, `google`, etc. For platform models that we resell, the value is `vibecode`. |
| `data[].name` | string | Display name of the model |
| `data[].context_length` | number | Maximum context size in tokens (input + output combined) |
| `data[].max_output_tokens` | number | Maximum tokens in the response |
| `data[].pricing.prompt` | number | Cost of 1M input tokens |
| `data[].pricing.completion` | number | Cost of 1M output tokens |
| `data[].pricing.perCall` | number | Per-call fee in Vibe credits. Present only when greater than `0` |
| `data[].pricing.perMinute` | number | Fee per minute of audio, in Vibe credits. Present only when greater than `0` |
| `data[].pricing.unit` | string | Pricing unit: `vibes` — the platform's internal currency |
| `data[].capabilities` | object | Model capabilities: `streaming`, `vision`, `reasoning`, `audio`, `transcription`, `transcription_openai_only` (the speech-to-text model does not read the hints `language`, `prompt`, `hotwords`, `temperature`, `vad_filter` — see "Transcribe audio"), `tools`, `structured_outputs`, `embeddings` |
| `data[].reasoning` | object \| null | Reasoning-control declaration. `null` — the model has no reasoning declaration. Otherwise `map` maps each platform step (`none`, `low`, `medium`, `high`, `max`) to the model's native mode; two steps sharing one native value indicate a declared collapse. `default` — the step the platform sends to the model when no reasoning parameter is sent. `budgetTokens` — whether the model supports a reasoning token budget |

## Response example

```json
{
  "object": "list",
  "data": [
    {
      "id": "bitrix/bitrixgpt-5.5",
      "object": "model",
      "created": 0,
      "owned_by": "bitrix",
      "name": "BitrixGPT 5.5 (free)",
      "context_length": 262144,
      "max_output_tokens": 65536,
      "pricing": {"prompt": 0, "completion": 0, "unit": "vibes"},
      "capabilities": {"streaming": true, "vision": true, "structured_outputs": true},
      "reasoning": null
    },
    {
      "id": "bitrix/bitrixgpt-5.5-thinking",
      "object": "model",
      "created": 0,
      "owned_by": "bitrix",
      "name": "BitrixGPT 5.5 Thinking (free)",
      "context_length": 262144,
      "max_output_tokens": 65536,
      "pricing": {"prompt": 0, "completion": 0, "unit": "vibes"},
      "capabilities": {"streaming": true, "vision": true, "reasoning": true, "structured_outputs": true},
      "reasoning": {"map": {"none": "none", "medium": "high", "max": "max"}, "default": "medium", "budgetTokens": false}
    },
    {
      "id": "bitrix/bitrixgpt-5.5-agent",
      "object": "model",
      "created": 0,
      "owned_by": "bitrix",
      "name": "BitrixGPT 5.5 Agent",
      "context_length": 262144,
      "max_output_tokens": 65535,
      "pricing": {"prompt": 68.4, "completion": 342, "unit": "vibes"},
      "capabilities": {"streaming": true},
      "reasoning": null
    },
    {
      "id": "bitrix/bitrixgpt-5.6-agent",
      "object": "model",
      "created": 0,
      "owned_by": "bitrix",
      "name": "BitrixGPT 5.6 Agent 1M",
      "context_length": 1048576,
      "max_output_tokens": 384000,
      "pricing": {"prompt": 100, "completion": 400, "unit": "vibes"},
      "capabilities": {"streaming": true, "reasoning": true, "structured_outputs": true},
      "reasoning": {"map": {"none": "none", "low": "low", "medium": "low", "high": "high", "max": "max"}, "default": "medium", "budgetTokens": false}
    },
    {
      "id": "bitrix/bitrixgpt-6.0-agent",
      "object": "model",
      "created": 0,
      "owned_by": "bitrix",
      "name": "BitrixGPT 6.0 Agent 1M",
      "context_length": 1048576,
      "max_output_tokens": 131072,
      "pricing": {"prompt": 50, "completion": 200, "unit": "vibes"},
      "capabilities": {"reasoning": true},
      "reasoning": {"map": {"low": "low", "medium": "low", "high": "high", "max": "max"}, "default": "medium", "budgetTokens": false}
    }
  ]
}
```

## Error response example

`403 scope_missing` — the API key has no `vibe:ai` scope:

```json
{
  "error": {
    "message": "API key does not have the vibe:ai scope required for AI endpoints. Add vibe:ai scope to your API key in portal settings.",
    "type": "invalid_request_error",
    "code": "scope_missing"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|----------|
| 403 | `scope_missing` | The API key is missing the `vibe:ai` scope |
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not provided |
| 401 | `INVALID_API_KEY` | The key is not recognized — no such key exists on the platform |
| 429 | `rate_limit_exceeded` | The request limit for AI endpoints has been exceeded. Time until reset is in the `Retry-After` header |

The full list of common API errors — [Errors](/docs/errors).

## Known specifics

**Visibility depends on the configured credentials.** The catalog shows only the models for which the current API key has access to the provider's credentials — shared across the whole platform, shared within the Bitrix24 account, or your personal BYOK. Bitrix24 models (`bitrix/*`) are available to everyone without connecting BYOK. If the model you need is not in the list, [connect your own key](/docs/ai/credentials/create).

**Models in `DEPRECATED` status remain in the list.** They are marked as deprecated, but requests to them still work, and responses carry the `Deprecation` and `Sunset` headers. Models in `DISABLED` status are hidden from the list, but a request that explicitly specifies one in `model` is transparently redirected to its successor model.

**Prices are in Vibe credits per one million tokens.** The `pricing.unit: "vibes"` field explicitly marks the currency so that an external client can programmatically check the unit of measure. Vibe credits are the platform's internal currency. The balance is topped up in your Vibecode account.

**Not all models are billed per token.** For a speech-recognition model, `prompt` and `completion` are `0`, and billing uses `perMinute` for each minute of audio and `perCall` for each call. Zero `prompt` and `completion` on their own do not mean the call is free — check all four `pricing` fields.

## See also

- [Get model](./get.md)
- [Create a chat completion](/docs/ai/chat/completions)
- [Embeddings](/docs/ai/embeddings)
- [Your own keys (BYOK)](/docs/ai/credentials)
