
## Список провайдеров

`GET /v1/search/providers`

Возвращает все доступные движки веб-поиска вместе с матрицей возможностей и актуальными тарифами по трём режимам — `basic`, `advanced`, `research`. Список фильтруется по флагу `isEnabled` — в ответ попадают только доступные провайдеры. Какой движок платформенный, его цена и движок по умолчанию различаются от инстанса к инстансу. Порядок элементов фиксированный: сначала платформенные движки, затем BYOK-провайдеры в каноническом порядке реестра.

## Параметры

Параметров нет.

## Примеры

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

```bash
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://vibecode.bitrix24.tech/v1/search/providers
```

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

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

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

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

const { providers } = await res.json()
providers.forEach((p) => {
  console.log(`${p.name} (${p.slug}) — basic ${p.pricing.basic} Ꝟ / advanced ${p.pricing.advanced} Ꝟ / research ${p.pricing.research} Ꝟ`)
})
```

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

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

const { providers } = await res.json()
```

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

| Поле | Тип | Описание |
|------|-----|---------|
| `providers` | array | Массив включённых провайдеров |
| `providers[].slug` | string | Идентификатор для поля `provider` в [`POST /v1/search`](/docs/search/run) и [`POST /v1/research`](/docs/search/research). Один из: `bitrix-search`, `tavily`, `brave`, `exa`, `you-com`, `linkup`, `perplexity`, `jina`, `z-ai` |
| `providers[].name` | string | Отображаемое имя |
| `providers[].description` | string | Краткое описание |
| `providers[].requiresCredential` | boolean | Нужен ли BYOK-ключ. Для платформенных движков — `false`, ключ выпускает платформа |
| `providers[].capabilities` | object | Матрица возможностей провайдера |
| `providers[].capabilities.modes.search.basic` | boolean | Поддерживается ли режим `basic` в [`POST /v1/search`](/docs/search/run) |
| `providers[].capabilities.modes.search.advanced` | boolean | Поддерживается ли режим `advanced` в [`POST /v1/search`](/docs/search/run) |
| `providers[].capabilities.modes.research` | boolean | Поддерживается ли [`POST /v1/research`](/docs/search/research) |
| `providers[].capabilities.modes.streaming` | boolean | Эмитит ли провайдер промежуточные события SSE (`thinking`, `tool_call`, `answer_delta`). `false` — поток буферизованный, приходит только `start` и `done` |
| `providers[].capabilities.filters.includeDomains` | boolean | Принимается ли фильтр `include_domains` |
| `providers[].capabilities.filters.excludeDomains` | boolean | Принимается ли фильтр `exclude_domains` |
| `providers[].capabilities.filters.timeRange` | boolean | Принимается ли фильтр `time_range` |
| `providers[].capabilities.filters.region` | boolean | Принимается ли региональный фильтр |
| `providers[].capabilities.filters.safesearch` | boolean | Принимается ли фильтр безопасного поиска |
| `providers[].capabilities.output.synthesizedAnswer` | boolean | Возвращает ли провайдер синтезированный ответ в поле `answer` по умолчанию |
| `providers[].capabilities.output.citations` | boolean | Расставляет ли маркеры цитат `[N]` в синтезированном ответе |
| `providers[].capabilities.output.relevanceScore` | boolean | Заполняет ли поле `score` в результатах |
| `providers[].capabilities.output.publishedDate` | boolean | Заполняет ли поле `publishedDate` в результатах |
| `providers[].capabilities.output.fullContent` | boolean | Возвращает ли полный текст страниц в `results[].rawContent` при `include_raw_content: true` |
| `providers[].capabilities.output.followUpQuestions` | boolean | Возвращает ли уточняющие вопросы в режиме research |
| `providers[].capabilities.verticals.news` | boolean | Поддерживает ли режим новостей через параметр `topic: "news"`. У поддерживающих движков он наполняет `publishedDate` для новостных результатов |
| `providers[].capabilities.verticals.images` | boolean | Поддерживает ли запрос изображений через `include_images: true`. Ссылки приходят в верхнеуровневом массиве `images` |
| `providers[].capabilities.algorithm` | string | Поисковый алгоритм: `keyword`, `neural` или `hybrid` |
| `providers[].capabilities.liveData` | boolean | Делает ли провайдер свежий обход веб-страниц на каждый запрос |
| `providers[].capabilities.summarizer` | boolean | Доступен ли отдельный суммаризатор по запросу. Для `brave` синтезированный ответ выдаётся только в режиме `advanced` через этот флаг, в остальных случаях `answer: null` |
| `providers[].pricing.basic` | number | Стоимость одного запроса режима `basic` в Ꝟ. `0` для BYOK-провайдеров |
| `providers[].pricing.advanced` | number | Стоимость одного запроса режима `advanced` в Ꝟ |
| `providers[].pricing.research` | number | Стоимость одного запроса режима `research` в Ꝟ. `0` для всех BYOK-провайдеров с поддержкой research |

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

```json
{
  "providers": [
    {
      "slug": "bitrix-search",
      "name": "Bitrix AI-поиск",
      "description": "Платформенный AI-поиск с агентным режимом и цитированием источников",
      "requiresCredential": false,
      "capabilities": {
        "modes": {
          "search": { "basic": true, "advanced": true },
          "research": true,
          "streaming": false
        },
        "filters": { "includeDomains": true, "excludeDomains": true, "timeRange": true, "region": false, "safesearch": false },
        "output": { "synthesizedAnswer": true, "citations": false, "relevanceScore": true, "publishedDate": true, "fullContent": true, "followUpQuestions": false },
        "verticals": { "news": true, "images": true },
        "algorithm": "hybrid",
        "liveData": false,
        "summarizer": false
      },
      "pricing": { "basic": 2, "advanced": 5, "research": 0 }
    },
    {
      "slug": "tavily",
      "name": "Tavily",
      "description": "Tavily web search API — англоязычный, BYOK",
      "requiresCredential": true,
      "capabilities": {
        "modes": {
          "search": { "basic": true, "advanced": true },
          "research": true,
          "streaming": false
        },
        "filters": { "includeDomains": true, "excludeDomains": true, "timeRange": true, "region": false, "safesearch": false },
        "output": { "synthesizedAnswer": true, "citations": false, "relevanceScore": true, "publishedDate": true, "fullContent": true, "followUpQuestions": false },
        "verticals": { "news": true, "images": true },
        "algorithm": "hybrid",
        "liveData": false,
        "summarizer": false
      },
      "pricing": { "basic": 0, "advanced": 0, "research": 0 }
    },
    {
      "slug": "jina",
      "name": "Jina DeepSearch",
      "description": "Research-only iterative search/read/think loop",
      "requiresCredential": true,
      "capabilities": {
        "modes": {
          "search": { "basic": false, "advanced": false },
          "research": true,
          "streaming": false
        },
        "filters": { "includeDomains": true, "excludeDomains": true, "timeRange": false, "region": false, "safesearch": false },
        "output": { "synthesizedAnswer": true, "citations": true, "relevanceScore": false, "publishedDate": true, "fullContent": true, "followUpQuestions": false },
        "verticals": { "news": false, "images": false },
        "algorithm": "hybrid",
        "liveData": false,
        "summarizer": false
      },
      "pricing": { "basic": 0, "advanced": 0, "research": 0 }
    }
  ]
}
```

Показаны три характерных провайдера: платформенный `bitrix-search`, универсальный BYOK `tavily` и research-only `jina`. Значения `capabilities` и `pricing` платформенного движка зависят от инстанса — здесь приведены для примера. Фактические возвращает этот же эндпоинт. Какие движки платформенные и какой движок по умолчанию — также определяется настройками инстанса. Полный список идентификаторов — `bitrix-search`, `tavily`, `brave`, `exa`, `you-com`, `linkup`, `perplexity`, `jina`, `z-ai`.

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

403 — не хватает скоупа:

```json
{
  "error": {
    "code": "SCOPE_DENIED",
    "message": "vibe:search scope required."
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 401 | `MISSING_API_KEY` | Отсутствует заголовок `X-Api-Key` |
| 401 | `INVALID_API_KEY` | Неверный API-ключ |
| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `vibe:search` |
| 429 | `RATE_LIMITED` | Превышен общий лимит запросов |
| 500 | `INTERNAL_ERROR` | Внутренняя ошибка сервера |

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

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

**Каноническая последовательность провайдеров.** Порядок элементов в массиве не зависит от того, в какой день добавлен провайдер в платформу. Сначала идут платформенные движки, затем BYOK в фиксированном порядке реестра. Для UI это позволяет рендерить плитки без дополнительной сортировки.

**Провайдер пропадает из списка, если становится недоступным.** Клиент с закешированным значением продолжит передавать его в `provider`, но [`POST /v1/search`](/docs/search/run) и [`POST /v1/research`](/docs/search/research) вернут `404 PROVIDER_NOT_FOUND` — это сигнал перечитать список через текущий эндпоинт.

**`pricing` показывает только списание в Вайбах.** Реальная стоимость у поставщика BYOK оплачивается с вашего собственного аккаунта по тарифу провайдера и в этой таблице не отражается. Поле `pricing.research` равно нулю для всех BYOK-провайдеров с поддержкой research. Тариф платформенного движка (`pricing.basic` / `pricing.advanced` / `pricing.research`) различается от инстанса к инстансу — ориентируйтесь на значения из ответа этого эндпоинта, а не на фиксированные числа.

**Capability `modes.streaming` отражает поведение адаптера, а не провайдера.** На стороне провайдера может работать нативный SSE-поток с прогрессивными событиями, но если адаптер Вайбкод собирает поток в один блок и отдаёт только `start` + `done`, флаг `streaming` будет `false`. Сегодня прогрессивный поток с `thinking`, `tool_call`, `answer_delta` доступен только для `bitrix-search`.

**Признак «есть синтезированный ответ» — `output.synthesizedAnswer`.** Для `brave` поле имеет значение `false`, а опциональный суммаризатор сигнализируется отдельным флагом `summarizer: true`. Это означает: по умолчанию `answer` приходит как `null`, но при `search_depth: "advanced"` Brave подмешивает суммаризатор в ответ.

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

- [Web Search для AI](/docs/search)
- [Поиск (POST /v1/search)](/docs/search/run)
- [Глубокий поиск (POST /v1/research)](/docs/search/research)
- [Свои ключи (BYOK)](/docs/search/credentials)
- [Ошибки](/docs/errors)
