Loading page content.
Loading page content.
Ad tech
The creative you paid for either rendered in the placement you bought, in the market you targeted, or it did not. Verifying that requires loading the page the way the audience did — on a carrier IP, in their country, on their device class.
The problem
Programmatic delivery is decided at request time from signals the buyer does not control: the viewer's IP geography, the ISP or carrier behind it, the device and OS reported by the user agent, and the publisher's own inventory rules. A check run from a corporate network in a country you did not buy will be served a different auction outcome than the audience got, and any conclusion drawn from it describes a campaign nobody ran.
Mobile is where this bites hardest. A large share of display and in-app inventory is carrier-targeted, and some of it is only served to addresses that resolve to a mobile network operator. From a datacenter address that inventory is simply absent — not blocked, absent — so a verification run reports a placement as unfilled when it filled correctly for every real user.
Then there are the adversarial cases verification exists to catch: creatives swapped after approval, placements sold as above-the-fold that render below it, domain spoofing in the bid request, and geo-fraud where impressions billed as one market are served in another. None of those are visible from a single vantage point.
Why proxies
Verification is an evidence exercise: you need a screenshot and a request log taken from a vantage point the advertiser can defend in a conversation with the publisher. That means the exit has to be genuinely in the targeted market and genuinely on the network type the campaign bought — a mobile ASN for mobile inventory, a consumer ISP for desktop.
It also means the identity has to be stable for the length of a single check and different across checks. A dedicated mobile port gives you both: the address holds while the page loads, the ad renders, and the screenshot is captured, then rotates on demand before the next check so frequency capping does not suppress the placement you are trying to observe.
Recommended product
A dedicated 4G/5G modem port behind carrier-grade NAT
from $3.40/GB
Short campaigns and spot checks that need carrier exits for two hours rather than a week are cheaper metered by bandwidth than leased by the day.
from $2.65/GB
Desktop display and video inventory is served to consumer ISP addresses, where a residential exit is both correct and considerably cheaper than a modem port.
Worked example
Verification evidence is a screenshot plus the network log that explains it. Playwright routes the whole browser through the carrier exit, so the creative, the tracking calls and the landing-page redirect are all observed from the same vantage point.
import { chromium } from "playwright";
const proxy = {
server: "http://gate.fleetproxy.com:8080",
username: "fp_8s2k4d19-country-de-carrier-vodafone",
password: "Xk7mQ2pTz9vRn4Ls",
};
const browser = await chromium.launch({ proxy });
const context = await browser.newContext({
// Match the device class the campaign bought. A desktop viewport on a
// carrier IP is a mismatch that changes which creative is eligible.
viewport: { width: 390, height: 844 },
deviceScaleFactor: 3,
isMobile: true,
hasTouch: true,
locale: "de-DE",
});
const page = await context.newPage();
const adRequests = [];
page.on("request", (request) => {
if (request.resourceType() === "image" || request.resourceType() === "script") {
adRequests.push({ url: request.url(), type: request.resourceType() });
}
});
await page.goto("https://publisher.example/article/1234", {
waitUntil: "networkidle",
});
const slot = page.locator("#ad-slot-top");
await slot.waitFor({ state: "visible", timeout: 15000 });
await slot.screenshot({ path: "evidence/de-vodafone-top.png" });
const box = await slot.boundingBox();
// Above the fold is a claim about pixels, so measure it rather than assume it.
console.info({ y: box?.y, aboveFold: (box?.y ?? 0) < 844, calls: adRequests.length });
await browser.close();Replace the credential with the one in your dashboard. The gateway host, port and username format are the same across every product.
Pitfalls
Each of these is common, cheap to fix, and expensive to leave in place. They are listed in roughly the order teams hit them.
A default browser profile with any blocking extension, or a DNS resolver that filters ad domains, will report placements as unfilled that served correctly. Verification profiles must be clean, and the resolver must be the one the carrier hands out.
Carrier-gated inventory is not blocked from hosting ranges, it is simply not eligible. The report comes back empty and reads as a delivery failure. If the campaign bought mobile, the check has to leave from a mobile ASN.
Repeated checks from one identity trip frequency caps, after which the slot fills with a different creative or house inventory. That looks identical to a swapped creative. Rotate between checks and record the identity used with each observation.
Header bidding, lazy-loaded slots and video pre-rolls resolve well after the load event. Wait for the slot to be visible and stable rather than for the page, or the evidence captures an empty container and a false negative.
Questions
Start on 50MB of free residential bandwidth, measure your own targets, and scale into volume tiers that step the rate down as the job grows. Unused bandwidth never expires.
No card required for the trial. Cancel or downgrade at any time.