█

AI/TLDR

Buy me a coffee
Buy me a coffee

TRAWL

Self-hosted scraping engine with challenge handling, an HTTP API and an MCP server for agents

Web Scraping & CrawlingOpen source
Language
TypeScript
License
AGPL-3.0
$docker run -d --name trawl \
IN SHORT

What is TRAWL?

TRAWL is a self-hosted web scraping engine for applications and AI agents. It sits in the Web Scraping & Crawling category of the Data & Labeling tools and is open-source, written in TypeScript and licensed AGPL-3.0. To get started: start the container.

Overview

TRAWL is a self-hosted web scraping engine for applications and AI agents. You give it a known URL and it returns the page — as HTML through its REST API, or as Markdown, extracted JSON records, a screenshot or browser diagnostics through its Model Context Protocol server. It does not search the web; the caller supplies the URL.

Its core job is getting past the walls that stop plain HTTP clients. A request starts as a cheap HTTP fetch and escalates through browser tiers only when needed, opening Camoufox (a hardened Firefox) to clear JavaScript and proof-of-work challenges such as Cloudflare, Anubis, Akamai, Imperva and DDoS-Guard, plus supported CAPTCHA widgets including Turnstile, reCAPTCHA v2, hCaptcha and GeeTest Slide. Once a site accepts a clearance, TRAWL caches it in Redis or memory so repeat requests fetch fresh content over HTTP without repeating the full solve. Solving is local by default; a 2Captcha fallback is optional.

The same engine is exposed several ways: a native /scrape API, a FlareSolverr-compatible /v1 endpoint that works as a drop-in replacement for clients such as Prowlarr and Jackett, a challenge-aware HTTP/HTTPS forward proxy, isolated browser sessions that keep cookies and storage between requests, and a local dashboard with request history and failure causes. It is written in TypeScript on Bun and Elysia, ships as Docker images for AMD64 and ARM64, and is AGPL-3.0 licensed.

What it does

  • Tiered execution: plain HTTP first, escalating to Camoufox browser tiers only when a challenge is detected
  • Challenge handling for Cloudflare, Anubis, Akamai, Imperva, DDoS-Guard and supported AWS WAF and DataDome flows, plus Turnstile, reCAPTCHA v2, hCaptcha, GeeTest Slide, ALTCHA, Friendly Captcha and CAP widgets
  • Clearance reuse through a Redis or in-memory cache, so repeat requests skip the full solve when the site accepts the saved session
  • MCP server over Streamable HTTP with read-only read, scrape, extract, screenshot and inspect tools for AI clients
  • Native /scrape API, FlareSolverr-compatible /v1 endpoint and an optional challenge-aware HTTP/HTTPS forward proxy
  • Isolated named browser sessions plus a local metrics dashboard with tier outcomes and failure causes

Getting started

TRAWL runs as a Docker container. The quick start from the README starts one browser with the MCP endpoint, an in-memory clearance cache and a persistent dashboard; keep the API and MCP endpoint on a trusted network, since MCP has no authentication.

Start the container

bashbash
docker run -d --name trawl \
  -p 127.0.0.1:8191:8191 \
  --shm-size=1gb \
  -e SESSION_CACHE_DRIVER=memory \
  -e BROWSER_POOL_SIZE=1 \
  -e MCP_ENABLED=true \
  -e METRICS_DASHBOARD_ENABLED=true \
  -v trawl_metrics:/data/metrics \
  ghcr.io/germondai/trawl:1.9.3

curl http://localhost:8191/health

Scrape a page through the native API

The response carries the HTML, cookies, the tier that won and timings. Setting solveEmbeddedCaptchas to false returns page content without attempting optional form widgets; access challenges are still cleared.

bashbash
curl -X POST http://localhost:8191/scrape \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://nopecha.com/demo/cloudflare","solveEmbeddedCaptchas":false}'

Connect an AI client over MCP

With MCP_ENABLED=true, add a remote MCP server using Streamable HTTP in your client. The exact configuration syntax belongs to the client; the tools are read, scrape, extract, screenshot and inspect.

texttext
Name: trawl
Transport: Streamable HTTP
URL: http://localhost:8191/mcp
TRAWL metrics dashboard showing request totals, success rate, an hourly request-activity chart, tier outcomes, failure causes and recent requests (illustrative traffic).
The local metrics dashboard: request activity, outcomes per tier, failure causes and request history. The README notes the traffic shown is illustrative.TRAWL README ↗

Open the local dashboard

Visit http://localhost:8191/dashboard for request history, tier outcomes and failure causes. The mounted volume keeps the history across container recreation.

Commands and code are distilled from the project's own documentation — always check the official repo for the latest.

When to use it

  • Give an agent a self-hosted MCP tool that reads pages as Markdown even when they sit behind a browser challenge
  • Replace FlareSolverr or Byparr behind Prowlarr or Jackett with a compatible /v1 endpoint
  • Feed a scraping or RAG pipeline from protected pages without paying per request to a hosted unblocking API
  • Keep logged-in browser state for a multi-step scrape using isolated named sessions

How TRAWL compares

TRAWL alongside other open-source web scraping & crawling tools AI/TLDR tracks, ranked by GitHub stars.

ToolStarsWhat it does
Firecrawl★ 198kA crawling service and API that converts whole websites into clean Markdown or structured JSON ready for LLMs.
Agent Reach★ 108kA capability layer that installs, health-checks and routes readers so a CLI agent can read and search web pages, YouTube, RSS, GitHub, Reddit, Twitter/X and more without API fees.
Scrapling★ 92.6kA Python web scraping framework whose parser relocates your elements when pages change, with stealthy fetchers and a Scrapy-like spider engine for full crawls.
Crawl4AI★ 86.8kA local-first Python web crawler that turns pages into clean Markdown for use in RAG and LLM pipelines.
Scrapy★ 65.2kA mature Python framework for writing fast spiders that crawl websites and extract structured data at scale.
changedetection.io★ 35.5kA self-hosted web page change monitor with XPath/CSS/jq filters, browser steps and restock alerts, which can route every diff through an LLM to suppress noise.
ScrapeGraphAI★ 32.4kA Python library that uses LLMs and a graph pipeline to extract data from pages based on natural-language prompts.
TRAWL★ 1.1kSelf-hosted scraping engine with challenge handling, an HTTP API and an MCP server for agents