0.21.0 (2026-07-06)
⚠ BREAKING CHANGES
- api: error responses now use
errorCodeinstead oferror_code. The managed API already strips the field, so managed clients are unaffected; self-hosted clients parsingerror_codeshould readerrorCode.
Features
- cli: add crw bench FRAMES harness (fb78bcb)
- cli: bench A/B flags, concurrency, crash-safe writes (7eb059e)
- core: add evidence & provenance primitives (4a638a0)
- core: expose sourceHash on scrape responses (b0d89f9)
- extract: prompt-based extraction and full meta-tag metadata (6453204)
- proxy: retry with default country on residential CONNECT tunnel failure (8aafdc8)
- search: thread per-request country to result-page scraping (be3b0d1)
- server: add /firecrawl/* compat namespace, own /v1 as native API (d9cb3b8)
Bug Fixes
- api: rename error_code response field to errorCode (e4df682)
- cli: repair clap arg conflict that panicked debug builds (f2a6b77)
- docs: add redirect stubs for pre-flatten legacy doc URLs (a1f29dc)
- extract: unify untrusted-content fencing; nonce-fence the change judge (192b9d7)
- renderer: cap full-page screenshot height to avoid OOM (c5f555d), closes #161
- renderer: don't browser-render thin pages that ship no JS (f42f14a)
- scrape: report anti-bot/challenge pages as blocked, not success (d06f051)
- search: charset-aware scrape decode + per-result error + neutral answer warnings (a9870e2)