Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Free keyless meta-search aggregating 70+ engines.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 84% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 269% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 71% | 0% |
Free meta-search using SearXNG — a privacy-respecting, self-hosted search aggregator that queries 70+ search engines simultaneously.
No API key required when using a public instance. Can also be self-hosted for full control. Automatically appears as a fallback when the main web search toolset (FIRECRAWL_API_KEY) is not configured.
SearXNG requires a SEARXNG_URL environment variable pointing to your SearXNG instance:
bash# Public instances (no setup required) SEARXNG_URL=https://searxng.example.com # Self-hosted SearXNG SEARXNG_URL=http://localhost:8888
If no instance is configured, this skill is unavailable and the agent falls back to other search options.
Check what is actually available before choosing an approach:
bash# Check if SEARXNG_URL is set and the instance is reachable curl -s --max-time 5 "${SEARXNG_URL}/search?q=test&format=json" | head -c 200
Decision tree:
SEARXNG_URL is set and the instance responds, use SearXNGSEARXNG_URL is unset or unreachable, fall back to other available search toolsUse curl via terminal to call the SearXNG JSON API. This avoids assuming any particular Python package is installed.
bash# Text search (JSON output) curl -s --max-time 10 \ "${SEARXNG_URL}/search?q=python+async+programming&format=json&engines=google,bing&limit=10" # With Safesearch off curl -s --max-time 10 \ "${SEARXNG_URL}/search?q=example&format=json&safesearch=0" # Specific categories (general, news, science, etc.) curl -s --max-time 10 \ "${SEARXNG_URL}/search?q=AI+news&format=json&categories=news"
| Flag | Description | Example | |------|-------------|---------| | q | Query string (URL-encoded) | q=python+async | | format | Output format: json, csv, rss | format=json | | engines | Comma-separated engine names | engines=google,bing,ddg | | limit | Max results per engine (default 10) | limit=5 | | categories | Filter by category | categories=news,science | | safesearch | 0=none, 1=moderate, 2=strict | safesearch=0 | | time_range | Filter: day, week, month, year | time_range=week |
bash# Extract titles and URLs from JSON curl -s --max-time 10 "${SEARXNG_URL}/search?q=fastapi&format=json&limit=5" \ | python3 -c " import json, sys data = json.load(sys.stdin) for r in data.get('results', []): print(r.get('title','')) print(r.get('url','')) print(r.get('content','')[:200]) print() "
Returns per result: title, url, content (snippet), engine, parsed_url, img_src, thumbnail, author, published_date
requestsUse the SearXNG REST API directly from Python with the requests library:
pythonimport os, requests, urllib.parse base_url = os.environ.get("SEARXNG_URL", "") if not base_url: raise RuntimeError("SEARXNG_URL is not set") query = "fastapi deployment guide" params = { "q": query, "format": "json", "limit": 5, "engines": "google,bing", } resp = requests.get(f"{base_url}/search", params=params, timeout=10) resp.raise_for_status() data = resp.json() for r in data.get("results", []): print(r["title"]) print(r["url"]) print(r.get("content", "")[:200]) print()
To run your own SearXNG instance:
bash# Using Docker docker run -d -p 8888:8080 \ -v $(pwd)/searxng:/etc/searxng \ searxng/searxng:latest # Then set SEARXNG_URL=http://localhost:8888
Or install via pip:
bashpip install searxng # Edit /etc/searxng/settings.yml searxng-run
Public SearXNG instances are available at:
https://searxng.example.com (replace with any public instance)SearXNG returns titles, URLs, and snippets — not full page content. To get full page content, search first and then extract the most relevant URL with web_extract, browser tools, or curl.
bash# Search for relevant pages curl -s "${SEARXNG_URL}/search?q=fastapi+deployment&format=json&limit=3" # Output: list of results with titles and URLs # Then extract the best URL with web_extract
SEARXNG_URL is set and the instance is reachable.web_extract, browser tools, or curl for full articles.| Problem | Likely Cause | What To Do | |---------|--------------|------------| | SEARXNG_URL not set | No instance configured | Use a public SearXNG instance or set up your own | | Connection refused | Instance not running or wrong URL | Check the URL is correct and the instance is running | | Empty results | Instance blocks the query | Try a different instance or self-host | | Slow responses | Public instance under load | Self-host or use a less-loaded public instance | | json format not supported | Old SearXNG version | Try format=rss or upgrade SearXNG |
SEARXNG_URL: Without it, the skill cannot function.urllib.parse.quote() in Python.format=json: The default format may not be machine-readable. Always request JSON explicitly.--max-time or timeout= to avoid hanging on unreachable instances.If SEARXNG_URL is not set and the user asks about SearXNG, help them either:
Public instances are listed at: https://searxng.org/
Other measured skills in the registry, with their headline benchmark lift.