Docs

API reference

Base URL https://fetchrouter.dev. Authenticate with Authorization: Bearer fr_…. Get a key on the home page (500 free credits).

POST /v1/fetch

FieldTypeNotes
urlstringRequired. Public http(s) URL.
mode"markdown" | "html" | "rendered"Default markdown (main content, links made absolute). html returns the raw page. rendered always uses a browser and returns the HTML after JavaScript runs.
expect.textstringOptional. The page passes only if this text appears (case-insensitive).
expect.selectorstringOptional. CSS selector that must match.
maxCostintegerMost credits you'll pay for this page. Default 5: static and browser routes. Set 1 for static only. Set 10 or 25 to allow premium unblockers.
timeoutMsintegerTotal time across all attempts. Default 60000, max 120000.

Response

{
  "ok": true,                 // a route passed verification
  "content": "…",             // markdown or HTML
  "verdict": { "passed": true, "checks": [ { "name": "status", "passed": true, "detail": "200" }, … ] },
  "provider": "direct",       // route that delivered
  "attempts": [ … ],          // every route tried, with its verdict and latency
  "billed": true,
  "costCredits": 1,
  "balanceCredits": 499,
  "finalUrl": "https://…",
  "contentSha256": "…",
  "requestId": "…"
}

Failure reasons in verdict.reason: blocked:<vendor> (cloudflare, datadome, perimeterx, akamai, imperva, kasada, aws_waf, captcha, access_denied, login_wall, rate_limited, js_required), http_<status>, empty_shell, too_short, expect_text_missing, expect_selector_missing, provider_error. A 404 stops the chain and isn't billed.

HTTP errors: 401 bad key, 402 out of credits, 429 more than 10 requests in flight, 400 invalid or private URL, 451 site opted out.

Pricing tiers

A pass costs the tier of the route that delivered it: 1 credit for static routes, 5 for a browser, 10–25 for premium unblockers. A failure costs 0. maxCost caps the tier per request. 1 credit = $0.001.

GET /v1/account

Balance and 30-day usage.

GET /v1/reliability?domain=example.com

No key needed. Pass rate, attempts and p50 latency per route for a domain over 30 days.

POST /v1/checkout

{"pack": "starter" | "growth" | "scale"} returns a Stripe Checkout URL.

MCP

npx -y fetchrouter-mcp   # env FETCHROUTER_API_KEY=fr_…  (optional FETCHROUTER_BASE_URL)

Tools: fetch_page(url, mode?, expect_text?, max_cost?) and domain_reliability(domain).

Use policy