
## Get model

> **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/:modelId`

Returns the details of a single model by `modelId`. Used when you need to check a model's characteristics (context, price, capabilities) before a request to [`/v1/chat/completions`](/docs/ai/chat/completions). The response format is compatible with `GET /v1/models/:id` from the OpenAI API.

## Parameters

| Parameter | Type | Req. | Description |
|----------|-----|:-----:|----------|
| `modelId` (path) | string | yes | Model ID from [`GET /v1/models`](./list.md). May contain slashes: `openai/gpt-4o`, `bitrix/bitrixgpt-5.5`, `bitrix/openai/gpt-oss-120b`. The full path after `/v1/models/` is treated as the `modelId` |

## Examples

### curl — personal key

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

### curl — OAuth application

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

### JavaScript — personal key

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

const model = await res.json()
console.log(`${model.name}: context ${model.context_length}, price ${model.pricing.prompt}/${model.pricing.completion} Vibe credits per 1M tokens`)
```

### JavaScript — OAuth application

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

const model = await res.json()
console.log('Vision support:', model.capabilities.vision === true)
```

## Response fields

| Field | Type | Description |
|------|-----|----------|
| `id` | string | Model ID |
| `object` | string | Always `model` |
| `created` | number | Unix timestamp of registration in the Vibecode catalog (`0` for platform models) |
| `owned_by` | string | System name of the provider: `bitrix`, `openai`, `anthropic`, `openrouter`, `google`, etc. Platform models that we resell return `vibecode`. |
| `name` | string | Display name of the model |
| `context_length` | number | Maximum context size in tokens |
| `max_output_tokens` | number | Maximum tokens in the response |
| `pricing.prompt` | number | Cost of 1M input tokens |
| `pricing.completion` | number | Cost of 1M response tokens |
| `pricing.perCall` | number | Per-call fee in Vibe credits. Present only when greater than `0` |
| `pricing.perMinute` | number | Per audio-minute fee in Vibe credits. Present only when greater than `0` |
| `pricing.unit` | string | Pricing unit: `vibes` |
| `capabilities` | object | Model capabilities: `streaming`, `vision`, `reasoning`, `audio`, `transcription`, `tools`, `structured_outputs`, `embeddings` |
| `replaced_by` | string | Identifier of the successor model. Present only when the requested id has been retired and its calls are served by another model. In that case `pricing` shows the successor's price |

This is what the response looks like for a retired model:

```json
"pricing": { "prompt": 68.4, "completion": 342, "unit": "vibes" },
"replaced_by": "bitrix/bitrixgpt-5.5-agent"
```

## Response example

```json
{
  "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
  }
}
```

## Error response example

`404 ai_model_not_found` — model not found or the key has no access to it:

```json
{
  "error": {
    "message": "Model \"openai/gpt-4o\" not found or disabled.",
    "type": "invalid_request_error",
    "code": "ai_model_not_found"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|----------|
| 404 | `ai_model_not_found` | A model with this `modelId` does not exist, is disabled, or the key has no access |
| 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

**`modelId` with slashes.** The endpoint accepts any number of segments after `/v1/models/`. For example, `GET /v1/models/bitrix/openai/gpt-oss-120b` is read as `modelId = "bitrix/openai/gpt-oss-120b"`. There is no need to URL-encode the slashes.

**Visibility matches the list.** If a model is not shown in [`GET /v1/models`](./list.md) — a request to `GET /v1/models/:modelId` returns `404`, even if the model formally exists in the platform catalog. This means your key has no access to it. Connect credentials via [BYOK](/docs/ai/credentials/create).

## See also

- [List models](./list.md)
- [Create chat completion](/docs/ai/chat/completions)
