IP Geolocation for Ad-Tech — RTB Enrichment, Invalid-Traffic Filtering, and Geo-Targeting

Why ad-tech is its own axis: programmatic exchanges (DSPs, SSPs, ad networks, MMPs) operate on a sub-100 ms bid-response budget and live or die by invalid-traffic (IVT) ratios. The IAB TAG / MRC certification floor is a measurable IVT rate — and the IP layer is where the cheapest, fastest filter sits, ahead of any device-graph or fingerprint pass.

The country an IP resolves to, the ASN it belongs to, and whether it’s a known datacenter, VPN, proxy, or Tor exit are inputs to three separate ad-tech control surfaces:

  1. Bid enrichment in RTB / OpenRTB 2.6 — enrich the device.geo + device.ip block before the bid request hits the DSP so targeting and floor rules can fire on a single round-trip.
  2. SIVT / IVT filtering — Sophisticated Invalid Traffic (sourced from datacenter IPs, anonymizers, bot farms, residential-proxy networks) is what gets your network de-listed from major DSPs and SSPs; IP-layer filters catch most of it pre-bid.
  3. Click fraud + post-impression attribution — for performance campaigns (CPA, CPI, CPL) the IP at click time vs the IP at conversion + ASN reputation drive payout decisions and refund disputes.

A single REST call to IP Geo API returns all three signal classes — country/region, ASN, threat-flags (VPN/proxy/Tor/hosting/relay) — on every plan, no add-on SKU, ≤40 ms median in EU.

What ad-tech buyers care about (in order)

  1. Latency budget ≤40 ms. OpenRTB bid windows are typically 80-120 ms wall-clock; the IP enrichment hop must finish in ≤40 ms or the bid gets dropped. IP Geo API runs on EU edges (Hetzner Frankfurt) for ≤30-40 ms median across DE/NL/FR/IE/UK.
  2. EU residency + GDPR/ePrivacy posture. Ad-tech is the regulator’s favourite hunting ground — IAB Europe TCF v2.2, Schrems II, the German FDPIC, the French CNIL, the Dutch AP. Customer IPs cannot be transferred to a US vendor without §28 GDPR DPA + SCCs + TIA. IP Geo API is EU-only data-flow, signed DPA in 24h, no SCCs required.
  3. Threat fields on every plan, not a separate SKU. Most US incumbents (MaxMind, ipinfo.io, ipstack) split datacenter/VPN/proxy classification into a paid Security Module or Privacy add-on. IP Geo API ships is_vpn, is_proxy, is_tor, is_hosting, is_relay, and a numeric risk_score on the free tier.
  4. ASN-level granularity for SIVT. The IAB SIVT taxonomy explicitly calls out hosting/datacenter ASNs as the #1 source — DigitalOcean, OVH, Hetzner-Cloud, AWS, GCP, Azure, Linode, M247, DataCamp Limited, Hurricane Electric. We expose asn, asn_org, and is_hosting as first-class fields so your filters can block at ASN granularity without maintaining a list yourself.
  5. Predictable EUR billing. Ad-tech budgets are EUR-denominated for EU clients; USD-billed vendors create FX surprises at quarter-end. IP Geo API is monthly EUR, no annual prepay, no FX line item.

The three ad-tech control surfaces, in code

1. RTB bid enrichment — sub-40 ms device.geo + IVT flags

// /api/rtb/bid-enrich.js — Node 20 / fastify
// Called from the bidder hot-path; budget ≤40 ms wall clock.
const fetch = require('undici').fetch;

async function enrichBidRequest(bidReq) {
  const ip = bidReq.device?.ip || bidReq.device?.ipv6;
  if (!ip) return bidReq;

  // Hot-path: cache 1 h, EU edge, ≤40 ms p95
  const geo = await fetch(`https://api.ipgeo.10b.app/v1/lookup/${ip}`, {
    headers: { Authorization: `Bearer ${process.env.IPGEO_KEY}` },
    signal: AbortSignal.timeout(40)
  }).then(r => r.json()).catch(() => null);
  if (!geo) return bidReq;

  bidReq.device.geo = {
    ...bidReq.device.geo,
    country: geo.country_code,    // ISO-3 in OpenRTB but ISO-2 from API; map upstream
    region:  geo.region_code,
    city:    geo.city,
    zip:     geo.postal_code,
    type:    1                     // 1 = GPS/Location Services per OpenRTB
  };

  // Custom ext block for downstream IVT filtering
  bidReq.device.ext = {
    ...bidReq.device.ext,
    asn:        geo.asn,
    asn_org:    geo.asn_org,
    is_hosting: geo.is_hosting ? 1 : 0,
    is_vpn:     geo.is_vpn ? 1 : 0,
    is_proxy:   geo.is_proxy ? 1 : 0,
    is_tor:     geo.is_tor ? 1 : 0,
    risk_score: geo.risk_score
  };
  return bidReq;
}

SLA note: the AbortSignal.timeout(40) ensures the enrichment never blows the 100 ms bid window. On miss, the bid still goes out — device.geo just falls back to whatever the SSP supplied.

2. SIVT / IVT filtering at impression and click

# Python / FastAPI — invoked at impression-pixel fire and click-redirect
from fastapi import FastAPI, Request

DATACENTER_BLOCK_ASNS = {  # IAB SIVT-confirmed hosting ASNs (sample)
    14061, 16509, 14618, 8075,  # DigitalOcean, AWS, Azure
    16276, 24940, 63949,         # OVH, Hetzner-Cloud, Linode
    9009, 174,                    # M247, Cogent
}

def classify_traffic(geo):
    # GIVT — General Invalid Traffic
    if geo["is_tor"]:
        return ("GIVT", "tor_exit_node")
    if geo["is_hosting"] and not geo["is_relay"]:
        return ("GIVT", f"datacenter_asn:{geo['asn']}")
    if geo["asn"] in DATACENTER_BLOCK_ASNS:
        return ("GIVT", f"known_dc_asn:{geo['asn']}")

    # SIVT — Sophisticated Invalid Traffic (residential proxies, VPN-mixed-with-bot-pattern)
    if geo["is_proxy"] and geo["risk_score"] > 60:
        return ("SIVT", "residential_proxy_high_risk")
    if geo["is_vpn"] and geo["risk_score"] > 80:
        return ("SIVT", "vpn_high_risk")

    return ("VALID", None)

The IP-layer pre-filter catches 70-80% of GIVT and 30-40% of SIVT at near-zero cost (≤40 ms, ~€0,0001/lookup) before any device-fingerprint or behavioural pass is needed. The remaining SIVT is what downstream IAB-TAG-certified verification (DoubleVerify, IAS, MOAT) is for.

3. Click-fraud filtering + post-back attribution

// /api/track/click.js
const geo = await ipgeoLookup(clickIP);
let risk = geo.risk_score;

if (geo.is_hosting)                              risk += 30; // datacenter click ≈ always fraud
if (geo.is_vpn || geo.is_proxy)                  risk += 20;
if (geo.is_tor)                                  risk += 40;
if (geo.country_code !== campaign.target_iso2)   risk += 15; // geo-mismatch
if (DC_ASNS.includes(geo.asn))                   risk += 25;

const action =
  risk > 80 ? 'reject_no_payout' :
  risk > 60 ? 'flag_for_audit'   :
  risk > 40 ? 'count_no_payout'  : 'allow';

await audit.write({
  click_id: req.query.cid, ip: clickIP, country: geo.country_code,
  asn: geo.asn, is_hosting: geo.is_hosting, risk, action, ts: Date.now()
});

Why this composes: the IP signal at click time is the only signal you have for an unauthenticated user before they convert. Device-fingerprint, ad-ID (IDFA/GAID), and behavioural data only become available after the click — IP is the gate.

Pricing math for a typical EU ad-tech stack

Stage Volume Tier Cost / month Cost per check
Pilot DSP / SSP integration < 30 K bid/clicks per mo Free € 0 € 0
Mid-market DSP / network < 1 M req/mo Starter €29 € 29 € 0,00003-0,001
Scale-up DSP / exchange < 10 M req/mo Business €99 € 99 € 0,00001-0,0001
Major exchange / SSP > 10 M Custom on request < € 0,00001

An ad-tech network running 5 M bid requests/mo at € 0,99 average CPM with a 0,4% IVT-rate-reduction recovers the entire Business tier (€ 99) in the first 600 fewer fraudulent impressions — and IVT-rate reductions of 0,4 ppt are conservative for first-pass IP filtering on a previously-unfiltered stack.

Honest limits — what IP geolocation is not for in ad-tech

IP geolocation’s job in an ad-tech stack is to cheaply route so the expensive verifications (MRC-certified SIVT, viewability, brand-safety scans) only activate for ambiguous cases — saving 60-80% of cost without giving up IVT-rate control.

Related use-cases

The ad-tech surface composes from these IP Geo API use-case patterns:

Compare IP Geo API to the providers ad-tech buyers evaluate

If you’re shortlisting vendors for an ad-tech RFP — typically driven by your IVT/fraud team or a procurement function — these head-to-heads cover the providers most often shortlisted in the IP-geolocation market:

Read also — narrative deep-dives

Seven 2026-dated comparison articles with code-level migration sketches and latency / pricing math at 100K / 1M / 10M req/mo:

Migration walkthroughs — drop-in code-level guides

Already on an incumbent? These step-by-step migration guides ship with field-by-field maps, code diffs, shadow-mode validation, and rollback notes:

Industry deep-dives

Other vertical-specific surfaces using the same IP Geo API primitives:


Get started — ad-tech-friendly procurement

Sign up at https://ipgeo.10b.app/pricing and start with a sandbox key today.


Get early access — 50% off for 12 months

First 100 signups lock in 50% off any paid plan for the first year. No credit card required — we’ll email you at launch.