Scrape the web.
Switch providers.

One TypeScript client to scrape, search, crawl, extract, and automate across 7 engines with automatic failover.

Install Scrape SDK

Writeonescrapecall.Usetheprovideryouhave.FailoverquietlywhenanAPIgoesdown.

Write one scrape call. Run it through any adapter.

Scrape SDK gives your application one typed client and one result shape across Firecrawl, TinyFish, Jina, Tavily, Spider, Browserbase, and local Cheerio.

src/scraper.tsTypeScript
import { createScrapeClient } from "scrape-sdk";
import { firecrawl } from "scrape-sdk/firecrawl";
import { tinyfish } from "scrape-sdk/tinyfish";
import { jina } from "scrape-sdk/jina";
import { local } from "scrape-sdk/local";

const scraper = createScrapeClient({
  providers: [
    firecrawl({}),
    tinyfish({ apiKey: process.env.TINYFISH_API_KEY! }),
    jina(),
    local(),
  ],
});

const page = await scraper.scrape("https://stripe.com/docs");
console.log(page.markdown);
Automatic failover across providersstrategy: "priority"
stripe.com/pricingrescued (200 OK)
Primary (Firecrawl)429 Rate Limit
Failover (Jina Reader)114ms
DOM Noise Reduction-96% (1,840 tokens)

Silent circuit recovery

When a provider rate-limits or times out, Scrape SDK routes down your fallback list within a single deadline before throwing unhandled errors.

firecrawl()jina()local()

Five unified capabilities. Zero boilerplate.

One client handles individual pages, search discovery, multi-page crawling, sitemap indexing, and structured JSON Schema extraction.

01 / scrape()URL ➔ Markdown

Clean Page Markdown

Converts web pages into clean ATX markdown, automatically stripping scripts, styles, navigation, and DOM bloat.

await scraper.scrape("https://stripe.com")
02 / search()Query ➔ Pages

Live Web Search

Searches the live web without a starting URL, querying real-time provider indexes (TinyFish, Tavily, Jina) in one call.

await scraper.search("typescript web scraping")
03 / crawl()Domain ➔ Corpus

Recursive Site Crawling

Traverses entire domains recursively, managing depth bounds, concurrency limits, and async job polling.

await scraper.crawl(url, { maxDepth: 2 })
04 / map()Site ➔ URLs

Fast URL Discovery

Discovers all URLs on a site, indexing sitemaps and paths fast without downloading full HTML bodies.

await scraper.map(url, { limit: 100 })
05 / extract()Page ➔ Structured JSON

Structured JSON Schema Extraction

Extracts type-safe structured JSON, validating extracted page fields against your Zod or JSON Schema.

await scraper.extract(url, { schema: PricingSchema })

Interactive Extraction Sandbox

Test live extraction directly in the browser.

Presets:

Why developers switch from single-vendor SDKs

Calling Vendor SDKs Directly
  • ✕Vendor Lock-in: Rewriting callers whenever you swap or add a new scraping service.
  • ✕Fragile Quotas: Rate limits (429) or proxy outages immediately crash your backend.
  • ✕CI / Offline Failures: Local tests and CI pipelines require active cloud SaaS API keys.
With Scrape SDK
  • ✓One Typed Contract: Same function calls and result shapes across all 7 backends.
  • ✓Automatic Failover: Seamlessly cascades down your fallback list within a single deadline.
  • ✓Free Local Fallback: Static Cheerio parser runs anywhere with zero API keys required.

Ready for agents & SDKs

import { scrape } from "scrape-sdk";

const page = await scrape("https://stripe.com/docs");

console.log(page.markdown);
console.log(`via ${page.provider} in ${page.latencyMs}ms`);

UNIFIED WEB EXTRACTION FOR TYPESCRIPT

Never let a rate limit
crash your backend.

Add Scrape SDK in seconds. Switch engines or layer fallbacks without rewriting a single line of application code.

Start buildingView source

Read raw SKILL.md first ↗