Free Search Aggregator
Reliable, provider-diverse web search for OpenClaw with high uptime + low operator overhead.
Why use this skill
- 12 search providers, 6 requiring no API key at all
- Automatic failover: if one provider fails, the next is tried instantly
- Quota-aware: tracks daily usage, warns at 80%, skips exhausted providers
- Task search mode for multi-angle research queries
- Built-in storage lifecycle (cache / index / report), no workspace clutter
- Self-healing: health-based smart routing automatically promotes reliable providers
- Quality optimization: relevance scoring, fuzzy dedup, domain diversity, re-ranking
- Auto-discovery: probes candidate search engines and SearXNG instances for new sources
- Self-diagnostic:
doctor and setup commands for zero-friction onboarding
Provider Overview
| Provider |
Key Required |
Free Quota |
Index Source |
Notes |
brave |
BRAVE_API_KEY |
2000/day |
Brave independent |
High quality, privacy-friendly |
exa |
EXA_API_KEY |
~33/day (1k/mo) |
Neural + web |
Semantic search, unique finds |
tavily |
TAVILY_API_KEY |
1000/day |
Web (AI-optimized) |
Designed for AI agents |
duckduckgo |
None |
~500/day |
Bing + own |
No key, privacy-focused |
bing_html |
None |
~300/day |
Microsoft Bing RSS |
No key, stable XML feed |
mojeek |
None (or MOJEEK_API_KEY) |
200/day |
Mojeek independent |
Non-Google/Bing index |
serper |
SERPER_API_KEY |
2500/day |
Google |
High quota free tier |
searchapi |
SEARCHAPI_API_KEY |
100/mo |
Google / Bing |
Multi-engine |
google_cse |
GOOGLE_API_KEY + GOOGLE_CX |
100/day |
Google |
Official Google API |
baidu |
BAIDU_API_KEY |
200/day |
Baidu |
Best for Chinese content |
wikipedia |
None |
1000/day |
Wikipedia |
Factual/encyclopedic queries |
searxng |
None |
unlimited (self-hosted) |
Meta (all engines) |
Requires own instance |
Total daily quota (all keys configured): 8400+ requests/day
Credential model (important)
- No mandatory API key — DuckDuckGo + Bing RSS + Mojeek + Wikipedia work out of the box.
- API-key providers fail gracefully if key is missing (AuthError → skip, no quota consumed, no latency):
BRAVE_API_KEY
EXA_API_KEY
TAVILY_API_KEY
SERPER_API_KEY
SEARCHAPI_API_KEY
GOOGLE_API_KEY + GOOGLE_CX
BAIDU_API_KEY
MOJEEK_API_KEY (optional — without it uses HTML scraping)
Core capabilities
1. Search failover
Default provider order:
brave → exa → tavily → duckduckgo → bing_html → mojeek → serper → searchapi → google_cse → baidu → wikipedia
First successful non-empty result returns immediately.
2. Task-level multi-query search
- Expands one goal into multiple targeted queries
- Aggregates + deduplicates results
- Prefix presets:
- default:
workers=1
@dual ... → workers=2
@deep ... → workers=3 + deeper query coverage
3. Quota intelligence
- Per-provider daily tracking
- Real quota retrieval where supported (Tavily, SearchAPI, Brave via probe)
- Auto concurrency reduction at 80% quota saturation
4. Provider health monitoring
- Tracks success rate, latency, and error types per provider over time
- Computes health scores (success 50%, latency 30%, freshness 20%)
- Smart ordering: auto-promotes healthy providers, demotes degraded ones
- View dashboard:
python -m free_search health
5. Result quality optimization
- Relevance scoring (query-title-snippet token overlap)
- Enhanced dedup: URL + title similarity (Jaccard threshold)
- Domain diversity: limits same-domain results (default max 3)
- Automatic filtering of low-quality results (short titles, missing URLs)
6. Source auto-discovery
- Probes all configured providers for availability
- Scans candidate search engines (Marginalia, Wiby, public SearXNG instances)
- Validates response format, latency, and result quality
- Generates recommendations for new sources to integrate
- Run:
python -m free_search discover
7. Managed persistence
memory/search-cache/YYYY-MM-DD/*.json
memory/search-index/search-index.jsonl
memory/search-reports/YYYY-MM-DD/*.md
Quick commands
# Normal search
scripts/search "latest AI agent frameworks 2026" --max-results 5
# Task search (multi-query, parallel)
scripts/search task "@dual Compare Claude vs GPT-4 for code generation" --max-results 5
# Deep research mode
scripts/search task "@deep autonomous vehicle safety 2026" --max-results 8 --max-queries 10
# Quota status
scripts/status
# Real quota from provider APIs
scripts/remaining --real
# Cleanup cache
python3 -m free_search gc --cache-days 14
# Provider health dashboard
python3 -m free_search health
# Discover new search sources
python3 -m free_search discover
# System diagnostics
python3 -m free_search doctor
# Setup status & recommendations
python3 -m free_search setup
Provider setup guides
Bing RSS (bing_html) — No key needed
Uses Bing's built-in RSS endpoint (format=rss) — bypasses bot detection. Works out of the box.
Mojeek — No key needed (API key optional)
Out-of-the-box HTML scraping. For higher quotas/stability:
- Register at https://www.mojeek.com/services/search/api/
- Set
MOJEEK_API_KEY → automatically switches to JSON API mode
Wikipedia — No key needed
Multilingual support — change lang in providers.yaml:
wikipedia:
lang: it # en | zh | it | de | fr | ja ...
Exa.ai — API key required
- Register at https://exa.ai/
- Set
EXA_API_KEY
- Free tier: 1000 searches/month (~33/day)
Google Custom Search — API key + CX required
- Get API key: https://developers.google.com/custom-search/v1/introduction
- Create search engine: https://programmablesearchengine.google.com/
- Set
GOOGLE_API_KEY and GOOGLE_CX
- Free tier: 100 queries/day
Baidu Qianfan — API key required
- Register at https://cloud.baidu.com/
- Set
BAIDU_API_KEY
- Best for Chinese-language content
SearXNG — Self-hosted instance required
Public instances rate-limit server-to-server requests. Use your own:
docker run -d -p 8080:8080 searxng/searxng
Then in providers.yaml:
searxng:
endpoint: http://localhost:8080
enabled: true
Post-install self-check
# 1) Confirm provider load
scripts/status --compact
# 2) Smoke test (uses duckduckgo/bing/mojeek out of the box)
scripts/search "openclaw" --max-results 3 --compact
# 3) Verify storage paths
ls -la /home/openclaw/.openclaw/workspace/memory/search-cache/ | tail -n 5
# 4) Check real quota (optional)
scripts/remaining --real --compact
Output contract (stable)
- Search:
query, provider, results[], meta.attempted, meta.quota
- Task search:
task, queries[], grouped_results[], merged_results[], meta
- Quota:
date, providers[], totals; with --real: real_quota.providers[]
Operator notes
- Default mode:
workers=1 — conservative for cost control
- Use
@dual / @deep only for research tasks
SearXNG and YaCy are enabled: false by default (self-hosted only)
MOJEEK_API_KEY is optional — provider gracefully falls back to HTML scraping
- Provider health data stored in
memory/provider-health/health.jsonl
- Discovery results stored in
memory/provider-discovery/discovery.jsonl
- Run
python -m free_search doctor after setup to verify everything works
- Run
python -m free_search discover periodically to find new search sources
1---2name: free-search-aggregator3description: Quota-aware multi-provider web search for OpenClaw. Supports 12 search providers with automatic failover, task-level deep search (@dual/@deep), real quota checks, and managed result storage under memory/.4---56# Free Search Aggregator78Reliable, provider-diverse web search for OpenClaw with **high uptime + low operator overhead**.910## Why use this skill1112- **12 search providers**, 6 requiring no API key at all13- Automatic failover: if one provider fails, the next is tried instantly14- Quota-aware: tracks daily usage, warns at 80%, skips exhausted providers15- Task search mode for multi-angle research queries16- Built-in storage lifecycle (cache / index / report), no workspace clutter17- **Self-healing**: health-based smart routing automatically promotes reliable providers18- **Quality optimization**: relevance scoring, fuzzy dedup, domain diversity, re-ranking19- **Auto-discovery**: probes candidate search engines and SearXNG instances for new sources20- **Self-diagnostic**: `doctor` and `setup` commands for zero-friction onboarding2122---2324## Provider Overview2526| Provider | Key Required | Free Quota | Index Source | Notes |27|----------------|-------------|-------------------|-----------------------|---------------------------------|28| `brave` | BRAVE_API_KEY | 2000/day | Brave independent | High quality, privacy-friendly |29| `exa` | EXA_API_KEY | ~33/day (1k/mo) | Neural + web | Semantic search, unique finds |30| `tavily` | TAVILY_API_KEY | 1000/day | Web (AI-optimized) | Designed for AI agents |31| `duckduckgo` | None | ~500/day | Bing + own | No key, privacy-focused |32| `bing_html` | None | ~300/day | Microsoft Bing RSS | No key, stable XML feed |33| `mojeek` | None (or MOJEEK_API_KEY) | 200/day | Mojeek independent | Non-Google/Bing index |34| `serper` | SERPER_API_KEY | 2500/day | Google | High quota free tier |35| `searchapi` | SEARCHAPI_API_KEY | 100/mo | Google / Bing | Multi-engine |36| `google_cse` | GOOGLE_API_KEY + GOOGLE_CX | 100/day | Google | Official Google API |37| `baidu` | BAIDU_API_KEY | 200/day | Baidu | Best for Chinese content |38| `wikipedia` | None | 1000/day | Wikipedia | Factual/encyclopedic queries |39| `searxng` | None | unlimited (self-hosted) | Meta (all engines) | Requires own instance |4041**Total daily quota (all keys configured): 8400+ requests/day**4243---4445## Credential model (important)4647- **No mandatory API key** — DuckDuckGo + Bing RSS + Mojeek + Wikipedia work out of the box.48- API-key providers fail gracefully if key is missing (AuthError → skip, no quota consumed, no latency):49 - `BRAVE_API_KEY`50 - `EXA_API_KEY`51 - `TAVILY_API_KEY`52 - `SERPER_API_KEY`53 - `SEARCHAPI_API_KEY`54 - `GOOGLE_API_KEY` + `GOOGLE_CX`55 - `BAIDU_API_KEY`56 - `MOJEEK_API_KEY` (optional — without it uses HTML scraping)5758---5960## Core capabilities6162### 1. Search failover63Default provider order:64```65brave → exa → tavily → duckduckgo → bing_html → mojeek → serper → searchapi → google_cse → baidu → wikipedia66```67First successful non-empty result returns immediately.6869### 2. Task-level multi-query search70- Expands one goal into multiple targeted queries71- Aggregates + deduplicates results72- Prefix presets:73 - default: `workers=1`74 - `@dual ...` → `workers=2`75 - `@deep ...` → `workers=3` + deeper query coverage7677### 3. Quota intelligence78- Per-provider daily tracking79- Real quota retrieval where supported (Tavily, SearchAPI, Brave via probe)80- Auto concurrency reduction at 80% quota saturation8182### 4. Provider health monitoring83- Tracks success rate, latency, and error types per provider over time84- Computes health scores (success 50%, latency 30%, freshness 20%)85- **Smart ordering**: auto-promotes healthy providers, demotes degraded ones86- View dashboard: `python -m free_search health`8788### 5. Result quality optimization89- Relevance scoring (query-title-snippet token overlap)90- Enhanced dedup: URL + title similarity (Jaccard threshold)91- Domain diversity: limits same-domain results (default max 3)92- Automatic filtering of low-quality results (short titles, missing URLs)9394### 6. Source auto-discovery95- Probes all configured providers for availability96- Scans candidate search engines (Marginalia, Wiby, public SearXNG instances)97- Validates response format, latency, and result quality98- Generates recommendations for new sources to integrate99- Run: `python -m free_search discover`100101### 7. Managed persistence102- `memory/search-cache/YYYY-MM-DD/*.json`103- `memory/search-index/search-index.jsonl`104- `memory/search-reports/YYYY-MM-DD/*.md`105106---107108## Quick commands109110```bash111# Normal search112scripts/search "latest AI agent frameworks 2026" --max-results 5113114# Task search (multi-query, parallel)115scripts/search task "@dual Compare Claude vs GPT-4 for code generation" --max-results 5116117# Deep research mode118scripts/search task "@deep autonomous vehicle safety 2026" --max-results 8 --max-queries 10119120# Quota status121scripts/status122123# Real quota from provider APIs124scripts/remaining --real125126# Cleanup cache127python3 -m free_search gc --cache-days 14128129# Provider health dashboard130python3 -m free_search health131132# Discover new search sources133python3 -m free_search discover134135# System diagnostics136python3 -m free_search doctor137138# Setup status & recommendations139python3 -m free_search setup140```141142---143144## Provider setup guides145146### Bing RSS (`bing_html`) — No key needed147Uses Bing's built-in RSS endpoint (`format=rss`) — bypasses bot detection. Works out of the box.148149### Mojeek — No key needed (API key optional)150Out-of-the-box HTML scraping. For higher quotas/stability:1511. Register at https://www.mojeek.com/services/search/api/1522. Set `MOJEEK_API_KEY` → automatically switches to JSON API mode153154### Wikipedia — No key needed155Multilingual support — change `lang` in `providers.yaml`:156```yaml157wikipedia:158 lang: it # en | zh | it | de | fr | ja ...159```160161### Exa.ai — API key required1621. Register at https://exa.ai/1632. Set `EXA_API_KEY`1643. Free tier: 1000 searches/month (~33/day)165166### Google Custom Search — API key + CX required1671. Get API key: https://developers.google.com/custom-search/v1/introduction1682. Create search engine: https://programmablesearchengine.google.com/1693. Set `GOOGLE_API_KEY` and `GOOGLE_CX`1704. Free tier: 100 queries/day171172### Baidu Qianfan — API key required1731. Register at https://cloud.baidu.com/1742. Set `BAIDU_API_KEY`1753. Best for Chinese-language content176177### SearXNG — Self-hosted instance required178Public instances rate-limit server-to-server requests. Use your own:179```bash180docker run -d -p 8080:8080 searxng/searxng181```182Then in `providers.yaml`:183```yaml184searxng:185 endpoint: http://localhost:8080186 enabled: true187```188189---190191## Post-install self-check192193```bash194# 1) Confirm provider load195scripts/status --compact196197# 2) Smoke test (uses duckduckgo/bing/mojeek out of the box)198scripts/search "openclaw" --max-results 3 --compact199200# 3) Verify storage paths201ls -la /home/openclaw/.openclaw/workspace/memory/search-cache/ | tail -n 5202203# 4) Check real quota (optional)204scripts/remaining --real --compact205```206207---208209## Output contract (stable)210211- **Search**: `query`, `provider`, `results[]`, `meta.attempted`, `meta.quota`212- **Task search**: `task`, `queries[]`, `grouped_results[]`, `merged_results[]`, `meta`213- **Quota**: `date`, `providers[]`, `totals`; with `--real`: `real_quota.providers[]`214215---216217## Operator notes218219- Default mode: `workers=1` — conservative for cost control220- Use `@dual` / `@deep` only for research tasks221- `SearXNG` and `YaCy` are `enabled: false` by default (self-hosted only)222- `MOJEEK_API_KEY` is optional — provider gracefully falls back to HTML scraping223- Provider health data stored in `memory/provider-health/health.jsonl`224- Discovery results stored in `memory/provider-discovery/discovery.jsonl`225- Run `python -m free_search doctor` after setup to verify everything works226- Run `python -m free_search discover` periodically to find new search sources