Ad verification · Real carrier IPs

Mobile proxies for ad verification

Ad servers do not treat all traffic alike. A request from a cloud IP is frequently answered with a house ad, a blank slot, or a different creative than the one a paying subscriber receives — which means a verification run from your own infrastructure is measuring the wrong thing. Checking from a real carrier IP in the market you bought inventory in gives you the delivery a real user actually saw.

Start with $2 free creditSee pricingNo subscription · pay per GB

The problem: your verification traffic is being profiled

Programmatic supply chains fingerprint the requesting IP before they decide what to return. Datacentre ranges are published and widely blocklisted as invalid traffic, so the exchange either withholds a bid, serves a default, or silently downgrades what it hands back. The result is a verification pipeline that reports "creative did not render" for placements that render perfectly for real users, and misses the cases where a publisher genuinely did swap the creative. Neither error is visible from inside the report — both look like data.

You will recognise this if

  • Your DSP reports delivery that your own crawler cannot reproduce.
  • A misplacement complaint from a client that you cannot reproduce from the office.
  • Geo-targeted campaigns that appear to serve the wrong country when you check them, but only when you check them.
  • Blank slots or house ads on every scripted visit, and correct creatives on a phone.
  • No way to evidence domain spoofing or creative swapping when you suspect it.

Working code

Every block below runs as written once PROXY_URL holds a real connection string. Copy yours from the dashboard after your first top-up.

Set the connection URL

bash
export PROXY_URL="http://USERNAME-mbl-us-sid-check01-rot-auto10:[email protected]:7000"

# Copy your exact URL from the dashboard — USERNAME and PAK_KEY are yours.
# The -sid- token picks a device; vary it per check (see rotation, below).

Playwright — render the placement and capture it

javascript
import { chromium } from 'playwright';

const url = new URL(process.env.PROXY_URL);

const browser = await chromium.launch({
  proxy: {
    server: `http://${url.host}`,
    username: decodeURIComponent(url.username),
    password: decodeURIComponent(url.password),
  },
});

const page = await browser.newPage({
  viewport: { width: 390, height: 844 },   // iPhone-class viewport
  isMobile: true,
  deviceScaleFactor: 3,
});

// Record every ad request the page makes, so you can evidence what served.
const adCalls = [];
page.on('request', (r) => {
  if (/doubleclick|googlesyndication|adnxs|criteo|rubiconproject/.test(r.url())) {
    adCalls.push({ url: r.url(), type: r.resourceType() });
  }
});

await page.goto('https://publisher.example/article', { waitUntil: 'networkidle' });
await page.screenshot({ path: 'placement.png', fullPage: false });

console.log(`exit IP served ${adCalls.length} ad calls`);
console.table(adCalls.slice(0, 10));

await browser.close();

The screenshot is your evidence artifact; adCalls is the audit trail of which exchanges actually bid.

Python — confirm the exit IP before you trust a run

python
import os, requests

proxy = os.environ["PROXY_URL"]
proxies = {"http": proxy, "https": proxy}

# Always assert geo before a verification sweep. A run from the wrong
# country is worse than no run — it looks like a delivery failure.
who = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=30).json()
assert who["country"] == "US", f"expected US exit, got {who['country']}"
print(f"verifying from {who['city']}, {who['org']}")

Cheap, and it turns a whole class of silent false negatives into a loud assertion.

Which rotation mode to use

Recommended-rot-auto10

Ad servers apply frequency capping per user. The second and third impression request from one IP is deliberately answered differently from the first, so a tight loop against a single exit measures the cap, not the campaign. auto10 moves you to a fresh carrier IP roughly every ten minutes, which matches a realistic checking cadence. For a sweep that needs many distinct viewers in a short window, give each check its own -sid- value: reconnecting under a different session id lands you on a different device, so consecutive checks are not answered from the same handset.

When to choose something else

ModeUse it when
stickyYou need to complete a multi-step landing page funnel — click through, form fill, conversion pixel — without the IP changing mid-journey and breaking attribution.
auto30Long unattended monitoring where a slower churn is fine and you would rather not burn through distinct IPs.
noneRarely useful here. Without a rotation directive you inherit the gateway default, which makes your sampling pattern hard to reason about.

Expected bandwidth use

Ad verification is the most bandwidth-hungry workload we sell, because the whole point is to render the page the way a browser does — creatives, trackers, video and all. Budget for full page loads, not HTML.

WorkloadPer unitPer GB
Article page with display slots, full render2–4 MB~260–520 checks
Page with an autoplay video creative8–20 MB~50–130 checks
Render with images and fonts blocked400–800 KB~1,300–2,600 checks
Exit-IP assertion only (no render)~2 KBeffectively free

If you only need to prove which creative served — not how it looked — block images, media and fonts via route interception and keep the screenshot step for the placements that actually fail. That typically cuts a verification run by 70–80% with no loss of evidential value. These are measured estimates from typical ad-supported pages; your own targets will vary, so meter a small run before sizing a monthly budget.

BandwidthPricePer GBSave
1 GB$7$7—
5 GB$35$7—
10 GB$68$6.803%
25 GB$150$614%
50 GB$283$5.6619%
100 GB$500$529%

Relevant countries

Change country by editing one token in the proxy username — no redeploy, no second account. Pool depth varies by country and by whether you use the mobile (mbl) or residential (peer) pool; live availability is shown on each country page and in your dashboard.

Legitimate use only

ProxyMobile is sold for measurement, quality assurance and research on systems you own or are authorised to test. Buying bandwidth does not grant permission to access a third party's systems. You remain responsible for complying with each target's terms of service, robots directives and rate limits, and with the data-protection law that applies to you.

For this use case

  • Verify campaigns you are running, or that a client has engaged you to audit — not a competitor's private delivery.
  • Do not click, convert or otherwise interact with an ad you are only verifying. Generating billable events you did not intend is ad fraud regardless of motive.
  • Keep verification volume proportionate to the campaign. A checking cadence that meaningfully distorts a publisher's impression counts is a cost you are imposing on someone else.

Never, on any plan

  • No credential stuffing, account takeover, or any attempt to authenticate as someone else.
  • No circumventing an access control, paywall or security measure you have not been authorised to test.
  • No collection of personal data you have no lawful basis to process.
  • No load that a reasonable operator would experience as a denial of service — throttle, back off on 429s, and honour Retry-After.

Accounts used for fraud, intrusion or bulk abuse are terminated without refund, and we cooperate with valid legal process. Full terms are in our acceptable use policy.

Ad verification FAQ

Why not just use a datacentre proxy for ad verification?

Because the exchange can tell. Datacentre ranges are published and widely classified as invalid traffic, so many bidders will not serve a real creative to them at all. You get a technically successful request that contains the wrong answer, which is the most expensive kind of measurement error.

Can I prove which creative served for a dispute?

Yes — capture both a screenshot and the list of ad-network requests the page made, as the Playwright example does. The screenshot shows rendering; the request log shows which exchange and creative ID actually responded, which is the part that holds up in a conversation with a publisher.

How many checks can I run on a gigabyte?

Roughly 260 to 520 full page renders on a typical ad-supported article, or 1,300 to 2,600 if you block images and fonts. Video creatives are far heavier. Meter a small run against your own targets before committing to a monthly budget.

Which rotation mode should I use?

Start with auto10 and give each check its own -sid- token. Frequency capping means repeated requests from one IP are answered differently by design, so sampling from a single sticky session will understate delivery.

Do you offer a trial?

Your first top-up is credited with $2 on top, which is enough to run a real verification sweep against your own placements before you commit to a larger balance.

Related guides

Try it against your own targets

Bandwidth estimates on this page are honest ranges, not promises — the only number that matters is what your targets cost you. Your first top-up is credited with an extra $2, which is enough to meter a real run before you size a budget.