POST /v1/search

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}

Response shape

{
  "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.

Python (stdlib)

#!/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/