import type { Metadata } from "next"; import Link from "next/link"; import { Activity, ArrowRight, Braces, Building2, Check, Clock, EyeOff, Fingerprint, Globe, Layers, MapPin, MonitorSmartphone, Network, RefreshCw, ShieldCheck, Terminal, Waypoints, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { CodeBlock } from "@/components/ui/code-block"; import { HeroCodeTabs } from "@/components/marketing/hero-code-tabs"; import { ArchitectureDiagram } from "@/components/marketing/architecture-diagram"; import { Reveal } from "@/components/marketing/reveal"; import { cn } from "@/lib/utils"; export const metadata: Metadata = { title: { absolute: "Fetcha — The web, accessible through one API." }, description: "Fetcha intelligently routes every request across premium proxy networks, sessions and a managed browser to deliver reliable web access at scale. Private, invitation-only platform.", alternates: { canonical: "/" }, }; /* ------------------------------------------------------------------ */ /* Data */ /* ------------------------------------------------------------------ */ const SCORE_WEIGHTS = [ { label: "Historical success", weight: 35, tone: "bg-accent" }, { label: "Cost", weight: 20, tone: "bg-accent/80" }, { label: "Latency", weight: 15, tone: "bg-accent/65" }, { label: "Network health", weight: 15, tone: "bg-accent/50" }, { label: "Geography", weight: 10, tone: "bg-accent/35" }, { label: "Session stability", weight: 5, tone: "bg-accent/20" }, ] as const; const ESCALATION: ReadonlyArray<{ step: string; title: string; body: string; cost: string; state: "live" | "soon" }> = [ { step: "Attempt 1", title: "Best-scored route", body: "The cheapest route with a strong success history for this domain, from the requested geography.", cost: "~$0.0005", state: "live" }, { step: "Attempt 2", title: "Alternate route, fresh IP", body: "Blocked or timed out? Fetcha rotates the exit IP and switches to an alternate route in the same class.", cost: "~$0.0009", state: "live" }, { step: "Attempt 3", title: "Premium network", body: "Escalates to a premium residential route pinned to the target country, with tuned headers and pacing.", cost: "~$0.002", state: "live" }, { step: "Attempt 4", title: "Managed browser rendering", body: "When the block is a JavaScript challenge, a managed headless Chromium renders the page on the same route, solves the challenge and returns the rendered DOM.", cost: "~$0.004", state: "live" }, ]; const FEATURES: Array<{ icon: React.ComponentType<{ className?: string }>; title: string; body: string; soon?: boolean; detail?: string }> = [ { icon: Globe, title: "Global proxy network", body: "Residential exits in 45 target countries, aggregated behind one endpoint. Fetcha manages upstream capacity, so you never juggle vendors or IP pools.", detail: "residential · live" }, { icon: Layers, title: "Session management", body: "Sticky sessions keep the same exit IP for up to 30 minutes. Create one with POST /v1/sessions and pass its id on every follow-up request.", detail: "ttl 60–1800 s" }, { icon: MapPin, title: "Geo targeting", body: "Pin requests to a country, region or city with ISO codes. Prices, availability and search results as your users actually see them.", detail: "country · region · city" }, { icon: RefreshCw, title: "Automatic retries", body: "Blocks, CAPTCHAs, challenges and timeouts trigger retries on a new IP, a new header profile or an alternate network, with jittered backoff, within the request timeout.", detail: "up to 5 retries" }, { icon: MonitorSmartphone, title: "Managed browser rendering", body: "Render JavaScript-heavy pages in a managed headless Chromium with the same routing, geo and session controls. Blocked HTTP attempts escalate to it automatically; screenshots on request.", detail: "browser: true · auto-escalation" }, { icon: Network, title: "Crawl & map", body: "Turn a whole site into Markdown, text or HTML with one asynchronous job, or list its URLs from the sitemap and links. Every page is a normal, logged request.", detail: "/v1/crawl · /v1/map" }, { icon: Terminal, title: "Developer playground", body: "Run real requests from the dashboard, inspect attempts, modes and timings, then copy production-ready code for your language.", detail: "dashboard" }, { icon: Activity, title: "Observability", body: "Every call carries a request id. Logs show status, network class, mode, attempts, latency and bytes, with sensitive headers redacted.", detail: "X-Fetcha-Request-ID" }, { icon: Braces, title: "Structured extraction", body: "Turn fetched pages into typed JSON with a schema you define. The /v1/extract endpoint is on the roadmap and not yet callable.", soon: true }, { icon: Building2, title: "Private platform", body: "Access is granted by invitation. One unlimited plan: no request quota, 200 concurrent requests, all network classes, 90-day retention, browser and crawl included. No billing.", detail: "hello@fetcha.co" }, ]; const STEPS = [ { title: "Get invited", body: "An administrator adds your email." }, { title: "Log in", body: "Set your password, confirm your email." }, { title: "Create a key", body: "Scoped fch_live_ or fch_test_ keys." }, { title: "Open the Playground", body: "Try a URL and a country." }, { title: "Run", body: "Inspect attempts, timing, bytes." }, { title: "Copy code", body: "Generated cURL, JavaScript or Python." }, ]; const SECURITY = [ { icon: ShieldCheck, title: "SSRF protection", body: "Only http and https. Localhost, private ranges, link-local, metadata and internal hosts are refused, and every redirect is re-validated." }, { icon: EyeOff, title: "Redacted logs", body: "Authorization, Cookie and other sensitive headers are stripped before anything is written. Response bodies are not stored by default." }, { icon: Fingerprint, title: "Request IDs", body: "A unique req_ id on every response header and every log line, so support and audits point at exactly one call." }, { icon: Clock, title: "90-day retention", body: "Request metadata and crawl results are kept 90 days, then deleted. Response bodies are not stored unless you enable it per project." }, ]; const SESSION_SNIPPET = `# 1. Open a sticky session pinned to Canada curl -X POST https://www.fetcha.co/v1/sessions \\ -H "Authorization: Bearer fch_live_..." \\ -d '{ "country": "CA", "ttl": 900, "label": "checkout-flow" }' # → { "id": "sess_01j8x5...", "status": "active", "expires_at": "..." } # 2. Reuse the same exit IP across requests curl -X POST https://www.fetcha.co/v1/fetch \\ -H "Authorization: Bearer fch_live_..." \\ -d '{ "url": "https://shop.example/cart", "session": "sess_01j8x5..." }'`; /* ------------------------------------------------------------------ */ /* Small presentational helpers */ /* ------------------------------------------------------------------ */ function Eyebrow({ children, className }: { children: React.ReactNode; className?: string }) { return

{children}

; } function SectionHeading({ eyebrow, title, body, id, align = "left" }: { eyebrow: string; title: string; body?: string; id?: string; align?: "left" | "center" }) { return ( {eyebrow}

{title}

{body ?

{body}

: null}
); } /* ------------------------------------------------------------------ */ /* Page */ /* ------------------------------------------------------------------ */ export default function HomePage() { return ( <> {/* ---------------------------------------------------------------- Hero */}
Intelligent web access infrastructure

The web, accessible through one API.

Fetcha intelligently routes every request across premium proxy networks, sticky sessions and a managed browser to deliver reliable web access at scale. Fetch, render, crawl.

View documentation
{[ ["Unlimited", "requests, one plan"], ["45", "target countries"], ["1 call", "to get a page"], ].map(([v, l]) => (
{l}
{v}
{l}
))}
{/* ------------------------------------------------------------ Platform */}
{/* -------------------------------------------------------- Routing split */}
Routing score weights Σ = 100
{SCORE_WEIGHTS.map((w) => (
))}
    {SCORE_WEIGHTS.map((w) => (
  1. {w.label} {w.weight}%
  2. ))}

Scores are recomputed continuously from your own traffic and platform-wide health. Force a class with {'network: "residential"'} when you need to.

{/* ----------------------------------------------------- Escalation split */}
    {ESCALATION.map((e, i) => (
  1. {i + 1}
    {e.step}

    {e.title}

    {e.state === "soon" ? Coming soon : null}

    {e.body}

    Illustrative cost: {e.cost}

  2. ))}

Costs shown are illustrative upstream averages per request for a typical 200 KB HTML page, for transparency. Fetcha is a private platform with a single unlimited plan; there is no per-request billing.

{/* -------------------------------------------------------- Feature grid */}
    {FEATURES.map((f) => (
  • {f.soon ? Coming soon : f.detail ? {f.detail} : null}

    {f.title}

    {f.body}

  • ))}
{/* ------------------------------------------------------- Sessions split */}
    {["ISO country, region and city targeting on every request", "Sessions are scoped to your project and visible in the dashboard", "Idempotency-Key supported on session creation", "Expired sessions return SESSION_EXPIRED, never a silent new IP"].map((t) => (
  • {t}
  • ))}
{/* -------------------------------------------------- Developer experience */}
    {STEPS.map((s, i) => (
  1. 0{i + 1} {s.title} {s.body}
  2. ))}
SDKs for JavaScript and Python (install from source until published) OpenAPI-style reference with every error code
{/* -------------------------------------------------------------- Security */}
Security and compliance

Defaults you do not have to think about.

Read the Privacy Policy, Acceptable Use and DPA.

    {SECURITY.map((s, i) => (

    {s.title}

    {s.body}

    ))}
{/* -------------------------------------------------------------- Final CTA */}
Get started

Stop building proxy plumbing. Start fetching.

Fetcha is built and operated from Québec, Canada, by engineers who spent too many years maintaining scrapers. One endpoint, honest limits, and a private platform for invited teams.

Invitation-only. One unlimited plan, no billing.

); }