
## Удалить модель ключа

`DELETE /v1/ai/credentials/:credId/models/:modelRowId`

Удаляет одну модель, привязанную к BYOK-ключу. После удаления модель пропадает из [`GET /v1/models`](/docs/ai/models/list), а запросы к ней через [`/v1/chat/completions`](/docs/ai/chat/completions) возвращают `404 ai_model_not_found`. История вызовов в `AiUsageLog` сохраняется.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `credId` (path) | string | да | ID ключа из [`GET /v1/ai/credentials`](./list.md) |
| `modelRowId` (path) | string | да | ID записи модели (`data[].id`) из [`GET /v1/ai/credentials/:id/models`](./models-list.md) — это **не** `modelId`, а первичный ключ записи `AiModel` |

## Примеры

### curl — личный ключ

```bash
curl -X DELETE https://vibecode.bitrix24.tech/v1/ai/credentials/cred_custom_xyz/models/aimodel_xyz789 \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth-приложение

```bash
curl -X DELETE https://vibecode.bitrix24.tech/v1/ai/credentials/cred_custom_xyz/models/aimodel_xyz789 \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — личный ключ

```javascript
const credId = 'cred_custom_xyz'
const modelRowId = 'aimodel_xyz789'
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/ai/credentials/${credId}/models/${modelRowId}`,
  { method: 'DELETE', headers: { 'X-Api-Key': 'YOUR_API_KEY' } },
)

const { success } = await res.json()
if (success) console.log('Модель удалена из каталога ключа')
```

### JavaScript — OAuth-приложение

```javascript
const credId = 'cred_custom_xyz'
const modelRowId = 'aimodel_xyz789'
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/ai/credentials/${credId}/models/${modelRowId}`,
  {
    method: 'DELETE',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  },
)

if ((await res.json()).success) console.log('OK')
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |

## Пример ответа

HTTP-статус `200 OK`:

```json
{
  "success": true
}
```

## Пример ответа при ошибке

`404 not_found` — ключ или модель не найдены, либо ключ принадлежит другому пользователю:

```json
{
  "success": false,
  "error": {
    "code": "not_found",
    "message": "Credential not found"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 404 | `not_found` | Ключ с таким `credId` не найден / не принадлежит вам, либо модель с таким `modelRowId` не привязана к ключу |
| 403 | `scope_missing` | API-ключу не хватает скоупа `vibe:ai` |

Полный список общих ошибок API — [Ошибки](/docs/errors).

Лимит удаления моделей: 30 запросов в минуту.

## Известные особенности

**`modelRowId` — первичный ключ записи, не `modelId`.** Один и тот же `modelId` может встречаться у разных ключей (одинаковая модель `gpt-4o` у двух BYOK), поэтому удаление идёт по уникальному `id` записи `AiModel`. Получите его из [`GET /v1/ai/credentials/:id/models`](./models-list.md), поле `data[].id`.

**История вызовов сохраняется.** Записи `AiUsageLog` не удаляются — статистика по этой модели за прошлые периоды останется в [`GET /v1/ai/usage`](/docs/ai/consumption/usage). Поля `modelId` и `providerId` в логах хранятся как строки, без `FK`-связи с таблицей `AiModel`.

**Не путайте с `DEPRECATED`.** Модель в статусе `DEPRECATED` ещё работает — её просто не рекомендуется использовать. Удалённая модель полностью пропадает: запросы к её `modelId` возвращают `404 ai_model_not_found`. Чтобы пометить модель устаревшей вместо удаления — обратитесь к администратору портала.

**Каскадное удаление с ключом.** Если удалить сам ключ через [`DELETE /v1/ai/credentials/:id`](./delete.md) — все привязанные модели удаляются вместе с ним. Этот эндпоинт нужен, чтобы убрать одну модель, оставив остальные.

## Смотрите также

- [Список моделей ключа](./models-list.md)
- [Удалить ключ](./delete.md)
- [Загрузить каталог моделей](./fetch-models.md)
