
## Provider list

`GET /v1/search/providers`

Returns all available web-search engines together with the capability matrix and current pricing for the three modes — `basic`, `advanced`, `research`. The list is filtered by the `isEnabled` flag — only available providers are returned. Which engine is platform-managed, its price, and the default engine vary from instance to instance. The order is fixed: platform-managed engines first, then BYOK providers in the canonical registry order.

## Parameters

No parameters.

## Examples

### curl — personal key

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

### curl — OAuth app

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

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/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 app

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

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

## Response fields

| Field | Type | Description |
|------|-----|---------|
| `providers` | array | Array of enabled providers |
| `providers[].slug` | string | Identifier for the `provider` field in [`POST /v1/search`](/docs/search/run) and [`POST /v1/research`](/docs/search/research). One of: `bitrix-search`, `tavily`, `brave`, `exa`, `you-com`, `linkup`, `perplexity`, `jina`, `z-ai` |
| `providers[].name` | string | Display name |
| `providers[].description` | string | Short description |
| `providers[].requiresCredential` | boolean | Whether a BYOK key is required. For platform-managed engines — `false`, the platform issues the key |
| `providers[].capabilities` | object | Provider capability matrix |
| `providers[].capabilities.modes.search.basic` | boolean | Whether the `basic` mode is supported in [`POST /v1/search`](/docs/search/run) |
| `providers[].capabilities.modes.search.advanced` | boolean | Whether the `advanced` mode is supported in [`POST /v1/search`](/docs/search/run) |
| `providers[].capabilities.modes.research` | boolean | Whether [`POST /v1/research`](/docs/search/research) is supported |
| `providers[].capabilities.modes.streaming` | boolean | Whether the provider emits intermediate SSE events (`thinking`, `tool_call`, `answer_delta`). `false` — the stream is buffered, only `start` and `done` arrive |
| `providers[].capabilities.filters.includeDomains` | boolean | Whether the `include_domains` filter is accepted |
| `providers[].capabilities.filters.excludeDomains` | boolean | Whether the `exclude_domains` filter is accepted |
| `providers[].capabilities.filters.timeRange` | boolean | Whether the `time_range` filter is accepted |
| `providers[].capabilities.filters.region` | boolean | Whether the regional filter is accepted |
| `providers[].capabilities.filters.safesearch` | boolean | Whether the safe-search filter is accepted |
| `providers[].capabilities.output.synthesizedAnswer` | boolean | Whether the provider returns a synthesized answer in the `answer` field by default |
| `providers[].capabilities.output.citations` | boolean | Whether it places citation markers `[N]` in the synthesized answer |
| `providers[].capabilities.output.relevanceScore` | boolean | Whether it fills the `score` field in results |
| `providers[].capabilities.output.publishedDate` | boolean | Whether it fills the `publishedDate` field in results |
| `providers[].capabilities.output.fullContent` | boolean | Whether it returns the full page text in `results[].rawContent` when `include_raw_content: true` |
| `providers[].capabilities.output.followUpQuestions` | boolean | Whether it returns follow-up questions in research mode |
| `providers[].capabilities.verticals.news` | boolean | Whether it supports news mode via the `topic: "news"` parameter. For engines that support it, it populates `publishedDate` for news results |
| `providers[].capabilities.verticals.images` | boolean | Whether it supports requesting images via `include_images: true`. The links arrive in the top-level `images` array |
| `providers[].capabilities.algorithm` | string | Search algorithm: `keyword`, `neural`, or `hybrid` |
| `providers[].capabilities.liveData` | boolean | Whether the provider performs a fresh web crawl on each request |
| `providers[].capabilities.summarizer` | boolean | Whether a separate on-demand summarizer is available. For `brave` the synthesized answer is produced only in `advanced` mode via this flag, otherwise `answer: null` |
| `providers[].pricing.basic` | number | Cost of a single `basic`-mode request in Ꝟ. `0` for BYOK providers |
| `providers[].pricing.advanced` | number | Cost of a single `advanced`-mode request in Ꝟ |
| `providers[].pricing.research` | number | Cost of a single `research`-mode request in Ꝟ. `0` for all BYOK providers with research support |

## Response example

```json
{
  "providers": [
    {
      "slug": "bitrix-search",
      "name": "Bitrix24 AI Search",
      "description": "Platform AI search with agentic mode",
      "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 — English-language, 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 }
    }
  ]
}
```

Three representative providers are shown: the platform-managed `bitrix-search`, the universal BYOK `tavily`, and research-only `jina`. The platform engine's `capabilities` and `pricing` values depend on the instance — shown here for illustration. The actual ones are returned by this same endpoint. Which engines are platform-managed and which is the default is also determined by the instance configuration. The full list of slugs — `bitrix-search`, `tavily`, `brave`, `exa`, `you-com`, `linkup`, `perplexity`, `jina`, `z-ai`.

## Error response example

403 — scope missing:

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

## Errors

| HTTP | Code | Description |
|------|-----|---------|
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |
| 401 | `INVALID_API_KEY` | Invalid API key |
| 403 | `SCOPE_DENIED` | The key lacks the `vibe:search` scope |
| 429 | `RATE_LIMITED` | The overall request limit is exceeded |
| 500 | `INTERNAL_ERROR` | Internal server error |

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

## Known specifics

**Canonical provider sequence.** The order of elements in the array does not depend on which day a provider was added to the platform. Platform-managed engines come first, then BYOK in the fixed registry order. For the UI this allows rendering tiles without additional sorting.

**A provider drops out of the list when it becomes unavailable.** A client with a cached value will keep passing it in `provider`, but [`POST /v1/search`](/docs/search/run) and [`POST /v1/research`](/docs/search/research) will return `404 PROVIDER_NOT_FOUND` — a signal to re-read the list via this endpoint.

**`pricing` shows only the charge in Vibe credits.** The actual cost at a BYOK provider is billed from your own account at the provider's rate and is not reflected in this table. The `pricing.research` field is zero for all BYOK providers with research support. The platform engine's pricing (`pricing.basic` / `pricing.advanced` / `pricing.research`) varies from instance to instance — rely on the values from this endpoint's response, not on fixed numbers.

**The `modes.streaming` capability reflects the adapter's behavior, not the provider's.** On the provider side a native SSE stream with progressive events may work, but if the Vibecode adapter assembles the stream into a single block and returns only `start` + `done`, the `streaming` flag will be `false`. Which engines deliver the progressive stream with `thinking`, `tool_call`, `answer_delta` is shown by the `modes.streaming` flag in this endpoint's response — for the platform engine it depends on the instance.

**The "has a synthesized answer" marker is `output.synthesizedAnswer`.** For `brave` the field is `false`, and the optional summarizer is signaled by a separate `summarizer: true` flag. This means: by default `answer` arrives as `null`, but with `search_depth: "advanced"` Brave mixes the summarizer into the response.

## See also

- [Web Search for AI](/docs/search) — section overview, pricing, capability matrix
- [Search (POST /v1/search)](/docs/search/run) — the main endpoint, uses values from this list
- [Deep search (POST /v1/research)](/docs/search/research) — filter on `capabilities.modes.research: true`
- [Your own keys (BYOK)](/docs/search/credentials) — adding BYOK keys
- [Errors](/docs/errors) — API error code reference
