Web Search
Web Search
Section titled “Web Search”The web_search tool searches the web using your configured provider and
returns results. Results are cached by query for 15 minutes (configurable).
OpenClaw also includes x_search for X (formerly Twitter) posts and
web_fetch for lightweight URL fetching. In this phase, web_fetch stays
local while web_search and x_search can use xAI Responses under the hood.
Quick start
Section titled “Quick start”Get an API key
Pick a provider and get an API key. See the provider pages below for sign-up links.
Configure
Terminal window openclaw configure --section webThis stores the key and sets the provider. You can also set an env var (e.g.
BRAVE_API_KEY) and skip this step.Use it
The agent can now call
web_search:await web_search({ query: "OpenClaw plugin SDK" });For X posts, use:
await x_search({ query: "dinner recipes" });
Choosing a provider
Section titled “Choosing a provider”Structured results with snippets. Supports llm-context mode, country/language filters. Free tier available.
Key-free fallback. No API key needed. Unofficial HTML-based integration.
Neural + keyword search with content extraction (highlights, text, summaries).
Structured results. Best paired with firecrawl_search and firecrawl_scrape for deep extraction.
AI-synthesized answers with citations via Google Search grounding.
AI-synthesized answers with citations via xAI web grounding.
AI-synthesized answers with citations via Moonshot web search.
Structured results with content extraction controls and domain filtering.
Self-hosted meta-search. No API key needed. Aggregates Google, Bing, DuckDuckGo, and more.
Structured results with search depth, topic filtering, and tavily_extract for URL extraction.
Provider comparison
Section titled “Provider comparison”| Provider | Result style | Filters | API key |
|---|---|---|---|
| Brave | Structured snippets | Country, language, time, llm-context mode | BRAVE_API_KEY |
| DuckDuckGo | Structured snippets | — | None (key-free) |
| Exa | Structured + extracted | Neural/keyword mode, date, content extraction | EXA_API_KEY |
| Firecrawl | Structured snippets | Via firecrawl_search tool | FIRECRAWL_API_KEY |
| Gemini | AI-synthesized + citations | — | GEMINI_API_KEY |
| Grok | AI-synthesized + citations | — | XAI_API_KEY |
| Kimi | AI-synthesized + citations | — | KIMI_API_KEY / MOONSHOT_API_KEY |
| Perplexity | Structured snippets | Country, language, time, domains, content limits | PERPLEXITY_API_KEY / OPENROUTER_API_KEY |
| SearXNG | Structured snippets | Categories, language | None (self-hosted) |
| Tavily | Structured snippets | Via tavily_search tool | TAVILY_API_KEY |
Auto-detection
Section titled “Auto-detection”Native Codex web search
Section titled “Native Codex web search”Codex-capable models can optionally use the provider-native Responses web_search tool instead of OpenClaw’s managed web_search function.
- Configure it under
tools.web.search.openaiCodex - It only activates for Codex-capable models (
openai-codex/*or providers usingapi: "openai-codex-responses") - Managed
web_searchstill applies to non-Codex models mode: "cached"is the default and recommended settingtools.web.search.enabled: falsedisables both managed and native search
{ tools: { web: { search: { enabled: true, openaiCodex: { enabled: true, mode: "cached", allowedDomains: ["example.com"], contextSize: "high", userLocation: { country: "US", city: "New York", timezone: "America/New_York", }, }, }, }, },}If native Codex search is enabled but the current model is not Codex-capable, OpenClaw keeps the normal managed web_search behavior.
Setting up web search
Section titled “Setting up web search”Provider lists in docs and setup flows are alphabetical. Auto-detection keeps a separate precedence order:
If no provider is set, OpenClaw checks for API keys in this order and uses
the first one found:
- Brave —
BRAVE_API_KEYorplugins.entries.brave.config.webSearch.apiKey - Gemini —
GEMINI_API_KEYorplugins.entries.google.config.webSearch.apiKey - Grok —
XAI_API_KEYorplugins.entries.xai.config.webSearch.apiKey - Kimi —
KIMI_API_KEY/MOONSHOT_API_KEYorplugins.entries.moonshot.config.webSearch.apiKey - Perplexity —
PERPLEXITY_API_KEY/OPENROUTER_API_KEYorplugins.entries.perplexity.config.webSearch.apiKey - Firecrawl —
FIRECRAWL_API_KEYorplugins.entries.firecrawl.config.webSearch.apiKey - Tavily —
TAVILY_API_KEYorplugins.entries.tavily.config.webSearch.apiKey
Key-free providers are checked after API-backed providers:
- DuckDuckGo — no key needed (auto-detect order 100)
- SearXNG —
SEARXNG_BASE_URLorplugins.entries.searxng.config.webSearch.baseUrl(auto-detect order 200)
If no provider is detected, it falls back to Brave (you will get a missing-key error prompting you to configure one).
Config
Section titled “Config”{ tools: { web: { search: { enabled: true, // default: true provider: "brave", // or omit for auto-detection maxResults: 5, timeoutSeconds: 30, cacheTtlMinutes: 15, }, }, },}Provider-specific config (API keys, base URLs, modes) lives under
plugins.entries.<plugin>.config.webSearch.*. See the provider pages for
examples.
For x_search, configure plugins.entries.xai.config.xSearch.*. It uses the
same XAI_API_KEY fallback as Grok web search.
Legacy tools.web.x_search.* config is auto-migrated by openclaw doctor --fix.
When you choose Grok during openclaw onboard or openclaw configure --section web,
OpenClaw can also offer optional x_search setup with the same key.
This is a separate follow-up step inside the Grok path, not a separate top-level
web-search provider choice. If you pick another provider, OpenClaw does not
show the x_search prompt.
Storing API keys
Section titled “Storing API keys”Run openclaw configure --section web or set the key directly:
{ plugins: { entries: { brave: { config: { webSearch: { apiKey: "YOUR_KEY", // pragma: allowlist secret }, }, }, }, },}Set the provider env var in the Gateway process environment:
export BRAVE_API_KEY="YOUR_KEY"For a gateway install, put it in ~/.openclaw/.env.
See Env vars.
Tool parameters
Section titled “Tool parameters”| Parameter | Description |
|---|---|
query | Search query (required) |
count | Results to return (1-10, default: 5) |
country | 2-letter ISO country code (e.g. “US”, “DE”) |
language | ISO 639-1 language code (e.g. “en”, “de”) |
freshness | Time filter: day, week, month, or year |
date_after | Results after this date (YYYY-MM-DD) |
date_before | Results before this date (YYYY-MM-DD) |
ui_lang | UI language code (Brave only) |
domain_filter | Domain allowlist/denylist array (Perplexity only) |
max_tokens | Total content budget, default 25000 (Perplexity only) |
max_tokens_per_page | Per-page token limit, default 2048 (Perplexity only) |
x_search
Section titled “x_search”x_search queries X (formerly Twitter) posts using xAI and returns
AI-synthesized answers with citations. It accepts natural-language queries and
optional structured filters. OpenClaw only enables the built-in xAI x_search
tool on the request that serves this tool call.
x_search config
Section titled “x_search config”{ plugins: { entries: { xai: { config: { xSearch: { enabled: true, model: "grok-4-1-fast-non-reasoning", inlineCitations: false, maxTurns: 2, timeoutSeconds: 30, cacheTtlMinutes: 15, }, webSearch: { apiKey: "xai-...", // optional if XAI_API_KEY is set }, }, }, }, },}x_search parameters
Section titled “x_search parameters”| Parameter | Description |
|---|---|
query | Search query (required) |
allowed_x_handles | Restrict results to specific X handles |
excluded_x_handles | Exclude specific X handles |
from_date | Only include posts on or after this date (YYYY-MM-DD) |
to_date | Only include posts on or before this date (YYYY-MM-DD) |
enable_image_understanding | Let xAI inspect images attached to matching posts |
enable_video_understanding | Let xAI inspect videos attached to matching posts |
x_search example
Section titled “x_search example”await x_search({ query: "dinner recipes", allowed_x_handles: ["nytfood"], from_date: "2026-03-01",});// Per-post stats: use the exact status URL or status ID when possibleawait x_search({ query: "https://x.com/huntharo/status/1905678901234567890",});Examples
Section titled “Examples”// Basic searchawait web_search({ query: "OpenClaw plugin SDK" });
// German-specific searchawait web_search({ query: "TV online schauen", country: "DE", language: "de" });
// Recent results (past week)await web_search({ query: "AI developments", freshness: "week" });
// Date rangeawait web_search({ query: "climate research", date_after: "2024-01-01", date_before: "2024-06-30",});
// Domain filtering (Perplexity only)await web_search({ query: "product reviews", domain_filter: ["-reddit.com", "-pinterest.com"],});Tool profiles
Section titled “Tool profiles”If you use tool profiles or allowlists, add web_search, x_search, or group:web:
{ tools: { allow: ["web_search", "x_search"], // or: allow: ["group:web"] (includes web_search, x_search, and web_fetch) },}Related
Section titled “Related”- Web Fetch — fetch a URL and extract readable content
- Web Browser — full browser automation for JS-heavy sites
- Grok Search — Grok as the
web_searchprovider