BlazeCrawl Core
Security-first, self-hostable web-data engine. Turn web pages into clean,
LLM-ready Markdown and structured data via three endpoints: /v1/scrape,
/v1/crawl, and /v1/map.
BlazeCrawl Core is the open-source engine. It is built for people who want to run their own scraping infrastructure without handing their URLs, traffic, or credentials to a third party — and without giving up the outbound-request security that most self-hosted scrapers skip.
What it is
- A single-binary, self-hosted web-data API you run yourself.
- Hardened by default: every outbound fetch is SSRF-validated and
pinned-at-connect (DNS-rebinding resistant), blocks private/loopback/
link-local/cloud-metadata ranges, blocks
https→httpredirect downgrades, and caps response sizes. - Browser-backed rendering (Playwright) for JS-heavy pages, with a fast static path for simple pages.
- robots.txt-respecting crawler (same-origin BFS).
- Python SDK, Node SDK, CLI, and MCP servers.
What it is not
- Not a hosted SaaS. There is no account to create and no external service to sign up for. You run it; you own it.
- Not a managed anti-bot / residential-proxy product. Managed proxy fleets, managed LLM extraction, enterprise SSO/SCIM, and multi-tenant metering are part of the separate commercial BlazeCrawl Cloud — they are deliberately excluded here (see docs/OSS_VS_CLOUD.md).
- Not a "Firecrawl killer". It is a focused, security-first engine. No inflated benchmark claims — see docs/BENCHMARKS.md for our own reproducible baseline methodology.
Why it exists
Most self-hosted scrapers treat the outbound request as trusted. BlazeCrawl Core treats every user-supplied URL as hostile: it resolves the host once, validates every returned address against a private/reserved denylist, pins the connection to the validated IP (so DNS can't be rebound between check and use), and re-validates every redirect hop. That posture is the point.
Docker
For the v0.1.1 release and later, pull the published Linux x86_64 image:
docker run --rm -p 127.0.0.1:8000:8000 -v blazecrawl-data:/data/blazecrawl ghcr.io/danishxsethi/blazecrawl:0.1.1
The image is published only after its release tag passes artifact checks. Until that release is public, use the source Compose quickstart below.
Quickstart (Docker Compose from source)
Prerequisites: Docker + Docker Compose.
git clone <this-repo>
cd blazecrawl
docker compose up --build
The API listens on http://localhost:8000 (loopback only). On first start it
generates a local API key, writes it to the api-state volume
(/data/blazecrawl/api_key, mode 0600), and shows it once in the logs:
docker compose logs api | grep "first run"
# [blazecrawl] first run: generated local API key and wrote it to
# /data/blazecrawl/api_key (mode 0600). Key (shown once): blz_local_xxxxxxxx
Restart the stack and the same key is reused silently.
curl -X POST http://localhost:8000/v1/scrape \
-H "Authorization: Bearer blz_local_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
Stable keys: set your own key and it will never be persisted or printed:
BLAZECRAWL_API_KEY=my-secret-key docker compose up. To expose the API beyond loopback, change the published port deliberately and put TLS in front.
Trusted local development: to skip the API key entirely, run bound to loopback with auth explicitly disabled:
BLAZECRAWL_AUTH_DISABLED=true BLAZECRAWL_HOST=127.0.0.1. This is refused on any non-loopback bind.
Local (no Docker)
pip install -e .
playwright install chromium
blazecrawl-server # serves on http://127.0.0.1:8000
API
| Endpoint | Description |
|---|---|
GET /health |
Liveness. |
GET /ready |
Readiness + browser-pool/cache/queue status. |
POST /v1/scrape |
Scrape a URL → Markdown/HTML/text/links/images. |
POST /v1/map |
Discover a site's URL set (sitemap + link graph). |
POST /v1/crawl |
Start a same-origin BFS crawl (async job). |
GET /v1/crawl/{id} |
Poll crawl status/results. |
DELETE /v1/crawl/{id} |
Cancel a crawl. |
Scrape
curl -X POST http://localhost:8000/v1/scrape \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown","links"],"render":"auto"}'
render is auto (static, with browser fallback when content is thin),
static, or browser.
Map
curl -X POST http://localhost:8000/v1/map \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
Crawl
curl -X POST http://localhost:8000/v1/crawl \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","max_pages":25,"max_depth":2}'
# → {"job_id":"...","status_url":"/v1/crawl/..."}
curl http://localhost:8000/v1/crawl/<job_id> -H "Authorization: Bearer $KEY"
Install SDKs and MCP integrations
The following registry commands apply after v0.1.1 is published. Until then, install from this checkout as shown in the component READMEs.
# Python server / CLI
pip install blazecrawl-core==0.1.1
playwright install chromium
# Python SDK or MCP server
pip install blazecrawl==0.1.1
pip install blazecrawl-mcp==0.1.1
# Node SDK or MCP server (Node 18+)
npm install @blazecrawl/sdk@0.1.1
npm install @blazecrawl/mcp@0.1.1
blazecrawl-core starts the self-hosted server and provides the CLI.
blazecrawl and @blazecrawl/sdk are API clients. The *-mcp packages expose
BlazeCrawl tools to MCP-compatible clients over stdio.
SDKs & CLI
Python
from blazecrawl import BlazeCrawl
with BlazeCrawl(api_key="blz_local_...") as bc:
print(bc.scrape("https://example.com")["markdown"])
Node
import { BlazeCrawl } from "@blazecrawl/sdk";
const doc = await new BlazeCrawl({ apiKey: "blz_local_..." }).scrape("https://example.com");
console.log(doc.markdown);
CLI
export BLAZECRAWL_API_KEY=blz_local_...
blazecrawl scrape https://example.com
blazecrawl map https://example.com
blazecrawl crawl https://example.com --max-pages 25 --wait
MCP (Claude Code, etc.)
{
"mcpServers": {
"blazecrawl": {
"command": "blazecrawl-mcp",
"env": { "BLAZECRAWL_API_KEY": "blz_local_..." }
}
}
}
Architecture
┌────────────────────────────────────────────┐
SDK ──▶│ FastAPI /v1/scrape /v1/map /v1/crawl │
CLI ──▶│ │
MCP ──▶│ auth (local key) │
└───────┬────────────────────────────────────┘
│
┌──────────▼───────────┐ ┌──────────────────────────┐
│ network/egress │ │ engine │
│ • SSRF validate+pin │────▶│ • content extraction │
│ • manual redirects │ │ (readability/trafil.) │
│ • private-IP block │ │ • HTML → Markdown │
│ • browser req guard │ │ • browser pool (Playwright)
└──────────────────────┘ │ • crawler (BFS + robots)│
│ • cache (memory|redis) │
└──────────────────────────┘
Full details in docs/ARCHITECTURE.md.
Security model
BlazeCrawl Core is designed to be safe to point at arbitrary URLs. Highlights:
- DNS-rebinding-resistant egress (resolve-once + pin-at-connect).
- Private/loopback/link-local/cloud-metadata/IPv4-mapped-IPv6 blocked.
https→httpredirect downgrades blocked; redirect hops re-validated.- Response size caps; per-hop timeouts; browser request interception guard.
- robots.txt enforced and not configurable-off in the OSS core.
See SECURITY.md for the disclosure policy and docs/SECURITY_MODEL.md for the full model.
Maturity
v0.1.0 — early release. The scrape/map/crawl engine, egress security, SDKs,
CLI and MCP are functional and tested. This is not yet battle-hardened at
large scale; please report issues. See CHANGELOG.md and the
roadmap.
Contributing
We welcome contributions — see CONTRIBUTING.md and the good-first-issue backlog in docs/CONTRIBUTION_BACKLOG.md.
License
Apache-2.0 — see LICENSE.
Release files for blazecrawl-core 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| blazecrawl_core-0.1.1.tar.gz | 227.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| blazecrawl_core-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 291.9 kB
Release files / blazecrawl_core-0.1.1.tar.gz
| Download URL | blazecrawl_core-0.1.1.tar.gz |
|---|---|
| Size | 227.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
336524ab895fdde91e969388cd64a32be5d76e60b1ced4944ecd42bf8138b0b9
|
|
BLAKE2b-256 checksum How to use checksums |
a1a13fe298f26deb15c6cba0e0e349df6ba6300f43bce9da0902f521f9110bae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.
Transparency logRelease files / blazecrawl_core-0.1.1-py3-none-any.whl
| Download URL | blazecrawl_core-0.1.1-py3-none-any.whl |
|---|---|
| Size | 64.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7bc5cd320fed3598158dc9dc94605454bbee6567abd0f9d9ac3639237a2044e1
|
|
BLAKE2b-256 checksum How to use checksums |
d56fd4419d15cec49f3b1fa3157626e025297e0882213afb46dc1db8af3c5d82
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.
Transparency log