/crawlberg-serving-the-api
Use when the user wants a long-running HTTP service for scrape/crawl/map instead of one-shot CLI calls or the MCP server — for example wiring crawlberg into other apps over REST. Covers `crawlberg serve`, the Firecrawl-v1-compatible endpoints, `--host`/`--port`, and when to
$ npx -y skills add xberg-io/crawlberg --skill crawlberg-serving-the-api --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/crawlberg-serving-the-api
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user wants a long-running HTTP service for scrape/crawl/map instead of one-shot CLI calls or the MCP server — for example wiring crawlberg into other apps over REST. Covers `crawlberg serve`, the Firecrawl-v1-compatible endpoints, `--host`/`--port`, and when to
SKILL.md
crawlberg-serving-the-api.SKILL.mddescription: Use when the user wants a long-running HTTP service for scrape/crawl/map instead of one-shot CLI calls or the MCP server — for example wiring crawlberg into other apps over REST. Covers `crawlberg serve`, the Firecrawl-v1-compatible endpoints, `--host`/`--port`, and when to prefer it.
name: crawlberg-serving-the-api
<!-- AI-RULEZ :: GENERATED FILE — DO NOT EDIT Content-Hash: blake3:1985fa0ec5929f7949a6ffe17c9473bfef3221180eabd504f8ca01e3821d8618 Source-Hash: blake3:c646c26d88f919b6848be2422454cabae94e9cbdfefeef3d4beecb56021295a0 Schema-Version: v1 -->
Serving the API
`crawlberg serve` starts a long-running REST API server exposing the crawl engine over HTTP. The endpoints are Firecrawl v1-compatible, so existing Firecrawl clients and SDKs can point at a local crawlberg instance.
This subcommand requires the binary to be built with the optional `api` feature (non-default). The Homebrew tap is built with all features, so `serve` is available there; a from-source build needs `cargo install crawlberg-cli --features api` (or `--features all`) to include it.
Quick recipe
crawlberg serve --host 127.0.0.1 --port 3000
It logs `Starting REST API server on <host>:<port>` to stderr and blocks until terminated. Hit `GET /health` to confirm it is up.
Flags
| Flag | Default | Purpose | | -------- | --------- | -------------------------------- | | `--host` | `0.0.0.0` | Address to bind to. | | `--port` | `3000` | Port to listen on. |
`serve` does not take the per-request crawl flags — it boots with the default `CrawlConfig` and accepts per-request options in each HTTP request body.
Endpoints
Firecrawl v1 surface:
| Method + path | Purpose | | ------------------------- | ---------------------------------------------------- | | `POST /v1/scrape` | Scrape a single URL (synchronous). | | `POST /v1/crawl` | Start an asynchronous crawl job → returns a job `id`. | | `GET /v1/crawl/{id}` | Poll crawl job status and collect results. | | `DELETE /v1/crawl/{id}` | Cancel a running crawl job. | | `POST /v1/map` | Discover URLs on a site (synchronous). | | `POST /v1/batch/scrape` | Start an asynchronous batch-scrape job → job `id`. | | `GET /v1/batch/scrape/{id}` | Poll batch-scrape job status and results. | | `POST /v1/download` | Download a document from a URL. |
Operational:
| Method + path | Purpose | | ----------------- | ---------------------------------------- | | `GET /health` | Health check (`{ status, version }`). | | `GET /version` | Version information. | | `GET /openapi.json` | OpenAPI schema for the whole surface. |
Request bodies use `camelCase` fields. Scrape/crawl/map mirror the CLI: `url`, `formats`, `onlyMainContent`, `includeTags`/`excludeTags`, `timeout` for scrape; `url`, `maxDepth`, `maxPages`, `includePaths`/`excludePaths` for crawl; `url`, `limit`, `search` for map. Responses wrap data as `{ success, data | error }`; async jobs return `{ success, id }` and are polled for `{ status, total, completed, data, error }`.
Examples
Scrape via HTTP
curl -s http://127.0.0.1:3000/v1/scrape \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq '.data'Start a crawl job and poll it
id=$(curl -s http://127.0.0.1:3000/v1/crawl \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","maxDepth":2,"maxPages":100}' | jq -r '.id')
curl -s "http://127.0.0.1:3000/v1/crawl/$id" | jq '{status,completed,total}'Map URLs
curl -s http://127.0.0.1:3000/v1/map \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","limit":500,"search":"docs"}' | jq '.data'Operational notes
- The server accepts CORS from any origin and ships **no built-in
authentication** — do not expose it on a public interface. Bind to `127.0.0.1` for local use, or put it behind a reverse proxy / gateway that enforces auth and rate limiting before exposing it more widely.
- Request bodies are capped at 10 MB and each request times out after 5
minutes.
- Crawl and batch-scrape are asynchronous: the POST returns a job `id`
immediately and you poll the `{id}` endpoint until `status` is `completed`, `failed`, or `cancelled`.
When to run serve vs. CLI vs. MCP
- **CLI** (`scrape`/`crawl`/`map`/`interact`) — one-shot jobs, shell pipelines,
scripting. No long-running process.
- **MCP** (`crawlberg mcp`) — driving the crawler from an AI agent harness
(Claude Code, Codex, Cursor, Gemini, opencode). Auto-registered by this plugin; prefer it inside an agent.
- **serve** (`crawlberg serve`) — a persistent HTTP service for other
applications or non-agent clients that speak REST, or when you want Firecrawl-v1 compatibility. Choose it when many callers need the crawler over the network rather than one agent or one shell.
Read more
description: Use when the user wants a long-running HTTP service for scrape/crawl/map instead of one-shot CLI calls or the MCP server — for example wiring crawlberg into other apps over REST. Covers `crawlberg serve`, the Firecrawl-v1-compatible endpoints, `--host`/`--port`, and when to prefer it. name: crawlberg-serving-the-api
<!-- AI-RULEZ :: GENERATED FILE — DO NOT EDIT Content-Hash: blake3:1985fa0ec5929f7949a6ffe17c9473bfef3221180eabd504f8ca01e3821d8618 Source-Hash: blake3:c646c26d88f919b6848be2422454cabae94e9cbdfefeef3d4beecb56021295a0 Schema-Version: v1 -->
Serving the API
`crawlberg serve` starts a long-running REST API server exposing the crawl engine over HTTP. The endpoints are Firecrawl v1-compatible, so existing Firecrawl clients and SDKs can point at a local crawlberg instance.
This subcommand requires the binary to be built with the optional `api` feature (non-default). The Homebrew tap is built with all features, so `serve` is available there; a from-source build needs `cargo install crawlberg-cli --features api` (or `--features all`) to include it.
Quick recipe
crawlberg serve --host 127.0.0.1 --port 3000
It logs `Starting REST API server on <host>:<port>` to stderr and blocks until terminated. Hit `GET /health` to confirm it is up.
Flags
| Flag | Default | Purpose | | -------- | --------- | -------------------------------- | | `--host` | `0.0.0.0` | Address to bind to. | | `--port` | `3000` | Port to listen on. |
`serve` does not take the per-request crawl flags — it boots with the default `CrawlConfig` and accepts per-request options in each HTTP request body.
Endpoints
Firecrawl v1 surface:
| Method + path | Purpose | | ------------------------- | ---------------------------------------------------- | | `POST /v1/scrape` | Scrape a single URL (synchronous). | | `POST /v1/crawl` | Start an asynchronous crawl job → returns a job `id`. | | `GET /v1/crawl/{id}` | Poll crawl job status and collect results. | | `DELETE /v1/crawl/{id}` | Cancel a running crawl job. | | `POST /v1/map` | Discover URLs on a site (synchronous). | | `POST /v1/batch/scrape` | Start an asynchronous batch-scrape job → job `id`. | | `GET /v1/batch/scrape/{id}` | Poll batch-scrape job status and results. | | `POST /v1/download` | Download a document from a URL. |
Operational:
| Method + path | Purpose | | ----------------- | ---------------------------------------- | | `GET /health` | Health check (`{ status, version }`). | | `GET /version` | Version information. | | `GET /openapi.json` | OpenAPI schema for the whole surface. |
Request bodies use `camelCase` fields. Scrape/crawl/map mirror the CLI: `url`, `formats`, `onlyMainContent`, `includeTags`/`excludeTags`, `timeout` for scrape; `url`, `maxDepth`, `maxPages`, `includePaths`/`excludePaths` for crawl; `url`, `limit`, `search` for map. Responses wrap data as `{ success, data | error }`; async jobs return `{ success, id }` and are polled for `{ status, total, completed, data, error }`.
Examples
Scrape via HTTP
curl -s http://127.0.0.1:3000/v1/scrape \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq '.data'Start a crawl job and poll it
id=$(curl -s http://127.0.0.1:3000/v1/crawl \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","maxDepth":2,"maxPages":100}' | jq -r '.id')
curl -s "http://127.0.0.1:3000/v1/crawl/$id" | jq '{status,completed,total}'Map URLs
curl -s http://127.0.0.1:3000/v1/map \
-H 'content-type: application/json' \
-d '{"url":"https://example.com","limit":500,"search":"docs"}' | jq '.data'Operational notes
- The server accepts CORS from any origin and ships **no built-in
authentication** — do not expose it on a public interface. Bind to `127.0.0.1` for local use, or put it behind a reverse proxy / gateway that enforces auth and rate limiting before exposing it more widely.
- Request bodies are capped at 10 MB and each request times out after 5
minutes.
- Crawl and batch-scrape are asynchronous: the POST returns a job `id`
immediately and you poll the `{id}` endpoint until `status` is `completed`, `failed`, or `cancelled`.
When to run serve vs. CLI vs. MCP
- **CLI** (`scrape`/`crawl`/`map`/`interact`) — one-shot jobs, shell pipelines,
scripting. No long-running process.
- **MCP** (`crawlberg mcp`) — driving the crawler from an AI agent harness
(Claude Code, Codex, Cursor, Gemini, opencode). Auto-registered by this plugin; prefer it inside an agent.
- **serve** (`crawlberg serve`) — a persistent HTTP service for other
applications or non-agent clients that speak REST, or when you want Firecrawl-v1 compatibility. Choose it when many callers need the crawler over the network rather than one agent or one shell.
Turn any website into clean, structured data. Point Crawlberg at a URL and get back Markdown, metadata, and links — from a single page or a whole site — in the language you already use.

