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