import type { Metadata } from "next"; import { CodeBlock } from "@/components/ui/code-block"; import { DocPage } from "@/components/docs/doc-page"; import { A, CardGrid, Code, H2, H3, Lead, Li, LinkCard, P, Strong, Table, TBody, Td, Th, THead, Tr, Ul } from "@/components/docs/prose"; import { Callout } from "@/components/docs/callout"; import { Badge } from "@/components/ui/badge"; export const metadata: Metadata = { title: "Introduction", description: "What Fetcha is, how to think about it, what is live today and what is coming next.", }; const LIVE: Array<[string, string]> = [ ["POST /v1/fetch", "Fetch any public http(s) URL through the routing engine. HTML, text, Markdown, JSON or raw output, page metadata and links."], ["Managed browser", "browser: true renders the page in a headless Chromium on the same route; blocked HTTP attempts escalate to it automatically (browser_fallback)."], ["Crawl & map", "POST /v1/crawl turns a site into Markdown/text/HTML as an asynchronous job; POST /v1/map lists a site's URLs."], ["Residential network + auto", "The residential class is live. auto currently resolves to residential."], ["Geolocation", "Country targeting (ISO 3166-1 alpha-2), with region and city hints."], ["Sessions", "Sticky exit identity for 60 to 1,800 seconds via /v1/sessions."], ["Retries & escalation", "Automatic retry with a new exit IP and header profile, expanded block detection (Cloudflare, DataDome, PerimeterX, Akamai, Kasada, Imperva, AWS WAF, soft blocks), per-domain intelligence, circuit breakers."], ["Account endpoints", "GET /v1/me and GET /v1/usage for key introspection and monthly usage."], ["Dashboard", "Projects, API keys, request logs with request IDs, crawls, usage and a Playground."], ]; const SOON: Array<[string, string]> = [ ["Browser actions", "POST /v1/browser (click, type, scroll, evaluate). Today it returns BROWSER_UNAVAILABLE. Rendered fetches are live."], ["Structured extraction", "POST /v1/extract. Today it returns INVALID_REQUEST with an explanatory message."], ["Datacenter, ISP and mobile classes", "Requesting them explicitly returns NETWORK_UNAVAILABLE until they launch."], ["Webhooks", "Event delivery signed with HMAC-SHA256 (including crawl webhook_url). Not delivered yet."], ["CLI", "A command-line client. Not available."], ["Teams & invitations", "Multi-member organizations."], ["Published SDK packages", "@fetcha/sdk on npm and fetcha on PyPI. Both exist as source in the repository today."], ]; export default function IntroductionPage() { return ( The mental model is deliberately simple: you give Fetcha a URL, Fetcha figures out how to access it. You do not manage proxies, rotate IPs, detect block pages or tune retry loops. You send one request and receive the page, the final URL, headers, cookies and metadata describing how the request was served.

How it works

Every call to POST /v1/fetch goes through the same pipeline:

Base URL

The API is served on the same domain as the website. There is no separate API host to configure.

All endpoints are versioned under /v1. Requests and responses are JSON (Content-Type: application/json). Health probes are public at{" "} /api/health and /api/ready.

Your first request

Authenticate with a Bearer API key and post a URL. A minimal call looks like this; see the Quickstart for the full walkthrough and the{" "} Fetch API reference for every field.

Request IDs

Every response, successful or not, carries an X-Fetcha-Request-ID header of the form req_…. Fetch responses repeat it as request_id in the body, and error envelopes include it as error.request_id. The same identifier appears in your dashboard request log. Quote it when you write to{" "} support@fetcha.co: it lets us find the exact attempt sequence for your call.

What is live today

Fetcha is a private platform: access is granted by invitation and every account runs on the single unlimited plan. The table below is the authoritative list of what you can call right now; the section after it lists what is planned. The docs never describe a capability as working unless it is.

{LIVE.map(([name, note]) => ( ))}
Capability Status Notes
{name} Live {note}

Coming soon

{SOON.map(([name, note]) => ( ))}
Capability Status Current behaviour
{name} Coming soon {note}
Fetcha exposes network classes (auto, datacenter, residential, isp, mobile) rather than the identity of the upstream networks behind them. Debug metadata refers to routes by neutral aliases such as network-a.

Where to go next

); }