Skip to main content

Search Engine Providers

Each Search Engine wraps a single provider. The provider is selected with the provider field, and configured through config.connection (endpoint and credentials) and config.options (provider-specific options).

RAG knowledge base

The config.connection block below applies to the web providers. The rag provider is configured differently — it has no connection, and instead references an embedding store and an embedding model.

The config.connection block is common to all web providers:

FieldTypeDefaultDescription
config.connection.base_urlstringprovider defaultThe provider base URL (or your instance URL for SearXNG)
config.connection.tokenstringAPI key/token. Supports vault references and comma-separated rotation. Ignored by providers that don't require auth (SearXNG, DuckDuckGo).
config.connection.timeoutnumber30000Request timeout in milliseconds

The normalized response is always { provider, query, answer?, results: [{ title, url, snippet, score?, published_date? }] }.

Staan.ai (Qwant) 🇫🇷 🇪🇺

Sovereign European web search. POST https://api.staan.ai/v2/search/web, authenticated with a Bearer token.

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://api.staan.aiStaan base URL
config.options.marketstringfr-FRMarket / locale (e.g. fr-FR, en-us, de-de)
config.options.countnumber10Number of results per page
config.options.min_scorenumberMinimum reranker score (0–1)
config.options.extra_snippetsbooleanReturn additional scored chunks per result
config.options.full_contentstringmarkdown or html to fetch full page content
{
"id": "search-engine_xxxxxxxxx",
"name": "Staan.ai",
"provider": "staan",
"config": {
"connection": { "base_url": "https://api.staan.ai", "token": "${vault://local/STAAN_API_KEY}", "timeout": 30000 },
"options": { "market": "fr-FR", "count": 10 }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

Tavily

Search API designed for LLM/RAG. POST https://api.tavily.com/search, Bearer token. Can return a synthetic answer.

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://api.tavily.comTavily base URL
config.options.max_resultsnumber5Number of results (0–20)
config.options.search_depthstringbasicbasic or advanced
config.options.topicstringgeneral, news, or finance
config.options.include_answerbooleanAsk Tavily for an LLM-generated answer (returned in answer)
{
"id": "search-engine_xxxxxxxxx",
"name": "Tavily",
"provider": "tavily",
"config": {
"connection": { "base_url": "https://api.tavily.com", "token": "${vault://local/TAVILY_API_KEY}", "timeout": 30000 },
"options": { "max_results": 5, "search_depth": "basic", "include_answer": false }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

GET https://api.search.brave.com/res/v1/web/search, authenticated with the X-Subscription-Token header (set through connection.token).

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://api.search.brave.comBrave base URL
config.options.countrystring2-letter country code
config.options.search_langstringContent language (ISO 639-1)
config.options.safesearchstringoff, moderate, or strict
{
"id": "search-engine_xxxxxxxxx",
"name": "Brave Search",
"provider": "brave",
"config": {
"connection": { "base_url": "https://api.search.brave.com", "token": "${vault://local/BRAVE_API_KEY}", "timeout": 30000 },
"options": {}
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

SearXNG

Open-source metasearch engine — great for on-prem and sovereignty. GET <instance>/search?format=json. No API key: point base_url at your SearXNG instance.

FieldTypeDefaultDescription
config.connection.base_urlstringhttp://localhost:8080Your SearXNG instance URL
config.options.enginesstringComma-separated list of upstream engines (e.g. google,bing,duckduckgo)
config.options.categoriesstringSearch categories (e.g. general)
config.options.languagestringLanguage code
{
"id": "search-engine_xxxxxxxxx",
"name": "SearXNG",
"provider": "searxng",
"config": {
"connection": { "base_url": "https://searxng.internal.example.com", "token": "", "timeout": 30000 },
"options": { "language": "fr" }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

Google Programmable Search Engine. GET https://www.googleapis.com/customsearch/v1. Authentication uses an API key (set through connection.token) and a search engine id cx.

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://www.googleapis.comGoogle APIs base URL
config.connection.tokenstringThe Google API key (sent as the key query param)
config.options.cxstringThe Programmable Search Engine id (required)
config.options.lrstringLanguage restrict (e.g. lang_fr)
{
"id": "search-engine_xxxxxxxxx",
"name": "Google Custom Search",
"provider": "google",
"config": {
"connection": { "base_url": "https://www.googleapis.com", "token": "${vault://local/GOOGLE_CSE_KEY}", "timeout": 30000 },
"options": { "cx": "0123456789abcdef0" }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

SearchApi

SERP aggregator. GET https://www.searchapi.io/api/v1/search, Bearer token. Defaults to the google engine.

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://www.searchapi.ioSearchApi base URL
config.options.enginestringgoogleThe SERP engine to query
config.options.glstringCountry code
config.options.hlstringLanguage code
{
"id": "search-engine_xxxxxxxxx",
"name": "SearchApi",
"provider": "searchapi",
"config": {
"connection": { "base_url": "https://www.searchapi.io", "token": "${vault://local/SEARCHAPI_KEY}", "timeout": 30000 },
"options": { "engine": "google" }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

DuckDuckGo

GET https://api.duckduckgo.com/?format=json. No API key.

note

DuckDuckGo only exposes the free Instant Answer API, not a full web result list. Results are mapped on a best-effort basis from the abstract and related topics. For full web search, prefer Staan.ai, Tavily, Brave, SearXNG, Google or SearchApi.

{
"id": "search-engine_xxxxxxxxx",
"name": "DuckDuckGo",
"provider": "duckduckgo",
"config": {
"connection": { "base_url": "https://api.duckduckgo.com", "token": "", "timeout": 30000 },
"options": {}
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

Exa

AI / neural web search. POST https://api.exa.ai/search, authenticated with the x-api-key header (set through connection.token). Exa returns relevance highlights that are mapped to the normalized snippet.

FieldTypeDefaultDescription
config.connection.base_urlstringhttps://api.exa.aiExa base URL
config.options.typestringautoSearch mode (auto, fast, instant, deep, …)
config.options.categorystringFocus area (e.g. news, research paper, company, people)
config.options.num_resultsnumber10Number of results (1–100)
config.options.highlightsbooleantrueReturn relevance highlights used as the result snippet
config.options.textbooleanfalseAlso request the full page text (used as a fallback snippet)
{
"id": "search-engine_xxxxxxxxx",
"name": "Exa",
"provider": "exa",
"config": {
"connection": { "base_url": "https://api.exa.ai", "token": "${vault://local/EXA_API_KEY}", "timeout": 30000 },
"options": { "type": "auto", "highlights": true, "num_results": 10 }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

RAG knowledge base

Instead of the public web, the rag provider searches your own data: it embeds the query with a referenced embedding model, then runs a vector similarity search against a referenced embedding store (your vector database). The most relevant passages are returned in the same normalized result shape, so a RAG knowledge base plugs into providers, agents, the HTTP plugin and workflows exactly like a web engine.

This makes Retrieval-Augmented Generation a first-class, reusable entity: populate an embedding store (for example with the vector_store_add workflow function), point a rag Search Engine at it, and attach it to an LLM provider or agent as a tool so the model can retrieve from your knowledge base on demand.

Unlike the web providers, the rag provider has no connection block. It is configured with two references and a couple of search options:

FieldTypeDefaultDescription
config.embedding_storestringId of the embedding store (vector database) to search (required)
config.embedding_modelstringId of the embedding model used to embed the query (required)
config.options.max_resultsnumber5Maximum number of passages to return. Overridable per request via max_results.
config.options.min_scorenumber0.5Minimum similarity score (0–1); passages below it are dropped. Overridable per request via min_score.
{
"id": "search-engine_xxxxxxxxx",
"name": "Product docs",
"description": "Search the internal product documentation",
"provider": "rag",
"config": {
"embedding_store": "embedding-store_xxxxxxxxx",
"embedding_model": "embedding-model_xxxxxxxxx",
"options": { "max_results": 5, "min_score": 0.5 }
},
"kind": "ai-gateway.extensions.cloud-apim.com/SearchEngine"
}

The embedding model and store are referenced by id and are never exposed to the LLM — the model only ever sees a single search tool named after the Search Engine, just like a web engine.

The results map onto the normalized shape as follows:

Normalized fieldValue
providerrag
results[].titleThe matched document / chunk id from the store
results[].urlEmpty (a knowledge-base passage has no URL)
results[].snippetThe stored passage text
results[].scoreThe vector similarity score
tip

Give the Search Engine a clear description (e.g. "Search the internal product documentation"). When the engine is used as an LLM tool, that description becomes the tool description the model reads to decide when to query your knowledge base. With no description, a generic "Search the knowledge base … using semantic similarity" prompt is generated for you.