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

See pricing

Use case · AI visibility

Proxies for AI visibility, market by market.

AI answer engines and search results are localised — by country, by language, sometimes by city, and by whether the request looks like a consumer connection. To measure what someone in Munich, Lyon or Manchester sees, the request has to leave from there: one residential IP per market, held for the whole run. Public, logged-out collection, billed per GB.

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

€2.00
per GB on ARC Fast, excl. VAT
−44%
at 1 TB (€1.12 / GB)
185+
countries, city targeting
Never
expires — bandwidth outlives the reporting cycle

The problem

Why one vantage point is not a measurement

None of these throw an error. The run completes, the report ships, and the numbers describe a place none of the client's customers are in.

One office IP is one sample

A run from your office or a cloud region measures one place, one language default, one set of local sources. Presenting it as the German view is an extrapolation, and a client who checks from Munich will notice the difference.

Datacenter ranges get a different page

Cloud address ranges are public and easy to classify. Many services answer them with a reduced page, a consent wall, a challenge or a rate limit. The stored answer is then one that no consumer was shown. A residential exit gets the page a person on a home connection gets.

The IP decides the language before your headers do

Locale, currency and the pool of local sources are often inferred from the exit address first. Leave from the wrong country and you collect the wrong language, the wrong sources and a different set of competing brands.

The follow-up lands on another IP

A tracking run is several requests: the load, the follow-up, the next page, the cited sources. If the exit rotates between them the service sees several visitors and the follow-up loses its context. A sticky session holds one IP for the run — 30 minutes or 6 hours, your call.

Cities are not countries

Local services, store availability, regional brands and anything phrased as “near me” differ between Munich and Hamburg. A country-level exit averages that away. On the residential pools the city is one more token in the username.

Monthly quotas punish a weekly job

Tracking is bursty: a run per week or per reporting cycle, then nothing. A quota that resets every month bills the idle days. Bandwidth here is bought once and used whenever, so a quarter of runs can come out of one purchase.

Setup

Recommended setup

Run every market on ARC Fast with its own sticky session for the length of the run, and a handle per prompt when prompts in one market run in parallel. Move the few services that fail there to ARC Ultra; add ARC Mobile when the carrier view is the deliverable.

PlanRoleSessionTargetingPrice
ARC Fast
Rotating residential
Default
Residential exits in 185+ countries with city targeting, and the steepest volume ladder we sell. Nearly every visibility run lives here.
Sticky, 30 min per market and runCountry + city
€2.00 / GB
€1.12 at 1 TB (−44%)
ARC Ultra
Premium residential
Escalation
The premium residential pool, for the services where ARC Fast leaves gaps in the grid. It is the priciest of the three rotating pools, so route only those markets or targets through it.
Sticky, per market and runCountry + city
€3.50 / GB
€2.17 at 1 TB (−38%)
ARC Mobile
Mobile 4G/5G
The carrier view
Real 4G/5G carrier IPs, for the answer a consumer on a phone network gets. Exits in 4 countries, endpoints generated for you in the dashboard or over the API — nothing to compose.
Sticky, up to 60 minCountry (DE, GB, US, JP), no city
€3.50 / GB
€3.15 at 1 TB (−10%)
ARC Fast — default
http://USERNAME_pool-arcfast_country-de_city-munich_session-k3f9a1x2_sesstime-30:PASSWORD@proxy.arcproxies.io:8000
ARC Ultra — escalation
http://USERNAME_pool-arcultra_country-gb_city-manchester_session-c8r1t5ya_sesstime-30: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.

Grammar

A tracking run is a username

Every decision about a run — pool, market, city, how long one exit is held — is a token after your subuser. Nothing to register per market and no endpoint to request first.

  1. USERNAME

    Your subuser

    From the dashboard, with its password. The password never changes; only what follows does.

  2. _pool-arcfast

    The pool

    arcfast for ARC Fast, arcultra for ARC Ultra. Moving a market to the other pool is this one token.

  3. _country-de

    The market

    Two-letter country code, lower case. One per market in the run.

  4. _city-munich

    The city

    Name in lower case without spaces. Leave it out for a country-wide view.

  5. _session-k3f9a1x2

    The run

    Any handle you choose. Same handle, same exit IP; a new handle is a new exit.

  6. _sesstime-30

    How long it holds

    Minutes, best effort. Size it to your longest run with a margin.

Joined in this order, the six parts are the username for one market of one run. ARC Mobile has no username grammar — its endpoints are generated for you in the dashboard or with POST /proxies.

Code

One sticky session per market

Each snippet composes the market into the username and keeps the whole run on that exit. Replace USERNAME and PASSWORD with the credentials from your dashboard; everything after USERNAME is targeting.

track.mjs — one context per market
import { chromium } from "playwright";import { appendFile } from "node:fs/promises";import { randomBytes } from "node:crypto";const SERVER = "http://proxy.arcproxies.io:8000";const PAGE = "https://example.com/";   // the public, logged-out page you trackconst MARKETS = [  { cc: "de", city: "munich" },  { cc: "fr", city: "lyon" },  { cc: "gb", city: "manchester" },  { cc: "us", city: "chicago" },];const browser = await chromium.launch();async function runMarket(m) {  // One handle per market and run. Reuse it to come back to the same exit.  const session = randomBytes(4).toString("hex");  // One context = one market = one residential exit, held for 30 minutes.  const context = await browser.newContext({    proxy: {      server: SERVER,      username: `USERNAME_pool-arcfast_country-${m.cc}_city-${m.city}_session-${session}_sesstime-30`,      password: "PASSWORD",    },  });  // The answer is text. Images, fonts and media are only bandwidth.  await context.route("**/*", (route) =>    ["image", "font", "media"].includes(route.request().resourceType())      ? route.abort()      : route.continue()  );  const page = await context.newPage();  // Record where this session actually exits, before collecting anything.  const exit = await (await page.goto("https://ipinfo.io/json")).json();  await page.goto(PAGE);  // …the follow-up, the next page: same context, same exit IP.  const html = await page.content();  await appendFile("runs.jsonl", JSON.stringify({    market: m,    session,    exitIp: exit.ip,    exitCountry: exit.country,               // "DE"    exitCity: exit.city,    inMarket: exit.country?.toLowerCase() === m.cc,    collectedAt: new Date().toISOString(),    html,  }) + "\n");  await context.close();}await Promise.all(MARKETS.map(runMarket));    // every market at onceawait browser.close();

Per-context proxies let one browser hold every market at once: newContext({ proxy: { server, username, password } }); Python is the same object on browser.new_context(proxy=…). Routing turns off Playwright's HTTP cache, so measure a run with and without the image block before you pick one.

Before you ship

  • One _session- handle per market per run, or per prompt when prompts run in parallel. Mint new handles each run unless you want the same exits back.
  • Store the target market, the exit IP and its country with every answer. A result without its origin is an anecdote, not a measurement.
  • Collect logged out. No accounts, no cookies carried across markets, and stay inside each service's terms.
  • Block images, fonts and media when you render. The answer is text; the rest is bandwidth.
  • Buy for the quarter, not the month. Bandwidth never expires, and the ladder rewards one bigger purchase.

For a one-off check, the dashboard generator builds the same strings without code — country, city, session length. API reference for the rest.

Works with anything that takes a proxy URL

  • Playwright
  • Python requests / httpx
  • Node.js
  • n8n
  • curl
  • Puppeteer
  • Crawlee

Illustration

What tracking 500 prompts in 8 markets every week costs

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

Assumptions

Prompts tracked
500
Markets per prompt
8
Runs per prompt and market, per week
1
Weeks per month
4.33 (52 ÷ 12)
Page weight per run, images and fonts blocked
3 MB
Bandwidth per month
≈ 52 GB

On ARC Fast

€87.36per month, excl. VAT

52 GB bought in one purchase at €1.68 / GB (−16% volume rung, applied automatically).

The same 52 GB on ARC Ultra: €156.52 at €3.01 / GB. Route only the jobs that need it through the pricier pool.

That is about €0.005 per prompt, market and run. Because bandwidth never expires, a quarter can be one purchase: 156 GB at €1.36 / GB is €212.16, against €262.08 for three monthly purchases. Measure the 3 MB on a week of your own runs before you size anything — a plain HTML fetch is a fraction of it, a page with images left on several times it.

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

FAQ

Visibility questions

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

Get started

Measure AI answers from inside every market you track.

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.