Web Search
Model-agnostic grounding
You can incorporate relevant web search results for any model on OpenRouter by activating and customizing the web plugin, or by appending :online to the model slug:
You can also append :online to :free model variants like so:
Using web search will incur extra costs, even with free models. See the pricing section below for details.
:online is a shortcut for using the web plugin, and is exactly equivalent to:
The web search plugin is powered by native search for Anthropic, OpenAI, Perplexity, and xAI models.
For xAI models, the web search plugin enables both Web Search and X Search.
For other models, the web search plugin is powered by Exa. It uses their “auto” method (a combination of keyword search and embeddings-based web search) to find the most relevant results and augment/ground your prompt.
Parsing web search results
Web search results for all models (including native-only models like Perplexity and OpenAI Online) are available in the API and standardized by OpenRouter to follow the same annotation schema in the OpenAI Chat Completion Message type:
Customizing the Web Plugin
The maximum results allowed by the web plugin and the prompt used to attach them to your message stream can be customized:
By default, the web plugin uses the following search prompt, using the current date:
Domain Filtering
You can restrict which domains appear in web search results using include_domains and exclude_domains:
Both fields accept an array of domain strings. You can use wildcards (*.substack.com) and path filtering (openai.com/blog).
Engine Compatibility
Native Provider Behavior
When using native search, domain filter support depends on the provider:
- Anthropic: Supports both
include_domainsandexclude_domains, but they are mutually exclusive — you cannot use both at once - OpenAI: Supports
include_domainsonly;exclude_domainsis silently ignored - xAI: Supports both, but they are mutually exclusive with a maximum of 5 domains each
X Search Filters (xAI only)
When using xAI models with web search enabled,
OpenRouter automatically adds the x_search tool
alongside web_search. You can pass filter
parameters to control X/Twitter search results
using the top-level x_search_filter parameter:
Filter Parameters
allowed_x_handles and excluded_x_handles are
mutually exclusive — you cannot use both in the
same request. If validation fails, the filter is
silently dropped and a basic x_search tool is
used instead.
Engine Selection
The web search plugin supports the following options for the engine parameter:
native: Always uses the model provider’s built-in web search capabilitiesexa: Uses Exa’s search API for web resultsfirecrawl: Uses Firecrawl’s search APIparallel: Uses Parallel’s search API for web resultsundefined(not specified): Uses native search if available for the provider, otherwise falls back to Exa
Default Behavior
When the engine parameter is not specified:
- Native search is used by default for OpenAI, Anthropic, Perplexity, and xAI models that support it
- Exa search is used for all other models or when native search is not supported
When you explicitly specify "engine": "native", it will always attempt to use the provider’s native search, even if the model doesn’t support it (which may result in an error).
Forcing Engine Selection
You can explicitly specify which engine to use:
Or force Exa search even for models that support native search:
Firecrawl
Firecrawl is a BYOK (bring your own key) search engine. To use it:
- Go to your OpenRouter plugin settings and select Firecrawl as the web search engine
- Accept the Firecrawl Terms of Service — this automatically creates a Firecrawl account linked to your email
- Your account starts with a free hobby plan and 100,000 credits
Once set up, Firecrawl searches use your Firecrawl credits directly — there is no additional charge from OpenRouter.
Firecrawl does not support domain filters (include_domains / exclude_domains). If you need domain filtering, use exa or parallel instead.
Parallel
Parallel is a search engine that supports domain filtering and uses OpenRouter credits at the same rate as Exa ($4 per 1000 results).
Engine-Specific Pricing
- Native search: Pricing is passed through directly from the provider (see provider-specific pricing info below)
- Exa search: Uses OpenRouter credits at $4 per 1000 results (default 5 results = $0.02 per request)
- Parallel search: Uses OpenRouter credits at $4 per 1000 results (same as Exa)
- Firecrawl search: Uses your Firecrawl credits directly, refill at Firecrawl.dev
Pricing
Exa Search Pricing
When using Exa search (either explicitly via "engine": "exa" or as fallback), the web plugin uses your OpenRouter credits and charges $4 per 1000 results. By default, max_results set to 5, this comes out to a maximum of $0.02 per request, in addition to the LLM usage for the search result prompt tokens.
Native Search Pricing (Provider Passthrough)
Some models have built-in web search. These models charge a fee based on the search context size, which determines how much search data is retrieved and processed for a query.
Search Context Size Thresholds
Search context can be ‘low’, ‘medium’, or ‘high’ and determines how much search context is retrieved for a query:
- Low: Minimal search context, suitable for basic queries
- Medium: Moderate search context, good for general queries
- High: Extensive search context, ideal for detailed research
Specifying Search Context Size
You can specify the search context size in your API request using the web_search_options parameter:
Native Web Search Pricing
Refer to each provider’s documentation for their native web search pricing info:
Native web search pricing only applies when using "engine": "native" or when native search is used by default for supported models. When using "engine": "exa", the Exa search pricing applies instead.