Compare

How do I add a backup to Bright Data's Web Unlocker?

Keep Bright Data as your primary and send UpRock the requests its Web Unlocker gives up on, like a site that keeps refusing, a page that never finishes loading or a target Bright Data has throttled. UpRock loads the page on an opted-in device in the country you pick for $0.50 per 1,000 pages, and the fallback leaves alone what Bright Data refuses on purpose, such as pages a site's robots.txt rules out.

Updated · Read as markdown

What Bright Data does well

Bright Data is one of the largest web data companies there is. It sells proxy networks (it claims over 400 million residential IPs in 195 countries), Web Unlocker for single pages, a SERP API for Google, Bing and other engines, a Browser API that works with Playwright and Puppeteer, a catalog of ready-made scrapers, and datasets you can buy outright. It's ISO 27001 and SOC 2 Type II certified, offers an uptime SLA and round-the-clock support, and has an official MCP server with 5,000 free requests a month.

If you run large jobs, need a city or ASN, or have compliance teams who want certificates, Bright Data is built for that. Keep it.

Two networks of opted-in devices

It's worth being clear about what's different, because it's less than you might expect. Bright Data's residential IPs come from consumer devices: app owners add Bright Data's SDK to their apps, and users opt in in exchange for an ad-free or upgraded app. UpRock also runs on devices whose owners opted in, by installing the UpRock app or node and earning UPT for the work their device does.

So the case for a backup isn't "real devices versus proxies". It's these:

  • A second, independent network. When Web Unlocker gives up on a page, the same request through UpRock goes out through different devices and different software.
  • Who can buy. Web Unlocker needs no verification but honors robots.txt in that mode. Residential proxies are for verified companies only, and Bright Data's docs say personal email addresses can't be approved. UpRock needs an API key.
  • One price per page. $0.50 per 1,000 pages by card or USDC, $0.40 with UPT, without plans or minimum spends.

Reading a Web Unlocker failure

Through the Direct API, the HTTP response is 200 OK as soon as the request reaches the unlocker. What happened to your page is in the headers: x-brd-error with a message, x-brd-error-code with a code, and x-brd-status-code with the result status. Code that checks only the HTTP status misses every failure.

Bright Data's own docs sort the codes into ones that clear on a retry and ones that don't. Here's how we'd route each:

x-brd-error-codeWhat Bright Data says it meansWhat to do
reject_block, resolve_failed_*A CAPTCHA or protection page came back instead of the contentRetry on Bright Data first (each attempt uses a different peer), then UpRock
http_statusThe site answered with a blocking status, including its own 429Send to UpRock
navigation_timeout, domcontentloaded_event_timeout, expect_elementThe page didn't finish loading, or an element the unlocker waits for never appearedSend to UpRock
document_load_failedNavigation failed before a page arrivedSend to UpRock (unless it's a TLS error, see below)
sr_rate_limit (HTTP 429)Bright Data throttled this target after its success rate fellSend to UpRock
ub_bad_endpoint_robotsThe site's robots.txt disallows the path in no-verification modeRespect it
net_err_cert_*The site's TLS certificate is expired or doesn't matchDon't retry: every client sees the same
403, no codeThe target is blocked by Bright Data policy (for example government or adult sites)Respect it
Outer 401 or 400A bad API key, zone name or request bodyFix the request

Bright Data and UpRock side by side

Bright Data numbers come from its pricing pages and docs, checked 21 Oct 2026.

Bright DataUpRock
Price per 1,000 pagesWeb Unlocker: $1.50 pay-as-you-go; $1.30, $1.10 and $1.00 on the $499, $999 and $1,999 monthly plans$0.50 by card or USDC, $0.40 with UPT
Residential proxies$4 to $8 per GB pay-as-you-go (the page shows a 50% promotion), down to $2.50 on plansIncluded: every page is one credit
To try it5,000 requests a month at no costPrepaid credits
Who can buyWeb Unlocker: anyone. Residential: verified companies onlyAnyone with an API key
Where requests come fromResidential IPs from opted-in app users, plus datacenter, ISP and mobile poolsDevices whose owners opted in
Countries195 for residential; city, state, ZIP and ASN on residential63, or a region
Search, scrapers, datasets, browserYes: SERP API, ready-made scrapers, datasets, Browser APINo. One page per call
MCP serverOfficial, remote or local, 32 toolsYes, remote (streamable HTTP)
VideoVideo Search API in beta, behind a KYC review, price not publishedSearch public video by moment, $1 per 1,000 searches
Certifications, SLAISO 27001, SOC 2 Type II, uptime SLANot published

Where Bright Data is better: coverage, scale, targeting below the country level, a full product range, certifications and support, and a monthly allowance to try it. Where UpRock fits: a second, independent network when Web Unlocker gives up, one flat price per page, no company verification, and video search you can use today.

The fallback, in TypeScript and Python

Every version call Web Unlocker's Direct API for markdown, read the error headers, retry once on Bright Data for the codes it calls retryable, and send the rest of the routable failures to UpRock. Anything Bright Data refuses on purpose raises an error instead. UpRock gets one POST /v1/crawl request with your key in an Authorization: Bearer header; the MCP and CLI tabs do the same through UpRock's MCP server (TypeScript) or CLI (Python).

// Node 18+   env: BRIGHTDATA_API_KEY, BRIGHTDATA_ZONE, UPROCK_API_KEY​// Web Unlocker error codes (docs.brightdata.com, error codes, checked 21 Oct 2026).// Bright Data says these clear on a retry, since each attempt uses a different peer.const RETRY_ON_BRIGHT_DATA = /^(reject_block|resolve_failed_.*)$/;// The site refused, timed out or never loaded, or Bright Data throttled the target.const TRY_UPROCK = new Set([  "http_status",  "navigation_timeout",  "domcontentloaded_event_timeout",  "expect_element",  "document_load_failed",  "sr_rate_limit",]);// Everything else, including ub_bad_endpoint_robots (the site's robots.txt says no),// policy blocks and broken TLS certificates, is an answer: don't route around it.​async function viaBrightData(url: string, country: string) {  const res = await fetch("https://api.brightdata.com/request", {    method: "POST",    headers: {      Authorization: `Bearer ${process.env.BRIGHTDATA_API_KEY}`,      "Content-Type": "application/json",    },    body: JSON.stringify({      zone: process.env.BRIGHTDATA_ZONE, // your Web Unlocker zone      url,      format: "raw",      data_format: "markdown",      country: country.toLowerCase(),    }),    signal: AbortSignal.timeout(180_000), // Bright Data asks for at least 180 s  });  const code = res.headers.get("x-brd-error-code") ?? res.headers.get("x-brd-err-code");  const error = res.headers.get("x-brd-error");  // The outer status is 200 once the request reaches the unlocker; 401 and 400 mean a bad key,  // zone or request body, with no x-brd headers.  if (!res.ok)    return {      error: `HTTP ${res.status}: ${await res.text()}`,      code: "request_rejected",    };  if (error) return { error, code: code ?? "unknown" };  return { markdown: await res.text() };}​async function viaUpRock(url: string, country: string) {  // One call: UpRock loads the page on a real device in that 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 page.markdown ?? "";}​export async function read(url: string, country = "US") {  let result = await viaBrightData(url, country);  if (result.code && RETRY_ON_BRIGHT_DATA.test(result.code))    result = await viaBrightData(url, country);  if (result.markdown !== undefined)    return { via: "brightdata", markdown: result.markdown };​  const { code, error } = result;  if (    !TRY_UPROCK.has(code ?? "") &&    !RETRY_ON_BRIGHT_DATA.test(code ?? "") &&    code !== "request_rejected"  ) {    throw new Error(`Bright Data: ${error} (${code})`);  }  console.warn(`Bright Data: ${error} (${code}); trying UpRock`);  return { via: "uprock", markdown: await viaUpRock(url, country) };}​// node read.ts https://developer.mozilla.org/en-US/docs/Web/HTTP DEconst [url = "https://developer.mozilla.org/en-US/docs/Web/HTTP", country = "US"] =  process.argv.slice(2);const page = await read(url, country);console.log(page.via, page.markdown.slice(0, 200));

Tested 21 Oct 2026 with an invalid Bright Data key: the API answered with the documented 401 Invalid token, and both versions fell back to UpRock. Without an account, the error-code routing follows Bright Data's published catalog rather than live failures. On 6 Nov 2026 we ran the HTTP and MCP versions again with an UpRock API key in an Authorization header: with an invalid Bright Data key, each fell back to UpRock and got the page.

FAQ

Doesn't Bright Data also use real people's devices?

For its residential proxies, yes. Bright Data says app owners add its SDK to their apps and users opt in, in exchange for an ad-free or upgraded app. UpRock's devices also belong to people who opted in, by installing the UpRock app or node and earning UPT for the work. The two are separate networks, which is the point of a backup.

Does Bright Data charge for a failed request?

Web Unlocker's pay-as-you-go price is "pay only for success", according to its pricing page. A fallback to UpRock adds one UpRock credit for the retry.

Should I retry a page Bright Data blocks for robots.txt?

No. The ub_bad_endpoint_robots error means the site's robots.txt disallows that path for Bright Data's no-verification mode. Treat it as the site's answer. UpRock fetches public pages only, and the fallback on this page leaves that error alone.

Which one covers more countries?

Bright Data, by a wide margin. It lists 195 countries for residential IPs; UpRock covers 63, plus regions such as EU or APAC.

Can I use Bright Data without verifying a company?

Web Unlocker, yes, with robots.txt honored in that mode. Residential proxies, no. Bright Data's docs say residential access is for verified companies only, with no self-serve path, and personal email addresses can't be approved. UpRock needs only an API key.

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 to Bright Data's Web Unlocker? | UpRock AI