By the fastCRW team · Benchmarks and pricing verified 2026-05-18 · fastCRW launch pricing reverts to regular price 2026-06-01 · Verify independently before relying on any number.
Disclosure: We build fastCRW. This is a vendor-authored how-to, so weight it accordingly — we have kept the limitations and the places a competitor genuinely wins explicit, because an integration guide that hides them wastes your time.
Agno framework fastCRW web scraping: giving autonomous agents a web layer
Agno (formerly Phidata) is a Python framework for building fast, autonomous agents that reason, call tools, and loop until the task is done. Out of the box it gives you the agent loop, model routing, memory, and a toolkit abstraction — but it does not give you a reliable way to read the live web. That gap is where most "my agent answered from stale training data" bugs come from. This guide wires fastCRW, a Firecrawl-compatible Rust scraper, into Agno as a tool so your agents can search the web, pull clean markdown, and reason over fresh content — with predictable per-call cost and a self-host escape hatch.
The reason fastCRW fits Agno specifically: Agno agents are built to be cheap and fast enough to call tools many times per task, so retrieval latency and per-call cost compound. fastCRW search averaged 880 ms over a 100-query benchmark with 73 of 100 latency wins against Firecrawl and Tavily (triple-bench.ts, 100 queries, single point-in-time run), bills a flat 1 credit per scraped page, and runs as a single ~8 MB binary you can self-host for $0. The honest caveat up front: there is no Fire-engine-style anti-bot, so hardened sites may still need a proxy layer — covered below.
Agno toolkits and the missing web layer
An Agno Agent takes a model, instructions, and a list of tools. A tool is a plain Python function (or a method on a Toolkit class) with a docstring and typed signature; Agno turns it into a function-calling schema the model can invoke. Agno ships toolkits for common surfaces, but the web-fetch surface — search, scrape, crawl — is exactly the part you want to own, because its accuracy and latency decide whether the agent's reasoning is grounded or hallucinated.
When an agent should hit the live web
Reach for a web tool when the task needs information that is fresher than the model's training cutoff, specific to a named source, or simply not in the weights: today's prices, a competitor's current docs, a news event, a changelog. The pattern is search-to-discover, then scrape-to-read: let the model decide a query, get back ranked results, then fetch the one or two pages that matter as clean markdown. Avoid hitting the web when a static knowledge base already has the answer — every fetch costs latency and a credit.
Register fastCRW as an Agno tool
You have two clean options. The first is to define small Python functions that call fastCRW's REST API directly and hand them to the agent. The second is to reuse the official Firecrawl SDK — because fastCRW implements the Firecrawl-compatible REST surface, the SDK works against fastCRW after a single base-URL swap.
Defining a tool function over the REST API
A tool is just a documented function. The docstring is the contract the model reads, so make it specific:
- Point the function at
POST /v1/scrapewith a JSON body of{ "url": ..., "formats": ["markdown"] }and your API key in theAuthorizationheader. - Return the
markdownfield of the response — clean, LLM-ready text, not raw HTML — so the agent's context window is not wasted on tags and navigation chrome. - Add a second function for
POST /v1/searchthat takes a query string and returns the top results (URL + snippet), so the model can discover before it fetches. - Register both with
Agent(tools=[search_web, scrape_url]). Agno infers the schema from your type hints and docstrings.
Keep each tool single-purpose. An agent reasons better about search_web and scrape_url as separate verbs than about one overloaded web tool with a mode flag.
Base-URL swap from a Firecrawl client
If you already use the Firecrawl Python SDK inside an Agno tool, you do not rewrite anything. Point the client at your fastCRW endpoint — set api_url to https://fastcrw.com (managed) or your self-host address — and the same scrape_url() / search() calls run against fastCRW. The overlap surface (/v1/scrape, /v1/crawl, /v1/map, /v1/search) is drop-in; validate the short known list of field and error-envelope differences before production cutover. See our Firecrawl API compatibility notes for the exact divergences.
Returning markdown and structured JSON
Most agent tasks want markdown — it is the cleanest thing to feed back into the model. When you need typed fields instead (a price, a product name, a release date), send formats: ["json"] plus a jsonSchema on the same /v1/scrape call and fastCRW runs LLM extraction against the page. That request costs 5 credits instead of 1 (extraction is more expensive than plain scraping), and extraction runs on OpenAI or Anthropic providers only — plan your tool to default to markdown and only escalate to JSON extraction when the agent actually needs structure.
A worked example: a market-watch agent
A concrete shape that exercises the whole loop: an agent that watches a market — say, GPU pricing or a set of competitor changelogs — and reports what changed.
Search then scrape, then reason
The agent's instructions tell it to: (1) call search_web with a focused query, (2) pick the most relevant one or two results, (3) call scrape_url on each to get markdown, (4) reason over the combined content and produce a summary. Agno drives this loop natively — the model decides when it has enough context to stop. Because search returns ranked results fast (avg 880 ms over the 100-query benchmark), the discover step does not dominate the loop's wall-clock time.
Scheduling repeated runs
Market-watch is a recurring job, so wrap the agent in a scheduler (cron, an Agno workflow, or your own job runner) and run it on an interval. Each run is independent. Cache results between runs in your own store so the agent can diff "what changed since last time" rather than re-summarizing the same unchanged page — that also saves credits, since a cached page is a fetch you do not pay for.
Handling stateless requests
fastCRW is stateless per request: it does not remember the previous call, hold a session, or carry cookies between fetches. That is a deliberate design choice (it is what keeps the engine a single small binary), but it means your agent owns all state. Store conversation memory, fetched-URL history, and dedup keys in Agno's memory or your own database — do not expect the scraper to remember anything. For a research loop this is rarely a problem; for a multi-step authenticated flow, it means you manage the session yourself.
Fast, predictable retrieval
The two things that compound across an autonomous agent's many tool calls are latency and cost. fastCRW is built to keep both low and legible.
Search avg 880 ms over a 100-query benchmark
Search latency matters because it sits on the agent's critical path before any reasoning can happen. fastCRW search averaged 880 ms with a 785 ms median and 73 of 100 latency wins against Firecrawl (954 ms avg) and Tavily (2,000 ms avg) on a 100-query, 10-category benchmark (triple-bench.ts, single point-in-time run, 100% success across all three providers). Treat these as the search numbers only — they do not measure scrape performance; see the scrape benchmark below for that.
Flat 1-credit-per-page billing
fastCRW bills a flat 1 credit per scraped page on the http or lightpanda renderer, 2 credits when a page needs the chrome renderer, 1 credit per search query, and 5 credits for a request that runs JSON extraction (formats: ["json"]). There is no separate extraction subscription layered on top — the credit you spend is the credit you see. For an agent that loops and re-fetches, a flat, inspectable per-page cost is far safer to budget than an opaque multiplier. Check the live numbers at /pricing.
Self-host for $0 under AGPL-3.0
The whole engine is a single static Rust binary (~6 MB binary, ~8 MB Docker image) under AGPL-3.0, running in one container with no Redis, Node.js, or browser stack required on the hot path. Self-hosting it costs $0 in software — you pay only for your own server. For a high-volume autonomous agent that hammers the web all day, dropping to self-host removes the per-credit cost entirely while keeping the same Firecrawl-compatible API your Agno tools already call. The Python SDK crw (CrwClient()) even runs a self-contained local engine, so a development agent can scrape with no cloud at all.
Accuracy honesty
Speed is worth nothing if the page comes back empty or half-parsed, so accuracy is the metric that actually decides whether your agent is grounded.
Highest truth-recall of the three tools tested
On Firecrawl's own public scrape-content-dataset-v1 (1,000 URLs, of which 819 carry labeled ground truth), fastCRW posted the highest truth-recall of the three tools tested: 63.74% (522 of 819 labeled URLs) versus Crawl4AI 59.95% and Firecrawl 56.04% (diagnose_3way.py, single run, 2026-05-08). We pair that with 91.8% scrape-success of reachable URLs and 0 thrown errors across 3,000 requests — citing recall without the success rate would overstate the result. Higher truth-recall means fewer empty or partial fetches, which means your Agno agent loops less to get the content it needs.
p90 tail disclosure
The latency picture is a strength as well: fastCRW's median scrape latency of 1914 ms beats Firecrawl's 2305 ms (and effectively ties Crawl4AI at 1916 ms). In fast mode, fastCRW's p90 is 4348 ms — the lowest of the three (Crawl4AI 4754 ms, Firecrawl 6937 ms). The chrome-stealth fallback that recovers the URLs the other tools miss — the same mechanism behind the higher recall — is what delivers the best p90 in fast mode. For an autonomous agent, set per-call timeouts and retry budgets against the p90, not the median, so a single complex fetch does not stall the whole loop. If you are tuning a graph-based agent's per-node latency specifically, our scraping-latency explainer walks through the p50/p90 reasoning.
Limitations to design around
Concede these up front so you architect around them instead of discovering them in production.
No /v1/agent or deep-research endpoint
fastCRW has no /v1/agent (Spark-style autonomous endpoint) and no /v1/deep-research endpoint. That is fine for Agno specifically — Agno is your agent harness, so you compose the search-decide-scrape-reason loop in the framework and call fastCRW as a stateless tool inside it. But do not expect fastCRW to run a multi-step research mission on its own; the orchestration is yours.
No Fire-engine anti-bot for hardened sites
fastCRW does not ship Firecrawl's Fire-engine-grade anti-bot stack. For ordinary sites and most documentation, news, and content pages, the chrome renderer handles JavaScript and basic protections. But for sites behind aggressive bot defenses (heavy Cloudflare challenges, sophisticated fingerprinting), you may need to front fastCRW with your own residential-proxy layer, or — where those pages are essential — use Firecrawl's cloud for that subset. This is a real gap; if your market-watch agent targets hardened sources, validate them before you commit. (Also note: there is no screenshot output — a request for formats: ["screenshot"] returns HTTP 422.)
Where Firecrawl genuinely wins
For an Agno integration specifically, Firecrawl's cloud-only strengths are the honest reasons to stay or to use it alongside fastCRW: its Fire-engine anti-bot paths reach sites fastCRW will struggle with, its /v1/agent and deep-research endpoints offload orchestration you would otherwise build in Agno, batched multi-URL /v1/extract handles bulk structured pulls in one call, and its larger ecosystem means more examples to copy. fastCRW wins on retrieval latency, flat per-page cost, the highest truth-recall of the three tools tested, and the single-binary self-host floor — but if your agent's job depends on the cloud-only specialties above, that is a legitimate reason to keep Firecrawl in the loop. Because both share the API shape, you can route a hardened subset to Firecrawl and the rest to fastCRW from the same Agno tool.
Sources
- fastCRW canonical fact sheet (benchmarks, credits, footprint, gaps): github.com/us/crw · fastcrw.com
- Scrape 3-way benchmark of record:
diagnose_3way.pyon Firecrawl's publicscrape-content-dataset-v1, 819 labeled URLs, single run, 2026-05-08. - Search benchmark:
triple-bench.ts, 100 queries across 10 categories, single point-in-time run. - Agno framework docs: github.com/agno-agi/agno (verified 2026-05-18).
Related: Search API for AI agents · The web context layer for AI agents · OpenAI Agents SDK + fastCRW
