feat(firecrawl): add Keyless (no-API-key) mode via lightweight HTTP transport - #922
Open
hashbender wants to merge 1 commit into
Open
feat(firecrawl): add Keyless (no-API-key) mode via lightweight HTTP transport#922hashbender wants to merge 1 commit into
hashbender wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Firecrawl launched Keyless mode in June 2026,
allowing search and scrape calls without an API key — no account needed,
1,000 credits/month free. The cloud API accepts unauthenticated requests at the
same endpoints.
The Firecrawl Python SDK unconditionally requires
api_keyat construction,making it unsuitable for this mode. Rather than forking the SDK or adding a
stub key, this PR introduces a lightweight HTTP transport (
_KeylessFirecrawlClient)that mirrors the SDK's method signatures so the existing extract loop works
unchanged.
This builds on two recent Firecrawl provider improvements that this Keyless
client inherits naturally:
Firecrawl's clean markdown now goes straight to cache.
same extract path our Keyless client shares (salvage fix(web): re-check Firecrawl final URLs for SSRF NousResearch/hermes-agent#35840 by @zapabob).
With these in place, the missing piece for a true zero-setup experience is a
transport that works without credentials — which this PR adds.
Changes
plugins/web/firecrawl/provider.py— +56 lines1.
_KeylessFirecrawlClient(lines 77–121)httpx-based transport that calls
POST /v1/searchandPOST /v1/scrape.Implements
search(query, limit) -> dict/scrape(url, formats) -> dictwith the same surface as the SDK client, so the existing extract loop
(including the SSRF re-check from NousResearch#56143) works unchanged.
2. Dispatch in
_get_firecrawl_client()(lines 305–313)When resolved kwargs contain no
api_key(i.e.FIRECRAWL_API_URLis setwithout
FIRECRAWL_API_KEY), returns a_KeylessFirecrawlClientinstead ofconstructing an SDK client.
No other changes required
_get_direct_firecrawl_config,check_firecrawl_api_key, andis_availableall already accept the
FIRECRAWL_API_URL-only config as valid — nomodifications needed.
Usage
Test Plan
taken when
api_keyis absent from kwargs; all existing configs withFIRECRAWL_API_KEYcontinue using the SDK path.Notes for Reviewers
api_keyat theconstructor level. Adding keyless support there would require an upstream
change in
firecrawl-py. This keeps the integration self-contained: ~45lines of transport code that can be cleanly removed if the SDK later
supports keyless natively.
httpx, which Hermes already depends on._KeylessFirecrawlClientfeeds into the same
_extract_scrape_payload/is_safe_url(final_url)pipeline.
Mirror-of: NousResearch#57151
NousResearch#57151