--- summary: "Perplexity Search API and Sonar/OpenRouter compatibility for web_search" read_when: - You want to use Perplexity Search for web search - You need PERPLEXITY_API_KEY or OPENROUTER_API_KEY setup title: "Perplexity Search" --- # Perplexity Search API OpenClaw supports Perplexity Search API as a `web_search` provider. It returns structured results with `title`, `url`, and `snippet` fields. For compatibility, OpenClaw also supports legacy Perplexity Sonar/OpenRouter setups. If you use `OPENROUTER_API_KEY`, an `sk-or-...` key in `tools.web.search.perplexity.apiKey`, or set `tools.web.search.perplexity.baseUrl` / `model`, the provider switches to the chat-completions path and returns AI-synthesized answers with citations instead of structured Search API results. ## Getting a Perplexity API key 1. Create a Perplexity account at 2. Generate an API key in the dashboard 3. Store the key in config or set `PERPLEXITY_API_KEY` in the Gateway environment. ## OpenRouter compatibility If you were already using OpenRouter for Perplexity Sonar, keep `provider: "perplexity"` and set `OPENROUTER_API_KEY` in the Gateway environment, or store an `sk-or-...` key in `tools.web.search.perplexity.apiKey`. Optional legacy controls: - `tools.web.search.perplexity.baseUrl` - `tools.web.search.perplexity.model` ## Config examples ### Native Perplexity Search API ```json5 { tools: { web: { search: { provider: "perplexity", perplexity: { apiKey: "pplx-...", }, }, }, }, } ``` ### OpenRouter / Sonar compatibility ```json5 { tools: { web: { search: { provider: "perplexity", perplexity: { apiKey: "", baseUrl: "https://openrouter.ai/api/v1", model: "perplexity/sonar-pro", }, }, }, }, } ``` ## Where to set the key **Via config:** run `openclaw configure --section web`. It stores the key in `~/.openclaw/openclaw.json` under `tools.web.search.perplexity.apiKey`. That field also accepts SecretRef objects. **Via environment:** set `PERPLEXITY_API_KEY` or `OPENROUTER_API_KEY` in the Gateway process environment. For a gateway install, put it in `~/.openclaw/.env` (or your service environment). See [Env vars](/help/faq#how-does-openclaw-load-environment-variables). If `provider: "perplexity"` is configured and the Perplexity key SecretRef is unresolved with no env fallback, startup/reload fails fast. ## Tool parameters These parameters apply to the native Perplexity Search API path. | Parameter | Description | | --------------------- | ---------------------------------------------------- | | `query` | Search query (required) | | `count` | Number of 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", "fr") | | `freshness` | Time filter: `day` (24h), `week`, `month`, or `year` | | `date_after` | Only results published after this date (YYYY-MM-DD) | | `date_before` | Only results published before this date (YYYY-MM-DD) | | `domain_filter` | Domain allowlist/denylist array (max 20) | | `max_tokens` | Total content budget (default: 25000, max: 1000000) | | `max_tokens_per_page` | Per-page token limit (default: 2048) | For the legacy Sonar/OpenRouter compatibility path, only `query` and `freshness` are supported. Search API-only filters such as `country`, `language`, `date_after`, `date_before`, `domain_filter`, `max_tokens`, and `max_tokens_per_page` return explicit errors. **Examples:** ```javascript // Country and language-specific search await web_search({ query: "renewable energy", country: "DE", language: "de", }); // Recent results (past week) await web_search({ query: "AI news", freshness: "week", }); // Date range search await web_search({ query: "AI developments", date_after: "2024-01-01", date_before: "2024-06-30", }); // Domain filtering (allowlist) await web_search({ query: "climate research", domain_filter: ["nature.com", "science.org", ".edu"], }); // Domain filtering (denylist - prefix with -) await web_search({ query: "product reviews", domain_filter: ["-reddit.com", "-pinterest.com"], }); // More content extraction await web_search({ query: "detailed AI research", max_tokens: 50000, max_tokens_per_page: 4096, }); ``` ### Domain filter rules - Maximum 20 domains per filter - Cannot mix allowlist and denylist in the same request - Use `-` prefix for denylist entries (e.g., `["-reddit.com"]`) ## Notes - Perplexity Search API returns structured web search results (`title`, `url`, `snippet`) - OpenRouter or explicit `baseUrl` / `model` switches Perplexity back to Sonar chat completions for compatibility - Results are cached for 15 minutes by default (configurable via `cacheTtlMinutes`) See [Web tools](/tools/web) for the full web_search configuration. See [Perplexity Search API docs](https://docs.perplexity.ai/docs/search/quickstart) for more details.