Multi-Service Search Proxy
Unified proxy for Tavily, Firecrawl, and Exa APIs. Manages key pools with round-robin selection, automatic key rotation on 401/429, and per-user quota management.
Base URL:
Authentication
All proxy endpoints accept: Authorization: Bearer sk-your-token header.
Tavily endpoints also accept api_key in the request body for SDK compatibility. Firecrawl and Exa use the standard Bearer token — the proxy replaces it with a pool key server-side, so downstream callers only need the manager token.
Tavily Endpoints
| Method | Path | Description | Timeout |
POST | /search | Web search | 30s |
POST | /extract | Content extraction | 60s |
POST | /crawl | Website crawling | 180s |
POST | /map | Site mapping | 180s |
POST | /research | Research reports | 300s |
GET | /research/{id} | Research status | 30s |
GET | /usage | Quota info | 10s |
All paths work with or without /v1 prefix.
Firecrawl Endpoints
All Firecrawl endpoints accept both /v1/ and /v2/ prefixes. Internally, requests are always forwarded to the upstream v2 API.
Scrape & Search
| Method | Path | Description | Timeout |
POST | /firecrawl/v1/scrape | Scrape a single URL | 60s |
POST | /firecrawl/v1/search | Web search + scrape | 30s |
Crawl
| Method | Path | Description | Timeout |
POST | /firecrawl/v1/crawl | Start crawl job | 180s |
GET | /firecrawl/v1/crawl/{id} | Crawl status | 60s |
GET | /firecrawl/v2/crawl/{id}/status | Crawl status (alias) | 60s |
DELETE | /firecrawl/v1/crawl/{id} | Cancel crawl | 60s |
DELETE | /firecrawl/v2/crawl/{id}/cancel | Cancel crawl (alias) | 60s |
GET | /firecrawl/v1/crawl/{id}/errors | Crawl errors | 60s |
GET | /firecrawl/v1/crawl/active | Active crawls | 60s |
POST | /firecrawl/v1/crawl/params-preview | Preview crawl params | 60s |
Map & Extract
| Method | Path | Description | Timeout |
POST | /firecrawl/v1/map | List site URLs | 180s |
POST | /firecrawl/v1/extract | Structured extraction | 120s |
GET | /firecrawl/v1/extract/{id} | Extract status | 120s |
Batch Scrape
| Method | Path | Description | Timeout |
POST | /firecrawl/v1/batch-scrape | Start batch scrape | 60s |
GET | /firecrawl/v1/batch-scrape/{id} | Batch status | 60s |
DELETE | /firecrawl/v1/batch-scrape/{id} | Cancel batch | 60s |
DELETE | /firecrawl/v2/batch-scrape/{id}/cancel | Cancel batch (alias) | 60s |
GET | /firecrawl/v1/batch-scrape/{id}/errors | Batch errors | 60s |
Agent & Browser
| Method | Path | Description | Timeout |
POST | /firecrawl/v1/agent | Create agent job | 120s |
GET | /firecrawl/v1/agent/{id} | Agent job status | 120s |
DELETE | /firecrawl/v1/agent/{id} | Cancel agent job | 120s |
POST | /firecrawl/v1/browser | Create browser session | 120s |
GET | /firecrawl/v1/browser | List sessions | 120s |
POST | /firecrawl/v1/browser/{id}/execute | Execute in session | 120s |
DELETE | /firecrawl/v1/browser/{id} | Close session | 120s |
Team & Usage
| Method | Path | Description | Timeout |
GET | /firecrawl/v1/credit-usage | Credit usage (legacy alias) | 10s |
GET | /firecrawl/v1/team/credit-usage | Credit usage | 10s |
GET | /firecrawl/v1/team/token-usage | Token usage | 10s |
GET | /firecrawl/v1/team/queue-status | Queue status | 10s |
Exa Endpoints
The proxy auto-injects "type": "auto" for /exa/search if not specified in the body.
| Method | Path | Description | Timeout |
POST | /exa/search | Neural / keyword / auto search | 60s |
POST | /exa/contents | Get page contents by ID | 30s |
POST | /exa/answer | LLM answer with citations | 60s |
POST | /exa/findSimilar | Find similar links to a URL | 30s |
Examples
Tavily Search
curl -X POST BASE_URL/search \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-d '{"query": "latest AI news", "max_results": 5}'
Firecrawl Scrape
curl -X POST BASE_URL/firecrawl/v1/scrape \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-d '{"url": "https://example.com"}'
Firecrawl Crawl + Status
# Start crawl
curl -X POST BASE_URL/firecrawl/v1/crawl \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-d '{"url": "https://example.com", "limit": 10}'
# Check status
curl BASE_URL/firecrawl/v2/crawl/{id}/status \
-H "Authorization: Bearer sk-your-token"
# Cancel
curl -X DELETE BASE_URL/firecrawl/v2/crawl/{id}/cancel \
-H "Authorization: Bearer sk-your-token"
Exa Search
curl -X POST BASE_URL/exa/search \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-d '{"query": "machine learning frameworks", "numResults": 5}'
Note: "type": "auto" is injected automatically if not provided.
Import Guide
The import dialog accepts multiple formats. Service is auto-detected from key prefixes:
| Prefix | Service |
tvly-* | Tavily |
fc-* | Firecrawl |
| UUID format | Exa |
Registrar CSV
firecrawl@example.com,password,fc-abc123456789
exa@example.com,EMAIL_OTP_ONLY,550e8400-e29b-41d4-a716-446655440000
Key-only (one per line)
fc-abc123456789012345678
550e8400-e29b-41d4-a716-446655440000
tvly-abcdef1234567890
Key-only imports auto-generate placeholder emails. Duplicates are silently skipped (ON CONFLICT DO NOTHING).