Free meta-search via SearXNG — aggregates results from 70+ search engines. Self-hosted or use a public instance. No API key needed. Falls back automatically when the web search toolset is unavailable.
56
66%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
Fix and improve this skill with Tessl
tessl review fix ./optional-skills/research/searxng-search/SKILL.mdFree 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:
# Public instances (no setup required)
SEARXNG_URL=https://searxng.example.com
# Self-hosted SearXNG
SEARXNG_URL=http://localhost:8888If 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:
# 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 200Decision 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.
# 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 |
# 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:
import 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()For more structured access, install the searxng-data package:
pip install searxng-datafrom searxng_data import engines
# List available engines
print(engines.list_engines())Note: This package only provides engine metadata, not the search API itself.
To run your own SearXNG instance:
# Using Docker
docker run -d -p 8888:8080 \
-v $(pwd)/searxng:/etc/searxng \
searxng/searxng:latest
# Then set
SEARXNG_URL=http://localhost:8888Or install via pip:
pip install searxng
# Edit /etc/searxng/settings.yml
searxng-runPublic 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.
# 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_extractSEARXNG_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/
4c9628e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.