Improvements
/parseendpoint — Upload local files (PDF, DOCX, DOC, ODT, RTF, XLSX, XLS, HTML) up to 50 MB and get back clean, LLM-ready Markdown, JSON, or a summary. Tables and reading order are preserved, with full Zero Data Retention support for enterprise plans. Available in JS, Python, Go, Rust, Java, .NET, PHP, Ruby, and Elixir SDKs.- Lockdown Mode — Set
lockdown: trueon/scrapeto serve results exclusively from Firecrawl's index with zero outbound requests and zero data retention by default. Gated outbound paths include HTTP fetches, robots.txt, audio downloads, and media. Available in every SDK, the CLI (--lockdown), and MCP. questionformat — Pass a natural-language prompt to/scrapeand get a grounded, hallucination-free answer back indata.question. Runs on a managed model chain with automatic fallback, prompt-injection isolation via XML tagging and zero-width-space escaping, and up to 100x fewer tokens per call.highlightsformat — Returns the exact sentences, code blocks, and table rows on a page that match your query. Consecutive sentences re-join into paragraphs, code lines wrap in fenced blocks with their original language, and table rows rebuild into Markdown tables with headers — all from the source page, using up to 100x fewer tokens per call.videoformat — Addedvideoto scrape formats. Returns a signed downloadable video URL for supported sites (e.g. YouTube), with cookie forwarding for authenticated downloads and explicit Lockdown gating./searchdomain filters — AddedincludeDomainsandexcludeDomainsparameters to/searchfor scoping results to a specific set of sites./searchfeedback endpoint — Submit a rating on a search result withPOST /v2/search/:jobId/feedback. Each accepted submission refunds 1 credit, capped per UTC day, with idempotent retries.- Custom robots.txt user agent — Added
robotsUserAgentto crawl requests to evaluate robots.txt rules and crawl delays against a custom agent string, and a separatecustomRobotsAgentorg flag independent fromignoreRobots. Available in JS, Python, and Java SDKs. - Official Go SDK — Added a first-party Go SDK for the v2 API, replacing the community module. Includes context-aware retry backoff and proper
MapData.Linkstyping. - Ruby SDK — Added the official Firecrawl Ruby SDK v2 with full endpoint coverage and v2-native typing.
- PHP SDK — Added the official PHP SDK with Laravel support, scrape/search/crawl/map/parse coverage, and a published
firecrawl/firecrawl-sdkComposer package. - .NET SDK — Added the official .NET SDK with v2 API support, parse, and an
firecrawl-sdkNuGet package. - Rust SDK v2 — The Rust SDK has been promoted to the official v2 SDK with parity across scrape, search, crawl, map, agent, and parse.
/interactsuggestion — Calls to/scrapethat pass anactionsarray now return a warning suggesting/interactfor stateful browser automation.- PDF size cap — Raised the PDF upload size limit from 10 MB to 30 MB.
- PDF page-processed billing — Updated PDF billing to reflect pages processed instead of raw page count.
- Docker harness — Exposed
HARNESS_STARTUP_TIMEOUT_MSthroughdocker-composefor self-hosted users who need longer startup windows. - Elixir SDK — Added
parse_file/3to the Elixir SDK for the/parseendpoint. - JS SDK request timeout — Added an explicit request timeout option to the JS SDK to prevent hanging requests.
Fixes
- Resolved multiple CVEs across the API and SDKs including
axios,postcss,fast-xml-parser,protobufjs,follow-redirects,langsmith,lodash,fast-uri, andfast-xml-builder. - Fixed branding
colors.secondarybeing incorrectly populated when the LLM omitted a value —secondaryis now optional and is no longer applied as a default. - Fixed the Playwright service ignoring the caller's
User-Agentrequest header. - Fixed
screenshotsigned URLs returning stale results from cache by forcing a cache miss when the signed URL has expired. - Fixed Lockdown requests being billed twice for ZDR by treating Lockdown as zero data retention by default.
- Fixed proxy billing for cached scrapes incorrectly charging proxy credits when no proxy egress occurred.
- Fixed YouTube transcript scripts running on audio-only scrapes and audio downloads not receiving CDP cookies.
- Fixed
html-to-mdconversion service ignoring zero data retention. - Fixed a stack overflow in
marked.parsewhen handling certain PDF outputs. - Fixed
robotsUserAgentnot being honored by the native link filter and not being included in JS SDK crawl payloads. - Fixed
/v1status endpoints returning 500 on non-UUID job IDs — now returns a proper 400. - Fixed empty
actions: []arrays being treated as actions in feature flags. - Fixed JS SDK watcher emitting duplicate events, leaking timeouts, and hanging
start()on watcher timeouts. - Fixed Ruby SDK unwrapping of
credit_usagedata fields and defaultedskipTlsVerificationtofalse. - Fixed missing negative-limit validation in Python, Java, and Go SDKs.
- Fixed Java SDK accepting empty API keys and missing async lifecycle methods.
- Fixed billing period timestamps, subscription lookups, and plan credit reporting.
- Fixed crawl-backlog timeouts being unbounded — now capped at 48h.
API
- Added
POST /v2/parsefor multipart file uploads up to 50 MB. Returns a standard Document. Disallowed scrape options on parse:changeTracking,screenshot,branding,actions,waitFor,location,mobile;proxyis restricted toautoorbasic. Errors withPARSE_UNSUPPORTED_OPTIONSon disallowed input. - Added
lockdown: booleanto/scrape. Cache misses return404withSCRAPE_LOCKDOWN_CACHE_MISS. Billing: +4 credits whenlockdownis enabled, 1 credit on cache miss. Available across all SDKs. - Added
questionandhighlightsto/scrapeformats, returningdata.questionanddata.highlightsrespectively. - Added
videoto/scrapeformats. Returnsdocument.videoas a signed URL. +4 credits per request. Unsupported URLs raiseSCRAPE_VIDEO_UNSUPPORTED_URL;parserejects thevideoformat client- and server-side. - Added
includeDomainsandexcludeDomainsarrays on/v2/searchfor scoping results to specific domains. - Added
POST /v2/search/:jobId/feedbackfor rating search results. Each accepted submission refunds 1 credit, capped per UTC day viaSEARCH_FEEDBACK_DAILY_CAP_CREDITS, with idempotent retries returningalreadySubmitted: true. Feedback submissions older thanSEARCH_FEEDBACK_MAX_AGE_SEC(default 120s) are rejected. Search billing is nowceil(results/10) * 2credits, surfaced in responses. - Added
robotsUserAgentto/v2/crawlcrawlerOptionsfor custom-agent robots.txt evaluation. Gated behind theignoreRobotsorg flag. - Added a separate
customRobotsAgentorg flag independent fromignoreRobots, so teams can ship custom user-agents without disabling robots.txt enforcement. - Migrated the
ignoreRobotsorg flag from a boolean to adisabled/allowed/forcedpattern. The legacyignoreRobots: booleanrequest shape has been removed — clients must use the new flag values. - Deprecated
/v0/scrape,/v0/crawl,/v0/crawl/status/:jobId,DELETE /v0/crawl/cancel/:jobId,/v0/search,/v1/extract,/v1/extract/:jobId,/v2/extract,/v2/extract/:jobId,/v1/deep-research,/v1/deep-research/:jobId,/v1/llmstxt, and/v1/llmstxt/:jobId. Deprecated endpoints emitDeprecation: true,Warning: 299 - "<message>",Link; rel="successor-version", and (when configured)Sunsetheaders, pluswarnings[]andreplacementin the JSON body. JS and Python SDKs surface these to clients.
Full Changelog: https://github.com/firecrawl/firecrawl/compare/v2.9.0...v2.10
Fetched May 16, 2026

