web-search-apilisted
Install: claude install-skill Drvivek34/Skill-Bazaar
# Web Search API Integration
Pick the right provider, wire auth the way each API actually expects, and don't burn quota.
## Provider selection
| Situation | Use |
|---|---|
| Default LLM-friendly search | Tavily |
| Conceptual / semantic queries | Exa |
| Need page content (not snippets) | Firecrawl |
| Freshness-critical lookups | Brave Search API |
| Exact Google SERP / answer boxes | Serper.dev or Google CSE |
| Unlimited dev/testing | Self-hosted SearXNG |
Free tiers (verified 2026-08-24): Tavily 1,000 credits/mo · Exa $20 signup + $10/mo ·
Firecrawl 1,000 credits/mo · Brave $5/mo credits (card required since Aug 2025) ·
Serper 2,500 one-time · Google CSE 100 queries/day · SearXNG unlimited self-hosted.
## Auth shapes (the part everyone gets wrong)
| Provider | Auth location | Env var convention |
|---|---|---|
| Tavily | `api_key` **in JSON body** | `TAVILY_API_KEY` |
| Exa | `x-api-key` header | `EXA_API_KEY` |
| Firecrawl | `Authorization: Bearer` header | `FIRECRAWL_API_KEY` |
| Brave | `X-Subscription-Token` header | `BRAVE_SEARCH_API_KEY` (never `BRAVE_API_KEY`) |
| Serper | `X-API-KEY` header | `SERPER_API_KEY` |
| Google CSE | `key` + `cx` query params | `GCS_API_KEY` + `GCS_CX` |
| SearXNG | none (JSON format must be enabled server-side) | n/a |
## Reference implementations
```python
import os, requests
def tavily_search(q, n=5):
r = requests.post("https://api.tavily.com/search", json={
"api_key": os.environ["TAVILY_API_KEY"], "query": q,