Compare

How do I add a backup crawler to Firecrawl?

Keep Firecrawl as your primary and send UpRock only the pages that come back with a 401, 403, 429 or 5xx, time out, or need a country Firecrawl doesn't cover. UpRock loads the page on a real desktop or mobile device in the country you pick and returns markdown, at $0.50 per 1,000 pages.

Updated · Read as markdown

What Firecrawl does well

Firecrawl turns websites into LLM-ready data, and it does more than fetch pages. One API key gets you scrape, crawl (follow links across a site), map (list a site's URLs), web search, batch scraping, JSON extraction with a schema, browser actions and change tracking. It has SDKs in nine languages, an official MCP server (remote or local), and an AGPL-3.0 core you can self-host. Scrapes are cached for two days by default, so repeat reads are fast.

Its default proxy setting, auto, already handles a lot of trouble for you: when a target page answers 401, 403 or 429, Firecrawl retries once on its enhanced proxies, at no extra credit cost.

If Firecrawl returns what you need, keep using it. A backup is for the rest.

When a second crawler helps

A Firecrawl call can come back without the page you wanted in a few distinct ways. Each one has a different right answer, and only some of them are a job for UpRock.

What you see from FirecrawlWhat it meansSend it to UpRock?
metadata.statusCode 401, 403 or 429, after the auto retryThe target site refused Firecrawl's requestYes
Error 408 or 5xxThe page was slow, or Firecrawl had a problemYes
Error 429You hit your plan's limit (Hobby: 100 scrapes a minute, 5 browsers at once)Yes, or queue and retry
Error 402Your credits ran outYes, or top up
You need a country outside Firecrawl's listFirecrawl fetches from the closest region (EU or US) and sets the browser location to your countryGo straight to UpRock
Error 403 UNSUPPORTED_SITEFirecrawl doesn't scrape this site, by policyUsually no. UpRock only fetches public pages and never logs in, so most of these won't work for us either
metadata.statusCode 404 or 410The page is goneNo. Every crawler will see the same

The country row is easy to miss. Firecrawl's basic proxies cover 26 countries and its enhanced proxies cover two (the Netherlands and the US). Ask for a page from South Korea, Indonesia or Argentina and Firecrawl serves it from the nearest supported region instead. UpRock takes the country per request (ISO code), and the fallback below goes straight to it for those.

Firecrawl and UpRock side by side

Firecrawl numbers come from its own pricing and docs pages, checked 24 Oct 2026. Prices are per 1,000 plain markdown pages (1 credit each on Firecrawl).

FirecrawlUpRock
Price per 1,000 pages$3.80 on Hobby ($19 for 5,000 credits), $0.99 on Standard, $0.80 on Growth, $0.75 on Scale ($749 for 1,000,000), $0.60 on Scale billed yearly$0.50 by card or USDC, $0.40 with UPT. Prepaid credits, no plan
Extra-cost optionsJSON extraction +4 credits a page, PDFs +1 a page, zero data retention +1None. Every page is 1 credit
Where requests come fromRotating proxies and a headless browser; mobile is emulatedReal desktop and mobile devices whose owners opted in
Countries26 on basic proxies, 2 on enhanced; US by default63, or a region
Crawl a whole site, map, search, JSON extractionYesNo. One page per call
MCP serverOfficial, remote or localYes, remote (streamable HTTP)
VideoA video format returns a file link for supported video URLsSearch public video by moment, $1 per 1,000 searches
Self-hostAGPL-3.0; some features are cloud-onlyNo. The device runtime (Fuel Engine) is open source
Rate limitsPublished per plan, from 10 scrapes a minute (Free) to 10,000 (Scale)Not published yet

Where Firecrawl is better: whole-site crawling, structured extraction, browser actions, a Free plan with 1,000 credits a month to try it, and published rate limits. Where UpRock fits: the page Firecrawl couldn't return, a real device instead of a proxy, a country outside Firecrawl's list, and one flat price per page.

The fallback, in TypeScript and Python

Every version does the same thing:

  1. If the country is on Firecrawl's list, call Firecrawl.
  2. If Firecrawl throws, or returns a target status worth retrying, call UpRock.
  3. Respect UNSUPPORTED_SITE instead of working around it.

The HTTP versions make one POST /v1/crawl request with your key in an Authorization: Bearer header. UpRock loads the page on a device in the country you ask for, tries a fresh device every 7 seconds, up to 3 times, and returns the markdown in the response. If you already use UpRock's MCP server or CLI, the other tabs do the same through those: crawl_fetch loads the page and resource_fetch returns the full markdown, or the CLI prints it as JSON.

// npm i firecrawl   (Node 18+)   env: FIRECRAWL_API_KEY, UPROCK_API_KEYimport { Firecrawl, SdkError } from "firecrawl";​const firecrawl = new Firecrawl(); // reads FIRECRAWL_API_KEY​// Firecrawl's basic-proxy countries (docs.firecrawl.dev/features/proxies, checked 19 Oct 2026).const FIRECRAWL_COUNTRIES = new Set(  "AE AT AU BE BR CA CH CN DE DK EG ES FR GB GR IL IN IT JP MX NL PL QA SE TR US".split(    " ",  ),);// Target statuses worth a second try from a real device. 404 and 410 mean the page is gone.const RETRY = new Set([401, 403, 429, 500, 502, 503, 504]);​async function viaUpRock(url: string, country: string) {  // One call: UpRock loads the page on a real device in `country`, tries a fresh device  // every 7 s (up to 3 tries) and returns markdown. Failed calls aren't billed.  const res = await fetch("https://edge.uprock.com/v1/crawl", {    method: "POST",    headers: {      Authorization: `Bearer ${process.env.UPROCK_API_KEY}`,      "Content-Type": "application/json",    },    body: JSON.stringify({ url, country }),    signal: AbortSignal.timeout(90_000),  });  const page = await res.json();  if (!res.ok) throw new Error(`UpRock ${res.status} ${page.code}: ${page.error}`);  return { via: "uprock", markdown: page.markdown ?? "" };}​export async function scrape(url: string, country = "US") {  if (FIRECRAWL_COUNTRIES.has(country)) {    try {      const doc = await firecrawl.scrape(url, {        formats: ["markdown"],        location: { country },      });      const status = doc.metadata?.statusCode ?? 200;      if (!RETRY.has(status)) return { via: "firecrawl", markdown: doc.markdown ?? "" };    } catch (err) {      // Firecrawl answers 403 UNSUPPORTED_SITE for sites it won't scrape. Respect that.      if (        err instanceof SdkError &&        (err.status === 403 || err.code === "UNSUPPORTED_SITE")      )        throw err;      console.warn(`Firecrawl failed (${(err as Error).message}), trying UpRock`);    }  }  return viaUpRock(url, country);}​// node fallback.ts https://developer.mozilla.org/en-US/docs/Web/HTTP KRconst [url = "https://developer.mozilla.org/en-US/docs/Web/HTTP", country = "US"] =  process.argv.slice(2);const page = await scrape(url, country);console.log(page.via, page.markdown.slice(0, 200));

The HTTP versions were tested on 3 Nov 2026 against the live UpRock API, with an invalid Firecrawl key to force the fallback and with KR and ID, which are outside Firecrawl's list; the MCP and CLI versions on 19 Oct 2026. Only send the cases from the table above: a blocked page costs a Firecrawl credit and then an UpRock credit. On 6 Nov 2026 we ran the HTTP and MCP versions again with an UpRock API key in an Authorization header: with an invalid Firecrawl key, each fell back to UpRock and got the page.

If you'd rather not write code

Agents can use both tools side by side over MCP. Add UpRock next to Firecrawl's MCP server:

claude mcp add --transport http uprock https://mcp.uprock.ai/mcp --header "Authorization: Bearer $UPROCK_API_KEY"

Then tell the agent when to use which, for example in CLAUDE.md or AGENTS.md:

Fetching web pages: use Firecrawl first. If a Firecrawl call fails, or the page comes backwith status 401, 403 or 429, or I ask for a country Firecrawl doesn't cover, retry withUpRock's crawl_fetch and pass the country. Don't retry 404s.

Or from a terminal:

curl -s https://edge.uprock.com/v1/crawl \  -H "Authorization: Bearer $UPROCK_API_KEY" -H "Content-Type: application/json" \  -d '{"url": "https://developer.mozilla.org/en-US/docs/Web/HTTP", "country": "KR"}'

FAQ

Does Firecrawl charge for a blocked page?

Yes. Firecrawl's pricing page says a page that responds with an error status such as 403 or 404 is still returned and costs 1 credit, while a scrape that returns no result is not charged. With a fallback, a blocked page costs one Firecrawl credit plus an UpRock credit for the retry.

Can I point the Firecrawl SDK at UpRock by changing the base URL?

Not today. UpRock has its own API, so the fallback on this page calls it directly. It's about 30 lines in each language.

Is UpRock cheaper than Firecrawl?

Per page, yes. A plain markdown page costs $0.50 per 1,000 on UpRock, against $0.60 to $3.80 per 1,000 on Firecrawl's self-serve plans. But Firecrawl's credits also buy crawling, site maps, search and JSON extraction, which UpRock doesn't offer. Most teams that use both keep Firecrawl as the primary.

Why not just use Firecrawl's enhanced proxies?

Use them first. Firecrawl's default proxy setting, auto, already retries a blocked page once on enhanced proxies at no extra charge. UpRock helps with what's left, from a different kind of source (a real device) and in countries outside Firecrawl's list.

Which countries can UpRock fetch from?

63, by ISO country code, or a region (NA, EU, APAC, LATAM, MEA) when any country in it will do. That includes South Korea, Indonesia and Argentina, which aren't on Firecrawl's list. Firecrawl lists 26 countries for basic proxies and 2 for enhanced proxies.

Other use cases to explore

References

Get started

Add UpRock in one paste.

Paste this into Claude Code, Codex, Cursor or any agent with a terminal. It reads our docs, sets up the MCP server or CLI, and tells you the cost before it spends anything.

Set up UpRock for me: read https://uprock.ai/agents.md, connect the UpRock MCP server, and run one test crawl. Tell me what it costs before you spend anything.

How do I add a backup crawler to Firecrawl? | UpRock AI