#Web Search for AI

REST endpoints for web search on behalf of AI agents and applications. A single request returns a synthesized answer with links to sources; streaming mode delivers results as they become ready. For deep research with a multi-step agentic loop — a separate endpoint `POST /v1/research`.

Scope: vibe:search (added automatically when a key is created) | Base URL: https://vibecode.bitrix24.tech/v1 | Authorization: X-Api-Key

Quickstart | Endpoint reference | Pricing | Error codes | RAG recipe with LLM

#Documentation sections

  • Search — synchronous request and streaming (SSE) via POST /v1/search
  • Deep search — multi-step agentic research POST /v1/research
  • Providers — list of search engines and their capabilities
  • Bring your own keys (BYOK) — adding personal keys for free search

#Which key to choose

Web Search works with two types of keys. The choice is determined by whose behalf the request is sent on.

Scenario Key Request headers
Your own portal, personal script or server Personal API key vibe_api_… X-Api-Key: vibe_api_…
Request on behalf of an end user in an OAuth application Authorization key vibe_app_… X-Api-Key: vibe_app_… + Authorization: Bearer <session_token>

More on key formats and obtaining a session_tokenKeys and authorization.

#Providers

The platform provides nine search engines: one platform-managed with billing in Vibes and eight BYOK providers paid directly with the vendor.

Provider Purpose Cost in Vibes
bitrix-search Bitrix AI search with agentic mode and source citations. Russian-language 2 Ꝟ basic, 5 Ꝟ advanced
tavily Tavily — English-language search with domain and time filters, relevance scoring 0 Ꝟ (BYOK)
brave Brave Search — private web search, optional summarizer in advanced 0 Ꝟ (BYOK)
exa Exa — neural/semantic search with full content extraction 0 Ꝟ (BYOK)
you-com You.com — search with citations and follow-up questions 0 Ꝟ (BYOK)
linkup Linkup — real-time web crawl with deep research mode 0 Ꝟ (BYOK)
perplexity Perplexity Sonar — Sonar models for search and deep research 0 Ꝟ (BYOK)
jina Jina DeepSearch — iterative "search → read → think" loop, research only 0 Ꝟ (BYOK)
z-ai Z.AI Web Search — search without a synthesized answer, with publication dates 0 Ꝟ (BYOK)

The current list with the capability matrix and prices — `GET /v1/search/providers`. All BYOK providers require your own key — added via Bring your own keys (BYOK).

#Supported provider capabilities

The full capability matrix is available in `GET /v1/search/providers`capabilities for each provider. Key slices are below in three tables by group.

#Modes and streaming

Provider basic advanced research Stream
bitrix-search progressive
tavily buffered
brave buffered
exa buffered
you-com buffered
linkup buffered
perplexity buffered
jina buffered
z-ai buffered

Progressive streaming emits intermediate thinking / tool_call / answer_delta events. Buffered sends only start and done.

#Synthesized answer and formatting

Provider answer Citations [N] score published_date Follow-up questions
bitrix-search
tavily
brave in advanced
exa
you-com
linkup
perplexity
jina
z-ai

For brave the answer field arrives only when search_depth: "advanced" via the optional summarizer; in basicnull.

#Filters

Provider include_domains exclude_domains time_range
bitrix-search
tavily
brave
exa
you-com
linkup
perplexity
jina
z-ai

When the selected provider does not support a passed filter, the request completes without error — the filter is ignored. The response carries an X-Search-Filters-Ignored header with the list of skipped fields:

X-Search-Filters-Ignored: include_domains,time_range

For brave with include_answer: true and search_depth: "basic", an additional X-Answer-Not-Supported: brave-search-does-not-synthesize-answers header arrives, and the answer field in JSON is null. In advanced mode the same provider mixes in the summarizer and returns a populated answer.

#When to choose which provider

Quick guidelines:

  • bitrix-search — a synthesized answer with [N] markers and source links in a single output. Suitable for AI agents that need RAG output out of the box without assembling the result separately. The only provider with progressive SSE streaming.
  • tavily — domain filters (include_domains / exclude_domains), publication time window (time_range), numeric relevance score (score). A universal choice for English-language tasks.
  • brave — web search without answer synthesis by default; the synthesizer is enabled on advanced. Suitable for English-language output and private queries.
  • exa — neural/semantic search. Suitable for research tasks that need semantically related pages rather than an exact keyword match.
  • you-com — the only provider with follow-up questions in research mode.
  • linkup — real-time web crawl (liveData: true), suitable for queries about events from the last few hours.
  • perplexity — Sonar models, OpenAI-compatible format, deep research with citations.
  • jina — research mode only, an iterative "search → read → think" loop. Not available via `POST /v1/search`.
  • z-ai — search without a synthesized answer, returns results with publication dates.

#Quickstart

A minimal call to `POST /v1/search`: the question text in the query field and the advanced mode for agentic search with source citations. The response returns a synthesized answer with [N] markers and a results array of found pages.

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/search \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "what is new in Cursor IDE",
    "search_depth": "advanced",
    "max_results": 5
  }'

Response:

JSON
{
  "query": "what is new in Cursor IDE",
  "provider": "bitrix-search",
  "search_depth": "advanced",
  "answer": "Cursor 3 — a redesign of the IDE interface [1]. An agents window has appeared [2].",
  "results": [
    {
      "id": 1,
      "url": "https://cursor.com/blog/cursor-3",
      "title": "Meet the new Cursor",
      "content": "...",
      "score": null,
      "published_date": null
    },
    {
      "id": 2,
      "url": "https://cursor.com/changelog",
      "title": "Changelog",
      "content": "...",
      "score": null,
      "published_date": null
    }
  ],
  "search_id": "ws_20260430113025_a1b2c3d4",
  "upstream_search_id": "AG_xyz",
  "cost_vibes": 5,
  "duration_ms": 8523
}

The [1], [2] markers in the answer field correspond to results[].id values.

#Full scenario: RAG with LLM

Pairing /v1/search + /v1/ai/chat/completions for LLM answers grounded in fresh sources with [N] citation markers — a ready-made integration recipe:

Web search + LLM (RAG)

#Pricing

Cost is expressed in the platform's virtual currency — Vibes (Ꝟ). The charge occurs after a successful provider response; on a provider error the balance is unchanged.

Provider · mode Cost per request
bitrix-search · basic 2 Ꝟ
bitrix-search · advanced 5 Ꝟ
bitrix-search · research 100 Ꝟ (placeholder value, mode not yet available)
tavily · basic / advanced / research 0 Ꝟ (BYOK)
brave · basic / advanced 0 Ꝟ (BYOK)
exa · basic / advanced / research 0 Ꝟ (BYOK)
you-com · basic / advanced / research 0 Ꝟ (BYOK)
linkup · basic / advanced / research 0 Ꝟ (BYOK)
perplexity · basic / advanced / research 0 Ꝟ (BYOK)
jina · research 0 Ꝟ (BYOK)
z-ai · basic / advanced 0 Ꝟ (BYOK)

Current values are returned by `GET /v1/search/providers`. The cost_vibes field in the response shows the amount actually charged.

Request history broken down by provider, Vibes spend by period, and average duration are available in the cabinet on the /search page. There you can also add, test, and delete BYOK keys through a visual interface. The "Use" button next to each provider opens a dialog with ready-made snippets in cURL, JavaScript, Python, the TypeScript SDK, and a text prompt for AI assistants.

#Rate limit

  • 60 requests per minute per API key for `POST /v1/search`.
  • 20 requests per minute per API key for `POST /v1/research` — deep research takes tens of times longer than a regular search.

When exceeded, 429 RATE_LIMITED is returned.

#Endpoint reference

Method Path Description
POST `/v1/search` Synchronous request or streaming
POST `/v1/research` Deep research with a multi-step agentic loop, SSE only
GET `/v1/search/providers` List of providers with the capability matrix and pricing
GET `/v1/search/credentials` List of your BYOK keys
POST `/v1/search/credentials` Add a BYOK key for the selected provider
DELETE `/v1/search/credentials/:id` Delete a BYOK key
POST `/v1/search/credentials/:id/test` Test a BYOK key

#Key selection cascade

When provider is not passed in the `POST /v1/search` request, the platform selects it in the order: user key (USER BYOK) → portal key (PORTAL BYOK) → platform key (PLATFORM, bitrix-search).

For `POST /v1/research` the cascade works differently. If the provider field is omitted, the server immediately substitutes tavily — a USER/PORTAL default for a different provider (e.g. exa) is not considered here. If tavily has neither a USER, PORTAL, nor PLATFORM key, 404 CREDENTIAL_NOT_FOUND is returned with the message CREDENTIAL_NOT_FOUND: tavily. The USER → PORTAL → PLATFORM cascade is applied within the selected provider. To go through a different research provider, pass provider explicitly.

After adding your own BYOK key with isDefault: true, the platform uses it automatically — the provider parameter can be omitted.

#Migration from Tavily

The request schema mirrors the Tavily Search API. Differences:

  • Address: https://api.tavily.com/searchhttps://vibecode.bitrix24.tech/v1/search.
  • Authorization: the api_key field in the body → the X-Api-Key: YOUR_API_KEY header.
  • Added an optional provider field — choice of engine from nine.

If you have your own Tavily key, add it via `POST /v1/search/credentials` and use provider: "tavily" or make the key the default. All other request fields work identically.

#Error codes

#Web search errors

Code HTTP Description
INVALID_REQUEST 400 Validation failed — empty query, query longer than the limit, unknown value for provider, search_depth, lang or time_range, include_domains / exclude_domains limits exceeded
INSUFFICIENT_BALANCE 402 The portal balance does not have enough Ꝟ for the selected mode. Switch to BYOK or top up the balance
BILLING_FROZEN 402 The billing account is frozen — top up the balance and remove the block in the cabinet
PROVIDER_NOT_FOUND 404 A provider was passed that is not in the system or is unavailable
CREDENTIAL_NOT_FOUND 404 The requested provider has no BYOK key for the user or portal, and there is no platform key
PROVIDER_DOES_NOT_SUPPORT_SEARCH 404 provider: "jina" was requested in `POST /v1/search` — Jina works only in `POST /v1/research`
PROVIDER_DOES_NOT_SUPPORT_RESEARCH 404 bitrix-search, brave or z-ai was requested in `POST /v1/research` — these providers are available only in `POST /v1/search`
RATE_LIMITED 429 The per-minute request limit per API key was exceeded
UPSTREAM_ERROR 502 The provider returned an error. No charge — retry the request
FEATURE_NOT_ENABLED 503 Web Search or deep research is unavailable on this platform
UPSTREAM_TIMEOUT 504 The provider exceeded the request timeout

#BYOK key errors

Code HTTP Description
INVALID_CREDENTIAL 400 When creating a BYOK key, the provider rejected it during the pre-flight check. The record was not saved
INVALID_REQUEST 400 apiKey not specified, invalid provider, name longer than 64 characters

#System errors

Code HTTP Description
MISSING_API_KEY 401 The X-Api-Key header is missing
INVALID_API_KEY 401 Invalid API key
KEY_INACTIVE 401 The API key is deactivated, blocked, or expired
SCOPE_DENIED 403 The key lacks the vibe:search scope
INTERNAL_ERROR 500 Internal server error

The full list of common API errors — Errors.

#Error response structure

JSON
{
  "error": {
    "code": "INSUFFICIENT_BALANCE",
    "message": "Insufficient vibes for this search.",
    "userMessage": "Not enough vibes — top up the balance or add a BYOK Tavily/Brave credential.",
    "hint": "POST /v1/search/credentials with a tavily- or brave- key to switch to BYOK (free)."
  }
}

The userMessage and hint fields arrive on billing errors (INSUFFICIENT_BALANCE, BILLING_FROZEN). For other codes the response carries only code and message.

#See also