Compare

How do I add a backup to Oxylabs' new Web API?

Keep Oxylabs for scale and send UpRock the requests its Web API gives up on, like a timeout, a rate limit or a 500 after its own retries, which Oxylabs doesn't charge for. Respect the rest, because a 400 can mean a restricted target and a 403 means your plan can't use it.

Updated · Read as markdown

What Oxylabs does well

Oxylabs is one of the largest proxy and web data providers, claiming 177 million IPs across 195 locations. On 7 October 2026 it launched a new Web API, with /scrape and /search endpoints behind one Bearer key and one shared balance across all its products; the older Web Scraper API is now "Classic". The new /scrape handles rendering, proxy rotation and access challenges and returns markdown, HTML, AI-parsed JSON or screenshots. Around it: residential and datacenter proxies, Web Unblocker, AI Studio tools, OxyCopilot for building parsers, a free scheduler on Classic, and MCP servers for both APIs.

For large, long-running data jobs with an account team behind them, Oxylabs is built for it. Keep it.

What a generic page costs now

Oxylabs' new pricing page leads with "/Scrape from $0.50/1K results". That figure is the Amazon row. For any other site ("custom domain scraping"), these are the prices per 1,000 pages, checked 21 Oct 2026:

PlanMonthlyWithout JavaScriptWith JavaScript
Free$5 of welcome credit$1.00$1.50
Starter$30$1.00$1.50
Basic$100$0.90$1.40
Flexible$500$0.80$1.30
Enterprisefrom $2,500$0.75$1.22
UpRockprepaid credits$0.50$0.50

AI parsing adds $3 per 1,000 parsed pages. Unused balance expires at the end of each billing cycle, the service pauses when the balance runs out, and self-service purchases are non-refundable.

Reading a Web API failure

The new Web API doesn't return the target page's own status code. It answers with its own HTTP status, and its docs say which ones are worth retrying:

Oxylabs statusWhat it meansWhat to do
200, with results[0].markdownIt got the pageUse it
408The realtime request timed outSend to UpRock
429Rate limit, or your balance ran outSend to UpRock
500 (state: faulted)It failed after too many retries; not chargedSend to UpRock
503The service is unavailableSend to UpRock
401A missing or invalid keyFix the key (the code sends it to UpRock meanwhile)
400A bad request body, or a restricted targetRespect it: fix the request, or leave the target alone
403Your plan isn't entitled to this target or sourceRespect it

Oxylabs and UpRock side by side

OxylabsUpRock
Price per 1,000 generic pages$0.75 to $1.50 (table above)$0.50 by card or USDC, $0.40 with UPT
Failed requestsNot charged (faulted); the docs don't say about requests you give up onNot documented yet
Residential proxies$6 to $2.50 per GBIncluded: every page is one credit
Where requests come fromResidential IPs mostly from providers such as Honeygain, whose users consent and are paidDevices whose owners opted in
Countries195 locations claimed; country code on the Web API, city and coordinates for some Classic sources63, or a region
Who can sign upEveryone answers a KYC questionnaire; a quarter or more of enquiries are rejectedAnyone with an API key
Search, parsing, schedulingYesNo. One page per call
MCP serverFor the Web API (self-hosted) and a hosted one for ClassicYes, remote (streamable HTTP)
VideoYouTube, TikTok and Bilibili downloads and metadata ($2 per GB)Search public video by moment, $1 per 1,000 searches

Where Oxylabs is better: scale and coverage, finer location targeting on some sources, search and parsing in the same API, and a large company behind it. Where UpRock fits: the requests the Web API gives up on, a lower price per generic page, no KYC, and searching inside video rather than downloading it.

The fallback, in TypeScript and Python

Every version call webapi.oxylabs.io/v1/scrape for markdown with JavaScript in the country you pass, with the 150-second timeout Oxylabs suggests. A 200 with markdown is used; 408, 429, 500 and 503 (and 401, so a bad key doesn't stop your agent) go to UpRock; 400, 403 and 404 raise an error. They call the HTTP API directly, because Oxylabs' Python SDK covers only the Classic API and there's no official Node SDK. 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: OXYLABS_WEB_API_KEY, UPROCK_API_KEY// Oxylabs Web API (launched 7 Oct 2026). There's no official Node SDK for it, so this calls// the HTTP API directly.​// Statuses worth sending to a second network: Oxylabs timed out (408), you hit a rate limit// or ran out of balance (429), it gave up after its own retries (500, not charged), or it's// unavailable (503). 401 means a bad key; a fallback keeps your agent working meanwhile.// 400 (bad request, or a restricted target), 403 (your plan can't use this target) and// 404 (unknown route) are answers: don't route around them.const TRY_UPROCK = new Set([401, 408, 429, 500, 503]);​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") {  try {    const res = await fetch("https://webapi.oxylabs.io/v1/scrape", {      method: "POST",      headers: {        Authorization: `Bearer ${process.env.OXYLABS_WEB_API_KEY}`,        "Content-Type": "application/json",      },      body: JSON.stringify({        url,        output: ["markdown"],        location: country,        run_js: true,      }),      signal: AbortSignal.timeout(150_000), // Oxylabs suggests 150 s    });    if (res.ok) {      const markdown = (await res.json()).results?.[0]?.markdown;      if (markdown) return { via: "oxylabs", markdown };      console.warn("Oxylabs returned no markdown; trying UpRock");    } else if (TRY_UPROCK.has(res.status)) {      console.warn(`Oxylabs ${res.status}; trying UpRock`);    } else {      throw new Error(`Oxylabs ${res.status}: ${(await res.text()).slice(0, 200)}`);    }  } catch (err) {    if ((err as Error).message.startsWith("Oxylabs ")) throw err;    console.warn(      `Oxylabs unreachable or timed out (${(err as Error).message}); 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 against the live UpRock API with an invalid Oxylabs key: the Web API answered 401 with an empty body, as its docs describe, and both versions fell back to UpRock. Without an account, the routing of the other statuses follows Oxylabs' error catalog. On 6 Nov 2026 we ran the HTTP and MCP versions again with an UpRock API key in an Authorization header: with an invalid Oxylabs key, each fell back to UpRock and got the page.

FAQ

What does Oxylabs charge for an ordinary web page?

On its new Web API, a generic page ("custom domain scraping") costs $1.00 per 1,000 without JavaScript and $1.50 with it on the Starter plan, down to $0.75 and $1.22 on Enterprise. The "from $0.50 per 1,000" headline on its pricing page matches the Amazon rows, not generic pages.

Does Oxylabs charge for failed requests?

Not on the new Web API, whose docs say faulted scrapes don't consume quota. Its docs don't say whether a request you give up on yourself is billed, so give it the 150 seconds Oxylabs suggests rather than a short timeout.

Aren't Oxylabs' residential IPs also people's devices?

Yes. Oxylabs' handbook says most of its pool comes from providers such as Honeygain, whose users consent and are paid. UpRock's devices also belong to people who opted in and earn UPT. They're separate networks, which is what makes one a backup for the other.

Can anyone sign up for Oxylabs?

Oxylabs says every customer answers a KYC questionnaire and that at least a quarter of enquiries are rejected. Some targets are restricted and answer 400, and some open up after a short KYC. UpRock needs only an API key and fetches public pages only.

Which country options does each offer?

Oxylabs claims IPs in 195 locations; its new Web API takes a two-letter country code, and the Classic API also takes cities, states and coordinates for some sources. UpRock covers 63 countries, or a region.

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 Oxylabs' new Web API? | UpRock AI