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
http://USERNAME{_pool-arc | _pool-arcfast | _pool-arcultra}
One gateway, one set of credentials. Moving a domain up a rail is one token in its username.
- €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.
| Plan | Role | Session | Targeting | Price |
|---|---|---|---|---|
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. | Rotating | Country | €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 listing | Country, 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 listing | Country + city | €3.50 / GB €2.17 at 1 TB (−38%) |
http://USERNAME _pool-arc _country-de:PASSWORD@ proxy.arcproxies.io:8000http://USERNAME _pool-arcfast _country-de _session-k3f9a1x2 _sesstime-10:PASSWORD@ proxy.arcproxies.io:8000http://USERNAME _pool-arcultra _country-de _city-berlin _session-k3f9a1x2 _sesstime-10:PASSWORD@ proxy.arcproxies.io:8000Prices 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
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.
http://USERNAME _pool-arcfast _country-de _session-k3f9a1x2 _sesstime-10:PASSWORD@ proxy.arcproxies.io:8000Bandwidth
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. StrippingAccept-Encodingmultiplies 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.
| How the page is fetched | Per page | Per 1,000 pages | ARC Basic | ARC Fast |
|---|---|---|---|---|
Headless browser, nothing blocked Scripts, styles, images, fonts, media and third-party tags — every byte of it through the proxy. | 2.5 MB | 2.5 GB | €1.88 | €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. | 800 KB | 0.80 GB | €0.60 | €1.60 |
HTML over plain HTTP, uncompressed requests, httpx, Scrapy, Go — the document only, with compression turned off. | 300 KB | 0.30 GB | €0.22 | €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. | 60 KB | 0.06 GB 42× smaller than a full render | €0.05 | €0.12 |
- Headless browser, nothing blockedScripts, 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 blockedOne 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, uncompressedrequests, 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 brotliThe 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 — 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 delayThe 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.
Related
Other things people route through ARC
AI training data
Collect public web text, images and product data at corpus scale from residential and ISP IPs, paid per gigabyte with no monthly commitment.
Read moreAlternative data
Turn public listings, pricing and hiring signals into a time series your models can trade on — collected on schedule, from the market you are modelling.
Read moreReal estate & jobs
Listings and postings are ranked by where the visitor is. Collect them city by city so your index reflects the market, not your server's location.
Read morePrice monitoring
See the price a shopper in Berlin, Lyon or Chicago sees. ISP bandwidth at our lowest price per GB for HTML checks, residential where a marketplace is strict.
Read more