
## 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. Third-party provider models are visible only to keys that have access to the provider credentials.

## Parameters

No request parameters.

## 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` 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. Platform models that we resell return `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 response tokens |
| `data[].pricing.perCall` | number | Per-call fee in Vibe credits. Present only when greater than `0` |
| `data[].pricing.perMinute` | number | Per audio-minute fee 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`, `tools`, `structured_outputs`, `embeddings` |

## 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}
    },
    {
      "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}
    },
    {
      "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}
    }
  ]
}
```

## 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 was not found or has been revoked |
| 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 provider 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 — the `Deprecation` and `Sunset` headers will be returned. Models in `DISABLED` status are hidden from the list, but when explicitly specified in `model` they are transparently redirected to the 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 account.

**Not all models are billed by tokens.** For a speech-recognition model, `prompt` and `completion` are `0`, and billing is driven by the `perMinute` field per audio minute and `perCall` per 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 chat completion](/docs/ai/chat/completions)
- [Embeddings](/docs/ai/embeddings)
- [Your own keys (BYOK)](/docs/ai/credentials)
