15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

Use case · Web scraping

Proxies for web scraping and data teams.

Self-serve: no sales call, no company-only onboarding, no plan that voids unused traffic at the end of the month. Buy gigabytes once, point Scrapy, requests, Crawlee or Playwright at one proxy URL, and move a domain from the ISP pool to a residential one by changing a single token.

Pay per GB · No subscription · Prices in EUR, excl. VAT

Illustration — fictional domains. Plan names and list prices per GB are the live catalog, excl. VAT.
€0.75
per GB on ARC Basic, excl. VAT
−21%
at 1 TB (€0.59 / GB)
185+
countries, city targeting
Never
expires — no subscription

The problem

Why crawls get expensive, or come back short

None of these are exotic. They are why a crawl that ran fine for a week starts costing more, returning less, or both.

Residential rates for pages that don't need them

Most of a crawl is HTML from sites that serve any well-behaved client. Paying residential rates for those pages is usually the biggest line on the bill. The ISP pool fetches them at €0.75 / GB; move a domain up only when it asks for it.

One rate limit stalls the run

When every request leaves from the same few addresses, a 429 on one domain holds up everything waiting behind it. A rotating pool spreads a domain's requests over many exits, and a backoff keeps you from burning through them.

Page 2 doesn't match page 1

Paginated listings, search results and filters often keep a cursor on the server and expect one visitor. Rotate the IP between pages and the ordering shifts, items repeat or the cursor dies. A sticky handle holds one exit for the whole walk.

A browser fetches megabytes to read kilobytes

A rendered page pulls scripts, styles, images, fonts and third-party tags, and none of them are the data — but all of them go through the proxy. Fetch the HTML directly where you can, and block the heavy resource types where you can't.

Retries that never back off

A 429 retried immediately usually earns another 429, and every attempt costs bytes. Back off exponentially, honour Retry-After, and move to the next pool on the retry rather than on the first request.

Locked out of the provider you'd pick

Some providers now onboard verified companies only, have dropped pay-as-you-go, or void unused bandwidth at the end of a cycle. A freelancer or a three-person team should not need a call to buy 20 GB.

Setup

Choose the pool per domain

Start every domain on ARC Basic. Move a domain up one rung when it asks for it — not the whole crawl. The ladder is a dictionary in your middleware, not a plan you commit to.

PlanRoleSessionTargetingPrice
ARC Basic
Rotating ISP
Default for every domain
A rotating ISP pool at our lowest price per GB. High-volume HTML from lightly protected sites lives here, and that is most of a crawl.
RotatingCountry
€0.75 / GB
€0.59 at 1 TB (−21%)
ARC Fast
Rotating residential
When a domain gets rate-limited
Residential exits. Move a domain here once its 429s outrun your backoff on ARC Basic. Give every paginated walk its own sticky handle.
Rotating, or sticky per listingCountry, optionally city
€2.00 / GB
€1.12 at 1 TB (−44%)
ARC Ultra
Premium residential
When success rate beats price
Premium residential, for the few domains where a failed page costs you more than the price difference. It is the priciest of the three rotating pools, so route only those domains through it.
Sticky per listingCountry + city
€3.50 / GB
€2.17 at 1 TB (−38%)
ARC Basic — default for every domain
http://USERNAME_pool-arc_country-de:PASSWORD@proxy.arcproxies.io:8000
ARC Fast — when a domain gets rate-limited
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000
ARC Ultra — when success rate beats price
http://USERNAME_pool-arcultra_country-de_city-berlin_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Prices are list prices in EUR, excl. VAT. Volume discounts apply automatically at checkout — full ladder on the pricing page.

Sessions

Rotate for sweeps. Stick for anything with a cursor.

Both come from the same credentials. The difference is whether the username carries a handle — and the handle is yours to choose.

Rotating — no handle
Each new connection can get a different exit IP. Sitemap walks, detail pages by ID, anything where one request stands alone.
Sticky per listing
Add _session- with a fresh handle when a walk starts and pass it to every page of that walk. Set _sesstime- (minutes) longer than the walk.
Sticky per worker
One handle for a worker's whole run, when a short sequence of pages has to look like one visitor from start to finish.

Two workers, 12 requests each

worker-1
k3f9a1x2p4d8w1seh6c0n3ybAAAABBBBCCCC
worker-2
r2v7k5qam9t1f4zuDDDDDDEEEEEE

A new handle for every listing. All pages of one listing leave from the same exit; the next listing gets a new handle and a new IP. Right for pagination, sorted results and filters — anything with a cursor.

Letters stand for distinct exit IPs. Holding is best effort: an exit can go offline before its minutes are up, so a walk should tolerate a changed IP.

worker-1, first listing · ARC Fast
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Bandwidth

Billed per gigabyte, so fetch fewer of them.

Four habits move the bill more than the choice of pool does. The table puts illustrative numbers on them.

  • Fetch the HTML, don't render it. A browser is for pages that build their content in JavaScript; for everything else an HTTP client gets the same document for a fraction of the bytes.
  • When you do render, block images, fonts and media. It is one route handler — the Playwright and Puppeteer tabs below have it.
  • Keep compression on. Scrapy, requests, httpx and Go ask for it by default; curl needs --compressed. Stripping Accept-Encoding multiplies the bytes for nothing.
  • Retry with backoff, honour Retry-After, and climb a pool on the retry rather than on the first request. Every attempt is bytes you pay for.
  • Headless browser, nothing blocked
    Scripts, styles, images, fonts, media and third-party tags — every byte of it through the proxy.
    2.5 GB / 1,000 pages
    Per page
    2.5 MB per page
    ARC Basic
    €1.88
    ARC Fast
    €5.00
  • Headless browser, images, fonts and media blocked
    One route handler. The page still renders; the bytes that carry no data are never requested.
    0.80 GB / 1,000 pages
    Per page
    800 KB per page
    ARC Basic
    €0.60
    ARC Fast
    €1.60
  • HTML over plain HTTP, uncompressed
    requests, httpx, Scrapy, Go — the document only, with compression turned off.
    0.30 GB / 1,000 pages
    Per page
    300 KB per page
    ARC Basic
    €0.22
    ARC Fast
    €0.60
  • HTML over plain HTTP, gzip or brotli
    The same document, compressed. Scrapy, requests, httpx, Go and Crawlee ask for it by default; curl needs --compressed.
    0.06 GB / 1,000 pages
    Per page
    60 KB per page
    ARC Basic
    €0.05
    ARC Fast
    €0.12

Page weights are illustrative averages — measure yours per domain for a day. Euro figures are list prices per 1,000 pages, excl. VAT, before the volume ladder. Retries multiply every row: at a 10% retry rate, 1,000 pages is 1,100 fetches, and a retry sent without backoff usually fails again.

Code

One snippet per tool

Each one uses the tool's documented proxy option. Replace USERNAME and PASSWORD with the credentials from your dashboard; everything after USERNAME is targeting.

middlewares.py · spider · settings.py
# middlewares.py — a pool per domain, one rung up per retry, a handle per listingfrom urllib.parse import urlsplitLADDER = [                                # lowest price per GB first    "USERNAME_pool-arc_country-de",       # ARC Basic  €0.75 / GB    "USERNAME_pool-arcfast_country-de",   # ARC Fast   €2.00 / GB    "USERNAME_pool-arcultra_country-de",  # ARC Ultra  €3.50 / GB]START_RUNG = {"listings.example": 1}  # domains that skip ARC Basicclass ArcPoolMiddleware:    def process_request(self, request, spider):        host = urlsplit(request.url).hostname        rung = START_RUNG.get(host, 0) + request.meta.get("retry_times", 0)        user = LADDER[min(rung, len(LADDER) - 1)]        if handle := request.meta.get("arc_session"):   # same handle, same exit            user += f"_session-{handle}_sesstime-10"        request.meta["proxy"] = f"http://{user}:PASSWORD@proxy.arcproxies.io:8000"# spider — start each listing with meta={"arc_session": secrets.token_hex(4)},# then hand the same handle to every page of itdef parse_listing(self, response):    yield from self.parse_items(response)    if next_page := response.css("a[rel=next]::attr(href)").get():        yield response.follow(next_page, self.parse_listing,                              meta={"arc_session": response.meta["arc_session"]})# settings.pyDOWNLOADER_MIDDLEWARES = {"myproject.middlewares.ArcPoolMiddleware": 740}RETRY_TIMES = 2              # at most two climbs; 429 is already a retry codeAUTOTHROTTLE_ENABLED = True  # error responses can only lengthen the delay

The middleware runs before HttpProxyMiddleware (750), which replaces the Proxy-Authorization header whenever meta.proxy changes — so a retry can climb a rung cleanly. RetryMiddleware counts retry_times for you and already retries 429. AutoThrottle paces each domain by its latency, and error responses can only lengthen that delay, never shorten it.

Before you scale

  • Set the pool per domain in one place — a middleware or a proxy configuration — so moving a domain is a one-line change.
  • One handle per paginated walk; reuse it to return to the same exit.
  • Measure GB per 1,000 pages per domain for a day before you size a purchase.
  • Generate endpoints over the API once per run, not once per request. The limit is per key.
  • Keep the password and the API key in environment variables, not in the repo.

The whole API in one file: api.arcproxy.cloud/api/v1/llms.txt, generated from the live catalog.

Second provider

Run it next to what you already have.

Nothing here asks you to migrate. There is no commitment and no term, and the gigabytes you don't use this month are still there next month.

Failover

Keep your current provider on the first rung and put ARC on the next. Scrapy's retry_times climbs the ladder request by request; Crawlee's tieredProxyUrls does it per hostname and keeps probing the cheaper tier, so the failover only spends bandwidth while it is carrying traffic.

Split by domain

The domains that fetch fine from an ISP exit go to ARC Basic at €0.75 / GB and stop paying residential rates. The rest stay where they are. One dictionary entry per domain, one deploy, nothing migrated.

Canary

Send a fixed share of one domain through ARC for a week and compare success rate and GB per 1,000 pages with what you have. ARC Starter is 3 GB — 1 GB of each rotating pool — for €4.90, once per account.

Same line format as your list

The API returns lines as http://user:pass@host:port, host:port:user:pass or user:pass:host:port, over HTTP or SOCKS5 — whichever your rotation list already reads. Append them; nothing else changes.

Works with anything that takes a proxy URL

  • Scrapy
  • Python requests / httpx
  • Crawlee
  • Playwright
  • Puppeteer
  • Selenium
  • Node.js
  • Apify actors
  • Go net/http
  • curl

Illustration

What a million HTML pages a month costs

An illustration with round numbers — your pages, payloads and retry rate will differ. The arithmetic is the real price ladder.

Assumptions

Pages per month
1,000,000
Average page, compressed HTML
60 KB
Retries, with backoff
+10%
Bandwidth per month
≈ 66 GB

On ARC Basic

€47.52per month, excl. VAT

66 GB bought in one purchase at €0.72 / GB (−4% volume rung, applied automatically).

The same 66 GB on ARC Fast: €105.60 at €1.60 / GB. Route only the jobs that need it through the pricier pool.

Compressed HTML over a plain HTTP client is the lightest thing you can fetch. Render the same pages in a browser with nothing blocked and, on the table's illustrative weights, the bandwidth is about 42 times as much — check that before you pick a tool, not after.

Bandwidth never expires, so a bigger single purchase is only ever cheaper per GB. See the ladder.

FAQ

Scraper questions

Something not covered? Write to contact@arcproxies.io.

Get started

Add a second provider in one deploy.

Create an account, and code WELCOME15 takes 15% off your first bandwidth purchase, up to 25 GB. No subscription, no sales call, and the gigabytes never expire.