The web data engine for AI. Firecrawl-compatible. Cloudflare-powered. Half the price.
Website · Console · Live API · MCP · Compatibility · Roadmap · Self-host · MIT
fuegol.ink is an open-source, Cloudflare-native web-data platform that speaks the
Firecrawl v2 API. Point an existing Firecrawl client at api.fuegol.ink, swap in a fuegol key,
and keep your code. The managed edition targets ≈50% of Firecrawl's published plans; the engine
is MIT and self-hostable on your own Cloudflare account.
Compatibility means: change your base URL + use a new fuegol key (never your
fc-key). Your request/response business logic stays the same.
The public demo is live and keyless (rate-limited). Scrape any page to clean Markdown:
curl -X POST https://fuegol-api.manhattan.workers.dev/v2/scrape \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","formats":["markdown","links"]}'Real response (trimmed):
{
"success": true,
"data": {
"url": "https://example.com/",
"title": "Example Domain",
"markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.",
"links": [],
"metadata": {
"statusCode": 200,
"title": "Example Domain",
"language": "en",
"sourceURL": "https://example.com/",
"contentType": "text/html; charset=utf-8"
}
}
}Verbatim from the live endpoint on 2026-10-07 (example.com was redesigned — it no longer links out).
Map a site's URLs:
curl -X POST https://fuegol-api.manhattan.workers.dev/v2/map \
-H 'content-type: application/json' -d '{"url":"https://example.com","limit":50}'A request enters a cheapest-adequate-tier planner. Most pages never touch a browser — they are
served by a free static path (SSRF-guarded fetch → readability extraction → HTML→Markdown). The
browser tier is reserved for pages that truly need JS, actions, screenshots, or an anti-bot proxy.
flowchart LR
C[Client / SDK / MCP] -->|Firecrawl v2| W[Workers + Hono API]
W --> P{Execution planner}
P -->|static, free| H[fetch → readability → HTML→Markdown]
P -->|JS / screenshot / stealth| B[Browser Rendering]
P -->|breadth| CR[/crawl async/]
P -->|structured| AI[Workers AI + AI Gateway]
H --> N[Normalize → Firecrawl Document]
B --> N
CR --> N
AI --> N
N --> R[(R2 artifacts)]
W --> D[(D1 keys + credit ledger)]
W --> Q[[Queues → Durable Object crawl]]
N --> C
Edge primitives: Workers + Hono · Browser Rendering · Queues · Workflows · Durable Objects ·
D1 · R2 · Workers AI · AI Gateway · AI Search. No portability layer — the CF integration is the
cost and latency advantage. See docs/architecture-decisions.md.
Every row below is live on the production API and covered by a reproducible prod E2E in e2e/.
| Capability | Status |
|---|---|
POST /v2/scrape → markdown / html / rawHtml / links / summary / metadata |
✅ live |
POST /v2/scrape → {type:"json"} AI extraction (Workers AI) |
✅ live |
POST /v2/scrape → JS-rendered (Browser Rendering) + screenshot → R2 |
✅ live |
POST /v2/scrape → actions (click/write/press/scroll/wait/screenshot/scrape/executeJavascript/pdf) |
✅ live |
POST /v2/scrape → changeTracking (git-diff + AI json semantic diff) |
✅ live |
POST /v2/scrape → maxAge result cache (R2, content-addressed) + storeInCache |
✅ live |
POST /v2/extract async structured extraction (Workers AI, Durable Object) |
✅ live |
POST /v2/map → sitemap + link discovery |
✅ live |
POST /v2/crawl + POST /v2/batch/scrape async (Durable Object) + status/cancel/errors + signed webhooks |
✅ live |
POST /v2/search → multi-source (web / news / images) + categories + tbs time-filter + optional result-scraping (Exa/Tavily) |
✅ live |
POST /v2/parse — PDF (unpdf) + HTML/text → markdown |
✅ live |
POST /v2/agent — autonomous research (search → scrape → synthesize + sources) |
✅ live |
POST /v2/monitor (+ run/checks) — recurring change detection on Cron + signed monitor.changed webhooks |
✅ live |
POST /v2/browser + /browser/:id/act — persistent interactive browser sessions (state persists across requests) |
✅ live |
POST /v2/ai-search/index + /query — AI Search: semantic search + RAG over your indexed content (Vectorize + Workers AI, per-key) |
✅ live |
API keys (POST /v2/keys) + D1 credit ledger, enforced spend ceilings (402) + user spend limits |
✅ live |
SSRF guard (v4/v6/metadata/redirect/DoH), robots.txt, honest error envelopes, /v1/* adapters, /concurrency-check |
✅ live |
| Remote MCP — scrape/map/crawl/search + developer/gov/research search + agent + monitor_* + research inspect/related/read | ✅ live |
Dev console /app/ — keys, live credits, playground (scrape/map/search/crawl) + interactive-session playground |
✅ live |
| Stripe billing · custom domains · one-click Deploy button | ⛔ roadmap (needs a Stripe test key / the DNS zone) |
find_tools (Alexandria data-provider catalogue) |
⛔ proprietary upstream |
Full surface map: docs/product-surface-inventory.md. Every
unbuilt endpoint returns an honest 501 with a pointer — never a fake success object. Real
wall-clock numbers (static scrape P50 ≈ 100 ms, browser tier ≈ 1.5 s) live in
docs/benchmarks.md, reproducible via node e2e/benchmark/run.mjs.
Pinned to the real upstream source (there is no committed v2 OpenAPI — the contract lives in
Firecrawl's Zod, which we mirror in packages/contracts):
| Surface | Pinned revision |
|---|---|
| REST API v2 | firecrawl/firecrawl@f9f2e3d |
| MCP server | firecrawl-mcp-server@ec0f9de (firecrawl-mcp@3.28.2) — 30 tools registered / 28 listed |
The MCP server's README says "27 tools"; the source at HEAD registers 30 (28 listable + 2 hidden
deprecated shims). We pin to the source count. Details: docs/firecrawl-compatibility.md.
Plans are exactly half of Firecrawl's month-to-month price, like-for-like credits (re-verified
2026-10-09). The "50% less" claim is measured against Firecrawl's month-to-month price; their
annual-billed equivalents ($16/$83/$333/$599) are shown too, and fuego is cheaper even against those.
Live price book: GET /v2/pricing. Preflight a job cost: POST /v2/quote.
| Tier | Monthly credits | Firecrawl (month-to-month) | fuego (½) |
|---|---|---|---|
| Free | 1,000 | $0 | $0 |
| Hobby | 5,000 | $19 | $9.50 |
| Standard | 100,000 | $99 | $49.50 |
| Growth | 500,000 | $399 | $199.50 |
| Scale | 1,000,000 | $749 | $374.50 |
One-time credit packs (no subscription): $5→2,000 · $10→4,500 · $25→12,000 · $50→26,000 ·
$100→55,000 · $250→145,000 · $500→300,000. Core ops bill at Firecrawl parity; Fuego-exclusive premium
ops (browser/AI/agent) are priced to a proven ≥50% margin floor against the worst-case lot — never a
half-price loss leader. Cost model + margin proof: docs/unit-economics.md ·
status gates: docs/RELEASE_CHECKLIST.md. Billing (subscriptions +
packs) is built behind the ledger and resumes the moment a Stripe sk_test_ key is provisioned.
TypeScript
const res = await fetch('https://fuegol-api.manhattan.workers.dev/v2/scrape', {
method: 'POST',
headers: { 'content-type': 'application/json' /* , authorization: `Bearer ${fuegolKey}` */ },
body: JSON.stringify({ url: 'https://example.com', formats: ['markdown', 'links'] }),
});
const { data } = await res.json();
console.log(data.markdown);Python
import requests
r = requests.post("https://fuegol-api.manhattan.workers.dev/v2/scrape",
json={"url": "https://example.com", "formats": ["markdown"]})
print(r.json()["data"]["markdown"])CLI (@fuegol/cli — zero-dependency)
fuegol scrape https://example.com
fuegol search "durable objects" --category developer
FUEGOL_API_KEY=fgl_live_… fuegol crawl https://docs.site --limit 20 --waitMCP — live at https://fuegol-mcp.manhattan.workers.dev. Real working tools: firecrawl_scrape,
firecrawl_map, firecrawl_crawl, firecrawl_check_crawl_status, firecrawl_search (web/news/images),
firecrawl_developer_search, firecrawl_gov_search, firecrawl_research_search_papers,
firecrawl_research_inspect_paper / _related_papers / _read_paper (Semantic Scholar),
firecrawl_agent, and firecrawl_monitor_create / _list / _run / _checks (the MCP forwards your
Bearer key so authed tools hit your ledger). Only firecrawl_find_tools (proprietary) is a stub.
Stateless Streamable-HTTP JSON-RPC.
# verify it live:
curl -X POST https://fuegol-mcp.manhattan.workers.dev/v2/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"firecrawl_scrape","arguments":{"url":"https://example.com"}}}'Interactive browser sessions — drive a persistent headless browser; the tab's state (URL, cookies, form input) survives across separate requests:
# start a session, then click "next" + screenshot — the tab persists between calls
ID=$(curl -s -X POST https://fuegol-api.manhattan.workers.dev/v2/browser \
-H 'content-type: application/json' -d '{"url":"https://quotes.toscrape.com/"}' | jq -r .id)
curl -X POST https://fuegol-api.manhattan.workers.dev/v2/browser/$ID/act \
-H 'content-type: application/json' \
-d '{"actions":[{"type":"click","selector":"li.next a"},{"type":"screenshot"}]}'sequenceDiagram
participant C as Client
participant W as Workers API
participant DO as BrowserSession DO
participant BR as Browser Rendering
C->>W: POST /v2/browser {url}
W->>DO: create()
DO->>BR: launch(keep_alive) → navigate
DO-->>C: { id, url, title }
Note over C,BR: later request — tab still alive
C->>W: POST /v2/browser/:id/act {actions}
W->>DO: act(actions)
DO->>BR: reconnect(sessionId) → reattach live tab
BR-->>DO: click / type / screenshot
DO-->>C: { url, actCount, screenshot→R2 }
Or drive it visually in the console playground.
- const base = 'https://api.firecrawl.dev';
- const key = 'fc-...';
+ const base = 'https://api.fuegol.ink'; // or your self-hosted Worker
+ const key = 'fgl-...'; // a NEW fuegol key — fc- keys are not acceptedOr use the official Firecrawl SDK unchanged — just point it at fuegol:
import { Firecrawl } from '@mendable/firecrawl-js';
const app = new Firecrawl({ apiKey: 'fgl_live_...', apiUrl: 'https://api.fuegol.ink' });
const doc = await app.scrape('https://example.com', { formats: ['markdown'] });Verified against both official SDKs:
@mendable/firecrawl-js@4.45.08/8 andfirecrawl-py@4.49.34/4 run unchanged against fuegol.ink — scrape · map · search · crawl (+ batch/extract/status in TS). Reproduce:node e2e/sdk-compat/test.mjs·python e2e/sdk-compat/test.py.
Your scrape/map/crawl request bodies and response handling stay the same (within the supported surface above). A fuegol key is required — an existing Firecrawl key is never automatically valid.
MIT-licensed; runs on your Cloudflare account with no Stripe and no dependency on fuegol.ink
infrastructure. The free static tier needs zero extra provisioning. See deploy/README.md.
git clone https://github.com/heymegabyte/fuegol.ink.git && cd fuegol.ink
pnpm install && cd apps/api && pnpm exec wrangler deployDeploy-to-Cloudflare button: Cloudflare's one-click button can't resolve a pnpm monorepo's workspace packages at build time (documented limitation). The dependency-isolated standalone Worker for one-click deploy is a tracked increment — we won't show a "working" badge until it's tested from a clean account. The manual command above is verified.
- SSRF-hardened fetch: blocks private/reserved IPv4+IPv6, cloud-metadata endpoints, non-http(s) schemes, and re-validates every redirect hop; optional DNS-over-HTTPS rebinding check.
- Respects
robots.txtand Cloudflare Content Signals. No CAPTCHA bypass, credential theft, private- network scanning, or paywall circumvention. - Signed webhooks (HMAC-SHA256,
x-fuegol-signature) fire on crawl/batch completion and on monitor change detection (monitor.changed), with retries. Webhook targets are SSRF-guarded. - Zero-data-retention mode, PII redaction, and per-tenant isolation are on the roadmap.
- Observability: server-side Sentry (
@sentry/cloudflare) on the API + MCP Workers — errors + traces, with every Durable Object instrumented — plus Workers Tracing. No browser SDK.
packages/contracts Zod SSOT — Firecrawl v2 request/response schemas (the spec mirror)
packages/engine Cloudflare-native engine — SSRF, fetch, extraction, HTML→MD, planner
apps/api Hono Worker — the Firecrawl-compatible REST API (live)
docs/ idea-ledger · compatibility · surface-inventory · unit-economics · ADRs · roadmap · convergence-log
deploy/ self-hosting guide + standalone-template plan
Issues and PRs welcome. Run pnpm install, then pnpm -r typecheck and pnpm --filter @fuegol/engine test.
Add a regression test with every bug fix; keep the Zod contracts authoritative.
MIT © 2026 Megabyte Labs. Not affiliated with Firecrawl; "Firecrawl" is used only to describe API compatibility. A clean-room implementation pinned to public upstream revisions.
Point your client at fuegol.ink. Keep your code. Pay half.
{ "mcpServers": { "fuegol": { "url": "https://fuegol-mcp.manhattan.workers.dev/v2/mcp" } } }