workers-firecrawl
Serve Firecrawl-style search, map and scrape endpoints from a Cloudflare Worker.
workers-firecrawl is a self-hosted Apify/Firecrawl alternative built on Cloudflare (Browser Rendering, Workers). Paid services required. Inspect the source and license in the linked repository.
Source & license
Upstream license: MIT
License TL;DR
You can use it, change it, self-host it and sell it. Keep the original copyright and license notice with copies of the code. You don’t have to publish your changes. The authors don’t promise it will work.
Explain MIT in plain English →Summary of the main license. Separate packages and assets can have different terms.
Inspect repository ↗Read this project’s actual license ↗Repository owner
See the upstream repository for the original creator and contributors.
Maintain this project? Maintainer verification →Cloudflare hosting
Paid services required
workers-firecrawl has a documented low-volume paid Cloudflare path beginning with Workers Paid ($5 USD/account/month), with separately metered usage. The upstream setup requires Paid; browser hours and concurrency must remain bounded.
Hosting requirements
- Use the documented Workers Paid setup, starting at $5 USD/account/month; browser usage above ten hours/month or ten concurrent sessions adds charges.
- Workers Paid starts at $5 USD/account/month and includes 10 million requests/month plus 30 million CPU milliseconds/month; higher CPU limits do not make execution unmetered.
- Workers Paid Browser Rendering includes ten browser hours/month and ten concurrent sessions averaged monthly; excess hours and concurrency are billed.
- Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations.
Sources checked 01/10/2026
Repository snapshot: f53a0dc. Hosting eligibility reflects the deployment documentation and listed assumptions.
- firecrawl ↗
`workers-firecrawl` is a Cloudflare Workers implementation of the Firecrawl API, specifically designed to replicate the `/search` endpoint. It uses Cloudflare's Browser Rendering API to perform web searches and extract content from web pages, all within the Cloudflare environment. This project enables developers to self-host a Firecrawl-compatible search service with minimal setup.
- apify ↗
`workers-firecrawl` is a Cloudflare Workers implementation of the Firecrawl API, specifically designed to replicate the `/search` endpoint. It uses Cloudflare's Browser Rendering API to perform web searches and extract content from web pages, all within the Cloudflare environment. This project enables developers to self-host a Firecrawl-compatible search service with minimal setup.
- workers ↗
#:schema node_modules/wrangler/config-schema.json name = "workers-firecrawl" main = "src/index.ts" compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
- browser-rendering ↗
compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
- paid ↗
#:schema node_modules/wrangler/config-schema.json name = "workers-firecrawl" main = "src/index.ts" compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
- paid ↗
compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
- paid ↗
up>1, 2, 3, 4</sup> | Duration | CPU time | | --- | --- | --- | --- | | **Free** | 100,000 per day | No charge for duration | 10 milliseconds of CPU time per invocation | | **Standard** | 10 million included per month <br> +$0.30 per additional million | No charge or limit for duration | 30 million CPU milliseconds included per month<br> +$0.02 per additional million CPU milliseconds<br><br> Max of [5 minutes of CPU time](https://developers.cloudflare.com/workers/platform/limits/#account-plan-limits) per invocation (default: 30 seconds)<br> Max of 15 minutes of CPU time per [Cron Trigger](https://developers.cloudflare.com/workers/configuration/cron-triggers/) or [Queue Consumer](https://developers.cloudflare.co
- paid ↗
all methods. | | Workers Free | Workers Paid | | --- | --- | --- | | Browser hours | 10 minutes per day | 10 hours per month, then $0.09 per additional hour | | Concurrent browsers (Browser Sessions only) | 3 browsers | 10 browsers ([averaged monthly](#how-is-the-number-of-concurrent-browsers-calculated)), then $2.00 per additional browser | To view or change your plan, go to the **Workers plans** page in the Cloudflare dashboard: [Go to **Workers plans** ↗](https://dash.cloudflare.com/?to=/:account/workers/plans) ## Examples of Workers Paid pricing #### Example: Quick Actions pricing If a Workers Paid user uses Quick Actions for 50 hours during the month, the estimated cost for the month is as follows.
- paid ↗
es Functions, Workers KV, Hyperdrive, and Durable Objects usage for a minimum charge of $5 USD per month for an account. The plan includes increased initial usage allotments, with clear charges for usage that exceeds the base plan. There are no additional charges for data transfer (egress) or throughput (bandwidth). All included usage is on a monthly basis. Pages Functions billing All [Pages Functions](https://developers.cloudflare.com/pages/functions/) are billed as Workers. All pricing and inclusions in this document apply to Pages Functions. Refer to [Functions Pricing](https://developers.cloudflare.com/pages/functions/pricing/) for more information on Pages Functions pricing. ## Workers Users on the Wo
- MIT ↗
MIT License Copyright (c) 2025 Gabriel Massadas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON
- architecture ↗
#:schema node_modules/wrangler/config-schema.json name = "workers-firecrawl" main = "src/index.ts" compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
- architecture ↗
compatibility_date = "2025-01-28" compatibility_flags = [ "nodejs_compat" ] workers_dev = true [observability] enabled = true [browser] binding = "BROWSER"
What it can replace
Compare the workflow you need. These mappings describe overlap; full feature parity requires a separate comparison.
Search, link mapping and single-page browser scraping/content extraction; full crawl-job orchestration, LLM extraction and Apify actor-platform parity are excluded.
See supporting source ↗Search, link mapping and single-page browser scraping/content extraction; full crawl-job orchestration, LLM extraction and Apify actor-platform parity are excluded.
See supporting source ↗How it works
The shape of workers-firecrawl on Cloudflare, and how it stacks up against the rented tools it replaces.
Architecture
Diagram of deployment declarations at the reviewed commit. Each app has its own entrypoint; declared resources do not prove runtime calls. Follow file and line sources below.
View upstream source ↗Configuration and workflow sources
Reviewed commit f53a0dc01502. Files were read as data; upstream applications and CI jobs were not executed.
Partial source coverage: 0 files outside collection bounds; 1 collection or parsing issues. Dynamic imports and generated entrypoints may need manual review.
Deployment configuration · 2 files
Cloudflare Workers · compatibility 2025-01-28
workers-firecrawl · default
Entrypoint: src/index.ts
BROWSER→ Browser Rendering
Cloudflare Workers · example/template, excluded from overview · compatibility 2025-01-28
test · default
Entrypoint: index.ts
No resource bindings declared in this scope.
Named environments are separate deployments. Bindings are shown only where declared. Configured routes are URL patterns, not verified application endpoints.
Runtime source · handlers, binding usage and workflow steps
Observed TypeScript/JavaScript declarations from Worker entrypoints and resolved relative imports. Calls and workflow steps may run conditionally; their listed order is not a proven end-to-end request flow. Router declarations may be mounted under a prefix or may not be registered. This shows code wiring, not a successful deployment or runtime test. Dynamic wiring, aliases and generated code may not resolve.
- L16 · app.use("*")
- L2 · fetch handler exported
- L3 · authorizationMiddleware calls (conditional paths may differ): c.req.header, Response.json, next
Environment references: c.env.AUTHORIZATION_KEY
- L6 · getBrowser calls (conditional paths may differ): puppeteer.launch
- L10 · discoverLinks calls (conditional paths may differ): browser.newPage, page.goto, page.evaluate, Array.from, document.querySelectorAll, href.startsWith, linkHost.endsWith, hrefs.push, parsed.toString, normalized.endsWith, normalized.slice, seen.has, seen.add, result.push, console.error, page.close
- L78 · parseSitemap calls (conditional paths may differ): fetch, response.text, locRegex.exec, trim, loc.startsWith, urls.push
Environment references: env.BROWSER
- L8 · performSearch calls (conditional paths may differ): browser.newPage, encodeURIComponent, page.goto, page.waitForSelector, page.evaluate, Array.from, document.querySelectorAll, filter, links.map, url.startsWith, urls.slice, page.close
- L13 · getBrowser calls (conditional paths may differ): puppeteer.launch
- L17 · extractContent calls (conditional paths may differ): browser.newPage, page.setExtraHTTPHeaders, page.goto, response.status, page.evaluate, filter, Array.from, document.querySelectorAll, includes, el.textContent.toLowerCase, el.textContent.includes, closeButtons.forEach, btn.click, page.waitForTimeout, document.querySelector, metaDescription.getAttribute, document.body.cloneNode, forEach, body.querySelectorAll, el.remove
Environment references: env.BROWSER
Build and deployment pipeline · 2 GitHub Actions workflows
Repository CI declarations, separate from runtime request processing. Job dependencies and conditions are shown as written; long commands are shortened with an ellipsis; a workflow file does not prove a recent successful run.
Triggers: pull_request
changeset-check · no job dependencies declared
Condition: github.head_ref != 'changeset-release/main'
- actions/checkout@v4
actions/checkout@v4 - actions/setup-node@v4
actions/setup-node@v4 - Shell command
npm ci - Check for changesets
npx changeset status --since=origin/main
Triggers: push, pull_request
test · no job dependencies declared
- actions/checkout@v4
actions/checkout@v4 - actions/setup-node@v4
actions/setup-node@v4 - Shell command
npm install - Shell command
npm run lint - Shell command
npm test
Repository README
View original on GitHub ↗Full upstream document by @G4brym · README.md · snapshot f53a0dc
workers-firecrawl
Overview
workers-firecrawl is a Cloudflare Workers implementation of the Firecrawl API, specifically designed to replicate the
/search endpoint. It uses Cloudflare's Browser Rendering API to perform web searches and extract content from web
pages, all within the Cloudflare environment. This project enables developers to self-host a Firecrawl-compatible search
service with minimal setup.
Purpose
This project focuses on providing a lightweight, self-hosted alternative to Firecrawl’s /search endpoint. By
leveraging Cloudflare Workers, it offers a simple API interface for web search capabilities, making it an ideal drop-in
replacement for existing Firecrawl SDK integrations. Update just one line in your codebase to point to your Worker, and
you’re ready to go!
Features
/searchEndpoint: Perform web searches and retrieve structured results, compatible with Firecrawl SDKs./mapEndpoint: Discover all URLs on a website by extracting links from the page and optionally parsing its sitemap.xml./scrapeEndpoint: Scrape a single URL and extract content in multiple formats (markdown, HTML, links, screenshot).- Cloudflare Browser Rendering: Powers real-time web scraping and content extraction.
- Firecrawl SDK Compatibility: Seamlessly integrates with existing Firecrawl-based applications.
- Format Filtering: Request only the content formats you need via
scrapeOptions.formatsto reduce payload size and improve performance. - Screenshot Capture: Capture viewport or full-page screenshots of search results as base64 data URIs.
Additional endpoints or features can be requested via GitHub Issues.
Supported scrapeOptions.formats
The /v1/search endpoint supports the scrapeOptions.formats parameter to control which content formats are returned per result. When omitted, the default formats are ["markdown", "html", "rawHtml", "links"].
| Format | Description |
|---|---|
markdown |
Page content converted to Markdown |
html |
Cleaned HTML content (scripts, styles, nav, header, footer removed) |
rawHtml |
Full raw HTML of the page |
links |
Array of all link URLs found on the page |
screenshot |
Viewport screenshot as a data:image/png;base64,... data URI |
screenshot@fullPage |
Full-page screenshot as a data:image/png;base64,... data URI |
extract |
Accepted by the schema but not yet implemented (requires LLM integration) |
Example — request only markdown:
const results = await firecrawl.search('test query', {
scrapeOptions: { formats: ['markdown'] }
});
Example — request markdown with a screenshot:
const results = await firecrawl.search('test query', {
scrapeOptions: { formats: ['markdown', 'screenshot'] }
});
Basic Usage
Prerequisites
- A Cloudflare account with a Workers Paid Plan ($ 5/month) to use Browser Rendering.
Setup for Local Development
Clone the Repository
git clone git@github.com:G4brym/workers-firecrawl.git cd workers-firecrawlInstall Dependencies
npm installLog in to Cloudflare
Authenticate with your Cloudflare account:
npx wrangler loginDeploy the Worker
Deploy to Cloudflare:
npx wrangler deployAfter deployment, you’ll see a URL in your terminal, e.g.,
https://workers-firecrawl.{your-user}.workers.dev. This is your Worker’s endpoint.Test the Worker
Open the URL in your browser to access a Swagger UI for testing the
/searchendpoint directly. Use this URL in your Firecrawl SDK configuration.Authorization (Optional)
By default, this worker will accept requests from everyone, so its recommended that you setup authorization, For this, just set the
AUTHORIZATION_KEYsecret in your worker, with the desired api key you want to use.npx wrangler secret put AUTHORIZATION_KEY
Making Requests
Integrate with the Firecrawl SDK by updating the apiUrl to your Worker’s URL:
const {FirecrawlApp} = require('@mendable/firecrawl-js');
const firecrawl = new FirecrawlApp({
apiKey: 'your-api-key', // Only if AUTHORIZATION_KEY is defined in the worker
apiUrl: 'https://workers-firecrawl.{your-user}.workers.dev'
});
// Example search
const results = await firecrawl.search('test query');
console.log(results);
// Example map — discover all URLs on a website
const mapResult = await firecrawl.map('https://example.com');
console.log(mapResult);
// Example scrape
const result = await firecrawl.scrapeUrl('https://example.com', {
formats: ['markdown', 'links'],
});
console.log(result);
Customization
- Custom Domain: Assign a custom domain via the Cloudflare dashboard under Workers > Your Worker > Triggers.
- Cloudflare Access: Add security by configuring Cloudflare Access for authenticated access under Access > Applications.
License
This project is licensed under the MIT License. See LICENSE for details.
Frequently asked about workers-firecrawl
What is workers-firecrawl?+
workers-firecrawl is a self-hosted Apify/Firecrawl alternative built on the Cloudflare developer platform. Serve Firecrawl-style search, map and scrape endpoints from a Cloudflare Worker.
What does workers-firecrawl replace?+
workers-firecrawl is listed as an alternative to Apify, Firecrawl. Compare the features and tradeoffs before migrating.
What Cloudflare primitives does workers-firecrawl use?+
workers-firecrawl is built on Browser Rendering, Workers.
How much does workers-firecrawl cost to run?+
workers-firecrawl has a documented low-volume paid Cloudflare path beginning with Workers Paid ($5 USD/account/month), with separately metered usage. The upstream setup requires Paid; browser hours and concurrency must remain bounded. Use the documented Workers Paid setup, starting at $5 USD/account/month; browser usage above ten hours/month or ten concurrent sessions adds charges. Workers Paid starts at $5 USD/account/month and includes 10 million requests/month plus 30 million CPU milliseconds/month; higher CPU limits do not make execution unmetered. Workers Paid Browser Rendering includes ten browser hours/month and ten concurrent sessions averaged monthly; excess hours and concurrency are billed. Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations. Check current Cloudflare pricing before deploying.
Is workers-firecrawl open source?+
The upstream repository declares the MIT license. Read its terms at https://raw.githubusercontent.com/G4brym/workers-firecrawl/f53a0dc01502401bf790ccb382d41014b8713afb/LICENSE. Source code and contributor credit are available at https://github.com/G4brym/workers-firecrawl.


Discussion · 0
sign in to comment →