Hosted: https://api.fastcrw.com/v1/search ·
Self-hosted: http://localhost:3000/v1/search
Auth (hosted only): Authorization: Bearer $CRW_API_KEY
Body: {"query": string, "limit": number}
{
"success": true,
"data": [
{
"url": "https://...",
"title": "...",
"snippet": "LLM-ready summary line (same value as description)",
"description": "LLM-ready summary line (same value as snippet)",
"position": 1,
"score": 9.5,
"category": "general"
}
]
}
Results are nested under response["data"] — iterate that array.
Each row has title, url, snippet,
description, position, score,
category. snippet is the LLM-ready summary line
(Firecrawl-compatible name); description is the same value
under the SearXNG-native name.
#!/usr/bin/env python3
import json, os, urllib.request
req = urllib.request.Request(
"https://api.fastcrw.com/v1/search",
data=json.dumps({"query": "...", "limit": 3}).encode(),
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['CRW_API_KEY']}",
},
method="POST",
)
with urllib.request.urlopen(req) as r:
body = json.loads(r.read()) # body == {"success": true, "data": [...]}
print(json.dumps(
[{"title": x["title"], "url": x["url"], "snippet": x["snippet"]}
for x in body["data"]],
indent=2,
))
# Run with: python3 search.py (the script is python3-only)
Full quickstart at root: https://docs.fastcrw.com/