API live · Firecrawl v2 compatible

Your Firecrawl code. Half the core API cost.

Open-source, Cloudflare-native, and drop-in compatible with the Firecrawl v2 API. Scrape, crawl, map, search, extract, and parse the web — then point your client at crawl.cheap and keep your code.

7 data endpoints live
13 MCP tools
50% less on core API plans
MIT · self-hostable
terminal
# Scrape any page to clean Markdown — no signup
curl -X POST https://api.crawl.cheap/v2/scrape \
  -H 'content-type: application/json' \
  -d '{"url":"https://example.com",
       "formats":["markdown","links"]}'

# → { "success": true, "data": { "markdown": "…" } }
Drop-in compatible

Change one line. Keep your code.

crawl.cheap speaks the Firecrawl v2 contract — same request bodies, same response shapes, same error envelope. The official @mendable/firecrawl-js and firecrawl-py SDKs run unchanged (verified 8/8 + 4/4 against production).

// @mendable/firecrawl-js — change the constructor, keep every call
- const app = new Firecrawl({ apiKey: 'fc-...' });
+ const app = new Firecrawl({ apiKey: 'cc_live_...', apiUrl: 'https://api.crawl.cheap' });
  await app.scrape('https://example.com', { formats: ['markdown'] }); // unchanged

Your existing Firecrawl key is never automatically valid — issue a crawl.cheap key (free, instant, below). The FIRECRAWL_API_URL / FIRECRAWL_API_KEY env conventions are honored too.

Live, no signup

Scrape something, right now.

This calls the real production API from your browser (rate-limited demo). Clean Markdown out, powered by Cloudflare Workers.

Markdown output will appear here…
One engine, every surface

The complete web-data toolkit.

🔥 Cheapest-adequate-tier planner

Static HTTP fetch → readability extraction → HTML→Markdown for free. Escalates to a rendered browser only when a page truly needs JS, actions, or a screenshot. Margin by design.

📄 Scrape

Markdown, HTML, links, summary, and schema-guided JSON via Workers AI.

🕸️ Crawl

Async multi-page crawl on a Durable Object — robots-aware, resumable, cancelable.

🗺️ Map

Enumerate a site's URLs from sitemaps + link discovery in one call.

🔎 Search

Web / news / images search with optional result-scraping + time filters.

🧩 Extract

Structured JSON across many URLs, guided by your prompt + JSON Schema.

🤖 Agent & Monitor

Autonomous research runs, plus scheduled change monitoring with signed webhook alerts.

🖱️ Interactive browser

Persistent Puppeteer sessions — click, type, scroll across requests. Metered by the minute.

🔌 Remote MCP

Firecrawl-compatible firecrawl_* tools over Streamable HTTP for Claude, Cursor & co.

💳 Real credit ledger + preflight quotes

A transactional D1 ledger is the live authority for balance + usage — with enforced spend ceilings, user-set hard limits, and a deterministic /v2/quote that bounds cost before any job runs. Not an eventually-consistent meter.

Pricing

Half the price. Same API.

Managed-edition plans at exactly half of Firecrawl's month-to-month price, with like-for-like included credits. Self-hosting is free forever on your own Cloudflare account.

Free
$0
1,000 credits/mo
Hobby
$9.50/mo
5,000 credits
Firecrawl $19
Standard
$49.50/mo
100,000 credits
Firecrawl $99
Growth
$199.50/mo
500,000 credits
Firecrawl $399
Scale
$374.50/mo
1,000,000 credits
Firecrawl $749
See how much you save…

Core credits bill identically to Firecrawl — your plan simply costs less per credit. "50% less" is measured vs Firecrawl's month-to-month pricing (checked 2026-10-09); their annual-billed equivalents are $16 / $83 / $333 / $599, and crawl.cheap is cheaper even against those. One-time credit packs (no subscription) start at $5 for 2,000 credits. Managed billing runs in Stripe test mode — not yet charging real cards.

Price before you crawl

Know the cost before you run it.

A deterministic preflight quote from the live API — credits, dollars at your plan rate, and a firm ceiling. Open-ended jobs must carry a cap: crawl.cheap never runs an unbounded-cost job.

Your quote will appear here…
Compatibility

What's live today.

EndpointStatusEngine
POST /v2/scrape● livestatic + browser tier + Workers AI json
POST /v2/map● livesitemap + link discovery
POST /v2/crawl (+status/cancel/errors)● liveDurable Object coordinator
POST /v2/batch/scrape● liveDurable Object (fixed frontier)
POST /v2/extract (+status)● liveWorkers AI
POST /v2/search (web/news/images)● livepluggable provider + scrape + tbs
POST /v2/parse● liveunpdf / HTML / text
POST /v2/agent (+status)● liveweb-search + scrape + AI synthesis
POST /v2/monitor (+run/checks/webhook)● livecron sweep + change diff + signed alerts
POST /v2/browser · /:id/act (interact)● livepersistent Puppeteer session (DO)
POST /v2/ai-search/* (RAG)● liveVectorize + Workers AI
GET /v2/pricing · POST /v2/quote● liveprice book + preflight estimate
Remote MCP (/v2/mcp, /v2/mcp-search)● livecreateMcpHandler-style, stateless · ~13 tools
Stripe subscriptions + one-time credit packs◐ plannedbuilt behind the ledger; awaiting a Stripe test key
30-second quickstart

Get a key, make a call.

get a free key
curl -X POST https://api.crawl.cheap/v2/keys \
  -d '{"name":"my-app"}'
# → { "apiKey": "cc_live_…", "monthlyCredits": 1000 }
use it anywhere
# TypeScript
const r = await fetch('https://api.crawl.cheap/v2/crawl', {
  method:'POST',
  headers:{ authorization:`Bearer ${key}` },
  body: JSON.stringify({ url:'https://docs.site', limit:20 })
});