crewai-crw
CRW web scraping tools for CrewAI — scrape, crawl, map, and search the web with AI agents.
CRW is an open-source web scraper built for AI agents. Single Rust binary, ~6 MB idle RAM, Firecrawl-compatible API.
Installation
pip install crewai crewai-crw
# or
uv add crewai crewai-crw
That's it. No server to install, no cargo install, no Docker. The crw SDK automatically downloads and manages the CRW binary for you.
Quick Start — Zero Config (Subprocess Mode)
from crewai_crw import CrwScrapeWebsiteTool
# Just works — crw SDK handles everything locally
scrape_tool = CrwScrapeWebsiteTool()
Cloud Mode (fastcrw.com)
No local binary needed. Sign up at fastcrw.com and get 500 free credits:
from crewai_crw import CrwScrapeWebsiteTool
scrape_tool = CrwScrapeWebsiteTool(
api_url="https://fastcrw.com/api",
api_key="crw_live_...", # or set CRW_API_KEY env var
)
Advanced: Self-hosted Server
If you prefer running a persistent CRW server (e.g., shared across services):
# Option A: Install binary
curl -fsSL https://raw.githubusercontent.com/us/crw/main/install.sh | bash
crw # starts on http://localhost:3000
# Option B: Docker
docker run -d -p 3000:3000 ghcr.io/us/crw:latest
scrape_tool = CrwScrapeWebsiteTool(api_url="http://localhost:3000")
Tools
| Tool | Description |
|---|---|
CrwScrapeWebsiteTool |
Scrape a single URL and get clean markdown |
CrwCrawlWebsiteTool |
BFS crawl a website, collect content from multiple pages |
CrwMapWebsiteTool |
Discover all URLs on a website |
CrwSearchWebTool |
Search the web and get results (cloud only) |
CrewAI Example
from crewai import Agent, Task, Crew
from crewai_crw import CrwScrapeWebsiteTool
# Zero config — just works out of the box
scrape_tool = CrwScrapeWebsiteTool()
researcher = Agent(
role="Web Researcher",
goal="Research and summarize information from websites",
backstory="Expert at extracting key information from web pages",
tools=[scrape_tool],
)
task = Task(
description="Scrape https://example.com and summarize the content",
expected_output="A summary of the page content",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[task])
result = crew.kickoff()
Crawl an entire site
from crewai_crw import CrwCrawlWebsiteTool
crawl_tool = CrwCrawlWebsiteTool(
config={
"maxDepth": 3,
"maxPages": 50,
"formats": ["markdown"],
"onlyMainContent": True,
}
)
# Use in an agent
researcher = Agent(
role="Deep Researcher",
goal="Crawl documentation sites and extract comprehensive information",
backstory="Expert at gathering information across multiple pages",
tools=[crawl_tool],
)
Discover all URLs on a site
from crewai_crw import CrwMapWebsiteTool
map_tool = CrwMapWebsiteTool()
# Use in an agent
mapper = Agent(
role="Site Mapper",
goal="Discover and catalog all pages on a website",
backstory="Expert at understanding website structure",
tools=[map_tool],
)
Search the web (Cloud Only)
Note: Web search is a cloud-only feature. It requires
api_urlpointing to a CRW cloud instance (e.g. fastcrw.com). Subprocess mode is not supported for search.
from crewai_crw import CrwSearchWebTool
search_tool = CrwSearchWebTool(
api_url="https://fastcrw.com/api",
api_key="YOUR_KEY",
)
# Use in an agent
researcher = Agent(
role="Web Researcher",
goal="Find the latest information on any topic",
backstory="Expert at searching the web for relevant information",
tools=[search_tool],
)
Configuration
Constructor Arguments
| Argument | Type | Default | Description |
|---|---|---|---|
api_url |
str | None |
None |
CRW server URL. If unset, uses subprocess mode (no server needed) |
api_key |
str | None |
None |
API key (required for fastcrw.com) |
config |
dict |
varies per tool | Tool-specific configuration |
Environment Variables
Both CRW_API_URL and CRW_API_KEY can be set via environment variables as fallbacks:
export CRW_API_URL=https://fastcrw.com/api # or http://localhost:3000
export CRW_API_KEY=your_api_key # required for cloud, optional for self-hosted
# With env vars set, no constructor args needed:
tool = CrwScrapeWebsiteTool()
Scrape Config
| Key | Type | Default | Description |
|---|---|---|---|
formats |
list[str] |
["markdown"] |
Output formats: markdown, html, rawHtml, plainText, links, json |
onlyMainContent |
bool |
true |
Strip nav/footer/sidebar |
renderJs |
bool|null |
null |
null=auto, true=force JS, false=HTTP only |
waitFor |
int |
— | ms to wait after JS rendering |
includeTags |
list[str] |
[] |
CSS selectors to include |
excludeTags |
list[str] |
[] |
CSS selectors to exclude |
Crawl Config
| Key | Type | Default | Description |
|---|---|---|---|
maxDepth |
int |
2 |
Maximum link-follow depth |
maxPages |
int |
10 |
Maximum pages to scrape |
formats |
list[str] |
["markdown"] |
Output formats per page |
onlyMainContent |
bool |
true |
Strip boilerplate |
Map Config
| Key | Type | Default | Description |
|---|---|---|---|
maxDepth |
int |
2 |
Maximum discovery depth |
useSitemap |
bool |
true |
Also read sitemap.xml |
Search Config (Cloud Only)
| Key | Type | Default | Description |
|---|---|---|---|
limit |
int |
5 |
Maximum number of results to return |
Compared to Firecrawl Tools
| Feature | crewai-crw | Firecrawl Tools |
|---|---|---|
| Requires SDK package | No (uses requests) |
Yes (firecrawl-py) |
| Requires API key | No (subprocess or self-hosted) | Yes (always) |
| Server required | No (pip install is all you need) |
Yes (always) |
| Self-hosted option | Yes (single binary, auto-managed) | Complex (5+ containers) |
| Cloud option | Yes (fastcrw.com) | Yes (firecrawl.dev) |
| Idle RAM | ~6 MB | ~500 MB+ |
License
MIT
Metadata
Release files for crewai-crw 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| crewai_crw-0.4.0.tar.gz | 238.2 kB | Without provenance | Details for crewai_crw-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| crewai_crw-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for crewai_crw-0.4.0-py3-none-any.whl |
Total release size: 245.6 kB
Release files / crewai_crw-0.4.0.tar.gz
| Download URL | crewai_crw-0.4.0.tar.gz |
|---|---|
| Size | 238.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a9d634a4d67cecfd164109e69b220188af49b5ac59341ab98ebe453cfc726b97
|
|
BLAKE2b-256 checksum How to use checksums |
47037e8360a1eb565b1451a578c1bbfe717385122369370221a1a2dbd3055eba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / crewai_crw-0.4.0-py3-none-any.whl
| Download URL | crewai_crw-0.4.0-py3-none-any.whl |
|---|---|
| Size | 7.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d2f0e7c3fb4ca13ad6b1cdbdb4dca51141590e4c47e1c72b591e84fa439660e7
|
|
BLAKE2b-256 checksum How to use checksums |
cb033d6055e3739e9b145cc7009d993acefdc8f61d2a5aa7ba6628d5b9af9bd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for crewai-crw 0.4.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.