Crawl a whole site or a single page
Follow links across an entire site or fetch one URL, with concurrent requests and live progress events. Tune how it walks the site with breadth-first, depth-first, best-first, or adaptive strategies.
Crawl a whole site or a single page
Follow links across an entire site or fetch one URL, with concurrent requests and live progress events. Tune how it walks the site with breadth-first, depth-first, best-first, or adaptive strategies.
Clean Markdown, every time
Every page comes back as ready-to-use Markdown — feed it straight to an LLM or your own pipeline. Generate a citation list when you need one.
Know what's on every page
Titles, links, images, feeds, and social-card data arrive already extracted and structured, so you skip the HTML parsing. Covers Open Graph, Twitter Card, Dublin Core, JSON-LD, and hreflang.
Handles JS-heavy and bot-protected sites
When a page needs JavaScript or trips a bot filter, crawlberg renders it in a real browser for you. It escalates to a Chromium (CDP) or native browser backend only when a page needs it.
Use it from your agent, API, or CLI
Drive crawlberg from an AI agent over MCP, a REST service, or the command line — no glue code required. The MCP and REST servers are gated behind cargo features.
Works in the language you already use
One Rust engine, identical results across 14 languages: Python, TypeScript, Go, Java, Kotlin Android, C#, Ruby, PHP, Elixir, Dart, Swift, Zig, WebAssembly, and C FFI.
| Language | Package | Docs |
|---|---|---|
| Rust | cargo add crawlberg |
API Reference |
| Python | pip install crawlberg |
API Reference |
| TypeScript / Node | npm install @xberg-io/crawlberg |
API Reference |
| WebAssembly | npm install @xberg-io/crawlberg-wasm |
API Reference |
| Go | go get github.com/xberg-io/crawlberg/packages/go |
API Reference |
| Java | Maven Central io.xberg.crawlberg:crawlberg |
API Reference |
| Kotlin (Android) | Maven Central io.xberg.crawlberg:crawlberg-android |
API Reference |
| C# | dotnet add package Crawlberg |
API Reference |
| Ruby | gem install crawlberg |
API Reference |
| PHP | composer require xberg-io/crawlberg |
API Reference |
| Elixir | {:crawlberg, "~> 0.3.0"} |
API Reference |
| Dart / Flutter | dart pub add crawlberg |
API Reference |
| Swift | Swift Package Manager | API Reference |
| Zig | zig fetch --save from GitHub |
API Reference |
| C (FFI) | Shared library + header | API Reference |
| CLI | cargo install crawlberg-cli |
CLI Guide |
| Docker | ghcr.io/xberg-io/crawlberg |
Docker Guide |
use crawlberg::{CrawlConfig, ContentConfig, create_engine, crawl};
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let config = CrawlConfig { max_depth: Some(2), max_pages: Some(50), content: ContentConfig::default(), ..Default::default() }; let engine = create_engine(Some(config))?;
let result = crawl(&engine, "https://example.com").await?; for page in &result.pages { let title = page.metadata.title.as_deref().unwrap_or("(no title)"); println!("{} — {}", page.url, title); } Ok(())}import asynciofrom crawlberg import CrawlConfig, create_engine, crawl
async def main(): engine = create_engine(CrawlConfig(max_depth=2, max_pages=50)) result = await crawl(engine, "https://example.com") for page in result.pages: print(f"{page.url} — {page.metadata.title or '(no title)'}")
asyncio.run(main())import { createEngine, crawl } from "@xberg-io/crawlberg";
const engine = createEngine({ maxDepth: 2, maxPages: 50 });const result = await crawl(engine, "https://example.com");
for (const page of result.pages) { console.log(`${page.url} — ${page.metadata.title ?? "(no title)"}`);}