How to Migrate from DB-IP to IP Geo API in 2026: A Step-by-Step Drop-In Guide
7-minute read · 2026 code samples · honest rollback plan
This is the practical companion to the DB-IP alternative comparison → and the head-on review of IP Geo API vs DB-IP →. Those two pages tell you whether to switch. This page tells you how — including the three packaging and field-shape gotchas no other migration guide is honest about.
TL;DR — most DB-IP → IP Geo API migrations land in half an engineering day for REST callers, and roughly one full day for teams currently consuming the MMDB / CSV downloadable database files. The real work is not the swap itself; it is decommissioning the MMDB-sync cycle, scrubbing the CC-BY 4.0 attribution backlink off public-facing surfaces (a contractual obligation on the free tier most teams forget when they upgrade), unbundling the IP-to-Threat / Anonymous / Datacenter separately-licensed product lines into a single inline threat block, and converting USD monthly billing to EUR monthly with iDEAL / SEPA / Bancontact at checkout.
Who this guide is for
You currently use DB-IP in one of three shapes:
- REST callers hitting
https://api.db-ip.com/v2/{key}/{ip}(and possibly the IP-to-Threat / IP-to-Anonymous / IP-to-Datacenter REST companions, each on a separately-licensed key). - MMDB / CSV callers loading a downloaded DB-IP database file (Lite monthly snapshot, Core daily snapshot, or one of the Extended / ISP / Full datasets) via the official
maxminddb-compatible Python / Node / Go libraries (maxminddb-golang,maxminddb,mmdblookup, etc. — DB-IP ships in MaxMind-compatible MMDB format). - Hybrid — REST in production hot paths, MMDB files in nightly batch jobs and offline analytics.
…and you’ve decided that the MMDB-sync cycle, the multi-product-line invoicing, USD-only billing, the CC-BY 4.0 attribution clause on the free tier, and the global-CDN-edge posture (DB-IP is Brussels-headquartered but the public REST API is fronted by globally distributed CDN edges) cost more than they should. You want a REST replacement that:
- Returns a JSON shape close enough to DB-IP’s REST
countryCode/stateProv/cityflat response that downstream consumers don’t have to be rewritten. - Bundles VPN / proxy / Tor / datacenter / residential flags into the same response on every plan, free, with no separate IP-to-Threat or IP-to-Anonymous SKU and no second invoice.
- Bills in EUR monthly (cancel anytime) with iDEAL / Bancontact / SEPA at checkout — not USD-only.
- Is contractually EU-only on the edge layer (no global CDN edges outside Frankfurt / Amsterdam) for cleaner GDPR Article 30 record-of-processing.
- Removes the recurring ops task of pulling, validating, and redeploying a multi-GB MMDB file every day or month.
- Drops the CC-BY 4.0 attribution backlink to db-ip.com from your public product surfaces.
If those six boxes are unchecked — pause and read the vs comparison → first. The tradeoffs are real, especially if you actively need offline / air-gapped lookups for on-prem deployments, sub-millisecond local-process latency at multi-million-lookup-per-second scale, or Extended-tier fields like weatherStationCode, linkedSites, addressType, or the granular connectionType enum we don’t expose at the same depth.
The 7-step migration checklist
- Inventory every call site that hits
api.db-ip.com, OR loads a.mmdb/.csvDB-IP file. - Map your fields to the DB-IP-compatibility response (
?format=db-ip). - Add a feature flag so you can switch any call site between providers.
- Wire a 60-second cache in front of the API client (in-memory or Redis).
- Deploy in shadow mode — call both, log differences, serve DB-IP responses.
- Cut over gradually — 10% → 50% → 100% of traffic over 48 hours.
- Decommission — cancel the threat / anonymous / datacenter add-ons, scrub the attribution backlink, archive USD invoice, drop the MMDB-sync cron.
The rest of this post walks each step with copy-paste code.
Step 1 — Inventory call sites
Run this in the repo root before touching anything:
git grep -nE "db-ip\\.com|dbip|DB_IP|DBIP|\\.mmdb|maxminddb|DBIP_KEY|db_ip_key" -- ':!*.lock' ':!*.md'
Most teams find 1-6 call sites: one for the main REST /v2/{key}/{ip} lookup, optionally one or more for the IP-to-Threat / Anonymous / Datacenter companion REST endpoints, plus any number of MMDB-file loaders (maxminddb.open_database("/var/lib/dbip-city-lite-2026-05.mmdb"), Reader.Open("/data/dbip-asn-lite-2026-05.mmdb")). The MMDB-loader paths are the higher-leverage swap target — those are the call sites that today require a daily or monthly DB pull, multi-GB redeploy, and version-skew checks across every app server. Audit each one; teams typically find one nightly or monthly cron job that nobody owns refreshing the file.
Watch-out: the MMDB loaders are usually process-local singletons instantiated at app startup. Hot-reload semantics differ across the official libraries (maxminddb-python re-mmaps on file replace if you call close() first; maxminddb-golang requires explicit Reader.Close() + maxminddb.Open() to pick up a new file; node-maxmind requires a process restart). The new HTTP client is per-request stateless, so the migration eliminates this entire class of “is the lookup table fresh on every pod after deploy?” questions.
Watch-out #2: scan also for the CC-BY 4.0 attribution snippet on public-facing surfaces. The DB-IP free tier’s attribution clause requires a visible link back to db-ip.com on any page that displays geolocation data. Teams that started on Lite and never upgraded carry this snippet around for years; teams that did upgrade often forget to scrub it. Search your templates / React components / CMS for db-ip.com and IP geolocation by DB-IP strings before cutover.
Step 2 — Map the fields
DB-IP’s REST API returns a flat JSON shape with sub-tier fields gated by your tier:
{
"ipAddress": "8.8.8.8",
"continentCode": "NA",
"continentName": "North America",
"countryCode": "US",
"countryCode3": "USA",
"countryName": "United States",
"stateProv": "California",
"stateProvCode": "CA",
"city": "Mountain View",
"district": "",
"zipCode": "94043",
"geonameId": 5375480,
"latitude": 37.4056,
"longitude": -122.0775,
"timeZone": "-07:00",
"timeZoneName": "America/Los_Angeles",
"weatherCode": "USCA0746",
"asNumber": 15169,
"asName": "Google LLC",
"isp": "Google LLC",
"organization": "Google LLC",
"connectionType": "Corporate",
"addressType": "Unicast",
"linkedSites": "google.com",
"languages": "en-US,es-US,haw,fr"
}
…and the MMDB / CSV local-lookup shape returns nested records (MaxMind-compatible nested structure: country, city, subdivisions, location, traits). The dataset tier determines which fields are populated: Lite = country only on the free tier; Core = city + ASN; Extended = +ISP + connection-type + linkedSites + languages; Full = all of the above plus IP-to-Threat / Anonymous / Datacenter as separately-licensed add-on datasets.
IP Geo API ships an ?format=db-ip compatibility shim that returns the same flat camelCase shape so most call sites stop noticing the swap. The mapping for the fields ~95% of integrations rely on:
| Your old code | DB-IP REST / MMDB field | IP Geo API ?format=db-ip |
Native ?format=ipgeo |
|---|---|---|---|
| IP | ipAddress |
ipAddress |
ip |
| Country code (ISO-2) | countryCode (REST) / country.iso_code (MMDB) |
countryCode |
country.iso_code |
| Country code (ISO-3) | countryCode3 (REST only) |
countryCode3 |
derived |
| Country name | countryName |
countryName |
country.name |
| Region (state/province) | stateProv |
stateProv |
region.name |
| Region code | stateProvCode |
stateProvCode |
region.iso_code |
| City | city |
city |
location.city |
| Postal | zipCode |
zipCode |
location.postal_code |
| Lat | latitude (number) |
latitude (number) |
location.lat |
| Lng | longitude (number) |
longitude (number) |
location.lng |
| Time zone (offset) | timeZone (e.g., "-07:00") |
timeZone |
derived |
| Time zone (IANA) | timeZoneName (e.g., "America/Los_Angeles") |
timeZoneName |
location.timezone |
| ASN | asNumber (integer) |
asNumber (integer) |
network.asn |
| ASN name | asName |
asName |
network.organization |
| ISP | isp |
isp |
network.organization (collapsed) |
| Continent | continentCode / continentName |
continentCode / continentName |
country.continent |
The native ?format=ipgeo shape uses snake_case nested objects (closer to MaxMind GeoIP2’s structure than DB-IP’s flat camelCase). Either format works — the shim is the path of least diff for ex-DB-IP code; the native format is cleaner for greenfield code.
Step 3 — Drop in the new client (with feature flag)
Python (was maxminddb MMDB loader on a dbip-city-lite-*.mmdb file)
# before — DB-IP MMDB local lookup
import maxminddb
DB = maxminddb.open_database("/var/lib/dbip-city-lite-2026-05.mmdb")
def lookup_country(ip: str) -> str:
rec = DB.get(ip)
return rec["country"]["iso_code"] if rec else None
# after — drop-in, feature-flagged, with cache
import os
from functools import lru_cache
import requests
API_KEY = os.environ["IPGEO_API_KEY"]
USE_IPGEO = os.environ.get("USE_IPGEO_API", "0") == "1" # feature flag
@lru_cache(maxsize=10_000)
def _lookup(ip: str) -> dict:
r = requests.get(
f"https://api.ipgeo.10b.app/v1/{ip}",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"format": "db-ip"},
timeout=2.0,
)
r.raise_for_status()
return r.json()
def lookup_country(ip: str) -> str:
if USE_IPGEO:
return _lookup(ip)["countryCode"] # flat shape — no rewrite
rec = DB.get(ip)
return rec["country"]["iso_code"] if rec else None
Two structural deltas on the migration: (a) the MMDB file is gone — no more multi-GB artefact in /var/lib, no more daily refresh cron, no more DBIP_MMDB_PATH env var, no more du -sh discipline; (b) the API key now lives in an Authorization: Bearer … header that does not appear in URL logs or browser history (DB-IP REST also used /v2/{key}/{ip} path-segment auth; if you were on the REST product before, treat the existing key as already-leaked across nginx, Cloudflare, APM, and Sentry logs).
Node / TypeScript (was node-maxmind on a DB-IP MMDB)
// before
import { Reader } from "node-maxmind";
const reader = await Reader.open("/var/lib/dbip-city-lite-2026-05.mmdb");
const rec = reader.get(ip);
const country = rec?.country?.iso_code;
// after — drop-in
const cache = new Map<string, any>();
export async function geoLookup(ip: string) {
if (process.env.USE_IPGEO_API !== "1") {
return reader.get(ip); // legacy MMDB path
}
if (cache.has(ip)) return cache.get(ip);
const r = await fetch(
`https://api.ipgeo.10b.app/v1/${ip}?format=db-ip`,
{ headers: { Authorization: `Bearer ${process.env.IPGEO_API_KEY!}` } }
);
if (!r.ok) throw new Error(`ipgeo ${r.status}`);
const j = await r.json();
cache.set(ip, j);
setTimeout(() => cache.delete(ip), 60_000); // 60-s TTL
return j;
}
Go
// after — drop-in via the db-ip-compatibility shim
url := fmt.Sprintf("https://api.ipgeo.10b.app/v1/%s?format=db-ip", ip)
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("IPGEO_API_KEY"))
resp, err := httpClient.Do(req)
// ... unmarshal into your existing DB-IP-shaped struct
Step 4 — Cache layer (the step everyone skips)
A naive 1-call-per-request integration will burn through IP Geo API’s free 1K-req/day cap in the first hour of any production traffic. The Starter tier (€29/mo for 100K req/mo) is fine for most apps, but a 60-second cache typically deflects 70-90% of calls at zero cost — and matters far less for ex-MMDB-file callers who paid zero per-lookup at runtime under DB-IP.
- Single-pod / serverless Lambda: Python
lru_cacheor aMapin Node, sized 10k entries. - Multi-pod web: Redis
SETEX <ip> 60 <json>or your existing distributed cache. - Edge / CDN: Cloudflare Workers KV with a 60-300 s TTL.
If you want strict cache-miss bounds, add a per-host concurrency limiter so only one in-flight call per IP is ever issued. Bonus: a single cached response on the new client covers what previously required three DB lookups (city + ASN + IP-to-Threat / Anonymous if you were on the multi-product Full tier) on DB-IP, which roughly thirds your effective lookup volume on the threat-detection path. Note the structural difference: MMDB-file callers used to pay zero per-lookup at runtime (process-local DB), so cache-hit-rate is less of a cost lever and more a latency lever — a cached HTTP response is ~0 ms vs ~5-15 ms over the wire even on warm TCP, which can matter on hot paths.
Step 5 — Shadow mode (the step that builds trust)
Before flipping any user-facing path: call both APIs and compare.
def lookup_country(ip: str) -> str:
legacy = (DB.get(ip) or {}).get("country", {}).get("iso_code")
if SHADOW_MODE:
try:
new = _lookup(ip)["countryCode"]
if new != legacy:
logger.warning("dbip-shadow-mismatch",
extra={"ip": ip, "legacy": legacy, "new": new})
except Exception as e:
logger.error("dbip-shadow-error",
extra={"ip": ip, "error": str(e)})
return legacy
Run shadow mode for 24-48 hours. The mismatch rate on country-level data is typically <0.5% (mostly stale MMDB snapshots vs daily-refreshed managed data — DB-IP Lite is monthly-released, Core is daily, so a freshly-deployed Lite file matches our daily-refreshed data closely on day one and drifts as the month progresses). City-level is 1-3%. ASN naming is the noisiest signal — both providers ship the same numeric ASN, but the asName (DB-IP) and network.organization (IP Geo API native) field can differ in casing or punctuation ("Google LLC" vs "GOOGLE"). The asName field on the shim re-formats to match DB-IP’s casing convention.
The single biggest mismatch class for DB-IP is the threat / anonymous / datacenter flag block: the legacy REST path returned this data as a separate response from a separately-licensed product (api.db-ip.com/threat/v1/{key}/{ip}, api.db-ip.com/anonymous/v1/{key}/{ip}, api.db-ip.com/datacenter/v1/{key}/{ip}), and the data is only populated if you have those add-on subscriptions — otherwise the field is absent. IP Geo API returns five boolean flags inline (is_proxy / is_vpn / is_tor / is_datacenter / is_residential) on every plan including free. Treat absent-vs-populated as a known-good signal, not a mismatch. For most fraud / analytics rules the binary is_proxy is the only field that matters; pin your match logic to that.
Step 6 — Gradual cutover
Once shadow logs are clean, flip a percentage of traffic via your feature-flag system (LaunchDarkly, Unleash, or a hashed-IP rollout):
import hashlib
def use_ipgeo(ip: str, percent: int) -> bool:
h = int(hashlib.md5(ip.encode()).hexdigest(), 16)
return (h % 100) < percent
Recommended ladder: 10% → 50% → 100% over 48 hours. Watch your existing fraud-flag dashboards for unexpected spikes; the bundled threat-flag block exposes signals that a DB-IP Core license (without the IP-to-Threat or IP-to-Anonymous add-on) did not, so if you wire is_vpn=true into a soft-block rule you may see a 5-15% bump in flagged sessions. This is not a regression — it is the threat data you were paying for separately on the IP-to-Threat / Anonymous product lines, now bundled inline.
Step 7 — Decommission
Once 100% has been on IP Geo API for >7 days with no incidents:
- Cancel each separately-licensed add-on in the DB-IP account portal — your geolocation product (Lite / Core / Extended / Full) and IP-to-Threat and IP-to-Anonymous and IP-to-Datacenter if you had them. The product lines bill separately on monthly invoices; cancelling one does not cancel the others. Most teams forget this and end up paying for one to three more months while running on IP Geo API in parallel.
- Scrub the CC-BY 4.0 attribution backlink off public-facing surfaces. Search for
db-ip.comandIP geolocation by DB-IPstrings across your templates / React / Vue components / CMS / docs. The Lite-tier free-DB and free-REST-tier both contractually require a visible attribution link; once you’ve migrated, that obligation is gone — but it does not auto-remove itself. This is the single biggest “we technically did the migration but forgot a step” gotcha on DB-IP exits. - Drop the MMDB-sync cron job. This is usually a
wget+ checksum +mv+ service-reload script in/etc/cron.dailyor/etc/cron.monthly, plus any matching Ansible / Terraform / Kubernetes ConfigMap that ships the file. Check/var/log/cron,crontab -l, your Ansible roles, and your CI pipelines for any reference todbip-filenames. - Delete the MMDB files from
/var/lib, your container images, and your S3 / object-storage backups. A typical Core+Threat footprint is 200 MB–1 GB per file; container-image bloat is a real win on rebuild time and registry storage cost. - Remove the
DBIP_KEY/DBIP_MMDB_PATHenv vars from CI / production / staging. - Cancel the DB-IP Stripe USD recurring invoice — most teams forget the duplicate-invoice line until accounting flags it next quarter.
- Delete the legacy fallback branch from your code (keep the feature-flag scaffold for the next migration).
- Update your DPIA / Article 30 record — processor change from DB-IP (Brussels HQ + global CDN edges) to corem6 BV (NL/EU, EU-only edges). The “vendor is EU but edges are global” footnote on your previous Article 30 row is removed.
The 7 gotchas teams hit in week one
- Attribution backlink left in place. The CC-BY 4.0 obligation is gone the day you upgrade past Lite, but the snippet in your templates is not. Audit before flipping the flag — you don’t want to be advertising your old vendor’s brand in production a month after the cutover. The legal exposure on the Lite tier specifically is small, but the brand-leakage exposure compounds with every new public page that inherits the template.
- Multiple product lines on the invoice, not one. If you used DB-IP geolocation + IP-to-Threat + IP-to-Anonymous + IP-to-Datacenter, those bill on separate monthly invoices on potentially different renewal dates. Cancel each, or you’ll keep one running for months past the migration.
countryCode3ISO-3 vs ISO-2. DB-IP returns bothcountryCode(ISO-2, 2-letter) andcountryCode3(ISO-3, 3-letter) flat at the top level of the REST response. The shim preserves both. The native format only emits ISO-2 atcountry.iso_code; ISO-3 has to be derived (most teams have a small lookup map already, since it’s a stable list of ~250 entries). Code that readscountryCode3directly will break under the native format — use the shim, or wire a derive-on-read at the edge.timeZoneoffset-string vs IANA-name. DB-IP returnstimeZone: "-07:00"(raw UTC offset) ANDtimeZoneName: "America/Los_Angeles"(IANA zone name) — both populated. IP Geo API native returns only the IANA name atlocation.timezone; the shim preserves both fields. The IANA name is strictly better for any code that needs DST-correct date arithmetic; the offset-string is fine only for display. Audit which downstream code consumestimeZonevstimeZoneNamebefore flipping.connectionType/addressTypeenum collapse. DB-IP exposes a granularconnectionTypeenum ("Corporate","Cellular","Cable/DSL","Dialup","Satellite") andaddressType("Unicast","Anycast","Multicast") on the Extended / Full tiers. The shim returns these strings unchanged; the native format only exposes a coarseris_residential/is_datacenterboolean pair. If your fraud rules branch onconnectionType == "Cellular"specifically, audit before flipping. Most teams find that the binaryis_residentialflag covers the cellular-vs-cable cases they actually rule on.- No cache layer. Quota burn in 4-6 hours on the free tier (1K/day cap). Add the cache before flipping the flag — especially relevant for ex-MMDB-file callers used to “free at runtime”.
- Outbound HTTPS blocked. Production VPC egress rules deny
api.ipgeo.10b.app. Get firewall change scheduled before cutover. DB-IP’s hostname (api.db-ip.com) was likely already allowlisted; the new hostname is not. Same applies to your CSP if you call from the browser.
What you’ll see in week two
- 70-90% cache-hit rate if step 4 was done right.
- ~30-50% bill reduction on the same volume once the IP-to-Threat / Anonymous / Datacenter add-ons are cancelled and the USD is replaced by EUR (€29/mo for 100K vs ~$19/mo Core + ~$15/mo IP-to-Threat + ~$15/mo IP-to-Anonymous = ~$49/mo plus FX-volatility line on your forecast).
- Smaller deployment artefacts — multi-hundred-MB MMDB files removed from container images and
/var/lib. Rebuild time, registry storage cost, and pod cold-start time all improve measurably. - VPN / Tor / proxy / datacenter flags on every response, free — no separate IP-to-Threat / Anonymous / Datacenter SKUs, no separate license, no second invoice.
- API key in headers, not URL paths — clean nginx/Cloudflare/APM logs going forward.
- No more CC-BY attribution backlink on your public pages — your vendor’s brand is no longer co-mingled with yours.
- Cleaner DPO conversation at your next compliance review — EU-only edges contractually, no “vendor is EU but CDN is global” footnote on your Article 30 record.
- No more daily/monthly MMDB-sync cron. That’s the recurring operational task most teams underestimate the cost of: someone owns it, someone validates checksums, someone notices when it silently fails.
Pairing pages
- DB-IP alternative comparison → — full feature matrix, REST-vs-MMDB delivery model, EU-edges-only wedge, free-tier specs.
- IP Geo API vs DB-IP in 2026 → — narrative companion: when DB-IP’s offline MMDB still wins.
- API reference → — endpoint, parameters, error codes (ships with paid tiers).
- Pricing → — EUR 0 / 29 / 99 tiers, no overage surprises.
FAQ
How long does a real DB-IP migration take? For a single-stack web app calling the REST API with 1-4 call sites and a working CI: half an engineering day end-to-end. Multi-stack monorepos with MMDB-file loaders in 5+ services: 1-2 days, mostly in service-by-service swap-out + cache-layer wiring + cron decommission + attribution-snippet scrub. The attribution-backlink scrub is the time sink most teams underestimate, not the field-shape diff — put it on the cutover checklist 7 days ahead.
Will my DB-IP-shaped tests still pass?
Yes — the compatibility shim returns the same flat camelCase JSON shape for the supported field set, including the countryCode / countryCode3 / stateProv / stateProvCode / city / zipCode / timeZone / timeZoneName / asNumber / asName triplet that 95% of integrations rely on. For fields outside the shim (weatherCode, linkedSites, addressType enum, granular connectionType enum), mock the new client path or move that logic to a dedicated reference-data source.
What about the MMDB / CSV files I’m running locally?
Replace the local-lookup call with an HTTP GET to IP Geo API. Cache hot IPs in Redis or equivalent for p95 latency. The migration is conceptually simpler than the REST-to-REST swap because the MMDB files have a more constrained API surface — the official maxminddb-compatible libraries all expose get(ip) or equivalent, and you can wrap the new HTTP client in a function with the same signature. The trade-off: you lose process-local sub-millisecond latency and gain ~5-15 ms of network latency per uncached lookup. If that delta breaks an SLA, keep DB-IP for that specific path and migrate everything else (hybrid pattern). For >99% of web apps, dashboards, and SaaS backends, the latency delta is invisible compared to your existing per-request budget.
What about the IP-to-Threat / IP-to-Anonymous / IP-to-Datacenter add-ons specifically?
Those product lines are consolidated into the bundled threat block (is_proxy, is_vpn, is_tor, is_datacenter, is_residential) on every IP Geo API response, including free tier. If you had any of those add-ons, the migration removes one to three monthly invoices and one to three sync cycles. The connectionType / addressType granular enums approximate to the is_residential / is_datacenter booleans; if you use those granular enums in fraud-rule branching, audit those rules before flipping.
Do I have to scrub the CC-BY 4.0 attribution snippet immediately? Not strictly — the obligation is gone the moment you stop calling DB-IP, not the moment you publish a snippet-scrub PR. But the longer the snippet stays, the longer your public surfaces advertise your old vendor’s brand, and the harder it becomes to track down every template / component / CMS field that inherits it. Best to do it on the cutover-day PR, not “next sprint”.
What’s the rollback story if something goes wrong? The feature flag gives you a 1-second flip back to DB-IP. Keep the DB-IP integration working for at least 30 days post-cutover; if you’re on monthly billing the marginal cost is one month’s invoice, which is cheap insurance. The IP-to-Threat / Anonymous / Datacenter add-ons you can leave running too for the same reason — sunk monthly cost, may as well use as belt-and-suspenders.
Can I migrate one service at a time? Yes — and it’s the recommended approach. Each call site is independent. Migrate the lowest-risk one first (often a dashboard analytics path or a server-side log enrichment job), measure for a week, then move to the next. There is no all-or-nothing requirement.
Do you support a /bulk endpoint like DB-IP’s MMDB local-lookup?
DB-IP does not ship a high-throughput REST /bulk endpoint — bulk users typically use the local DB file. We support a JSON POST to /v1/bulk with up to 100 IPs per call (paginate for larger batches). The response is a flat array; the per-IP response shape is identical to the single-lookup ?format=db-ip response. This is one of the biggest workflow improvements for ex-MMDB-file batch consumers — no DB sync, no process restart, no version skew, just an HTTP POST.
What if I was on the DB-IP Lite free tier? Then the migration math shifts away from cost (both DB-IP Lite and our free 1K-req/day are free) toward feature gain: Lite comes with a CC-BY 4.0 attribution requirement and ships only the country-level / city-level (depending on which Lite product) on a monthly refresh; our free tier ships full city + ASN + threat-block on a daily refresh with no attribution required. Side-project teams that “just need geo + light bot detection” usually find the migration is a net feature gain at zero cost change.
Why does DB-IP split geolocation from threat data at all? Historically the proxy/VPN/datacenter data sources were licensed and updated separately, and DB-IP passed through that packaging. Our pricing posture is “threat is a baseline expectation in 2026, not an upsell” — we vertically integrated the threat data into one quota, one invoice, one response. That difference in posture is the single biggest reason teams hit this migration guide.
Related migration & comparison reading
- How to Migrate from MaxMind GeoIP2 to IP Geo API in 2026 — sibling migration guide for the dominant database-download incumbent (MMDB nested-shape compatibility is closest to DB-IP’s MMDB layout)
- How to Migrate from ipinfo.io to IP Geo API in 2026 — sibling migration guide for the dominant North-American REST incumbent
- How to Migrate from ipstack to IP Geo API in 2026 — sibling migration guide for the apilayer-hosted REST incumbent (HTTPS-on-free + bundled Security)
- How to Migrate from ipapi.co to IP Geo API in 2026 — sibling migration guide for the attribution-tied free-tier REST incumbent (closest analog to DB-IP’s CC-BY-4.0 attribution clause)
- How to Migrate from ipgeolocation.io to IP Geo API in 2026 — sibling migration guide for the bundled-endpoints REST incumbent (Security-API SKU consolidation,
apiKey-in-URL log-leak) - How to Migrate from IP2Location to IP Geo API in 2026 — sibling migration guide for the BIN/CSV/MMDB downloadable-database incumbent (IP2Proxy SKU consolidation, USD-annual-prepay-to-EUR-monthly billing migration)
- IP Geo API vs DB-IP in 2026 — narrative head-on with REST-vs-MMDB EU-vs-EU TCO math
- IP Geo API vs MaxMind GeoIP2 in 2026 — managed API vs self-hosted GeoIP2 dataset trade-offs
- IP Geo API vs ipinfo.io in 2026 — when ipinfo.io still wins
- IP Geo API vs ipstack in 2026 — pricing, throughput and threat-intel comparison
- IP Geo API vs ipapi.co in 2026 — feature parity, attribution backlink, EUR billing
- IP Geo API vs ipgeolocation.io in 2026 — bundled-endpoints + Security-API SKU separation
- IP Geo API vs IP2Location in 2026 — REST-first vs database-download with annual-prepay TCO math
Industry deep-dives
-
IP Geolocation for Fintech — KYC, Sanctions Screening, Fraud, and EU Residency → — fintech-specific deep-dive: the three IP-control surfaces (KYC country-of-origin, OFAC/EU sanctions, payment-fraud risk), EU-hosted GDPR posture, EUR billing, ASN-level hosting detection, and ≤40 ms median EU-edge latency for 800-1200 ms PSP authorisation budgets.
-
IP Geolocation for Ad-Tech — RTB Enrichment, SIVT/IVT Filtering, and Click-Fraud Attribution → — ad-tech-specific deep-dive: the three IP-control surfaces (RTB bid enrichment with ≤40 ms latency budget + OpenRTB 2.6 device.geo/device.ext, SIVT/IVT filtering with IAB-confirmed datacenter ASN block-list, click-fraud post-back attribution + risk scoring), EU-hosted GDPR + ePrivacy + IAB-TCF v2.2 posture, bundled threat fields, ASN-level granularity, and predictable EUR billing.
-
IP Geolocation for iGaming — Licence-Jurisdiction Enforcement, VPN-Circumvention Scoring, and Self-Exclusion Register Routing → — iGaming-specific deep-dive: the three IP-control surfaces (licence-jurisdiction enforcement with hard-fail-closed posture across MGA/UKGC/KSA/DGOJ/ANJ/ADM/DAS, anti-circumvention scoring with residential-proxy ASN block-list covering Bright Data + Oxylabs + Smartproxy + IPRoyal, self-exclusion register routing to GamStop/CRUKS/ROFUS/Spelpaus/OASIS by IP-country), EU-hosted GDPR + EGBA posture, bundled threat fields, ASN-level granularity, and predictable EUR billing.
-
IP Geolocation for SaaS Monetization — Geo-Pricing, EU-VAT/DAC7 Tax-Routing, Trial-Abuse Scoring, and OFAC/EAR Export-Controls → — SaaS-specific deep-dive: the four IP-control surfaces (PPP-anchored geo-pricing with ≤40 ms checkout-flow budget, EU-VAT-MOSS + OECD DAC7 tax-routing to the right Stripe/Adyen/Braintree/Paddle tax-id, trial-abuse detection with residential-proxy ASN block-list across Bright Data/Oxylabs/Smartproxy/IPRoyal, and OFAC SDN + EAR export-controls feature-gating), EU-hosted GDPR posture, bundled threat fields, ASN-level granularity, and predictable EUR billing.
-
IP Geolocation for Streaming Media — Content Licensing, VPN-Bypass Defence, CDN POP Steering, and SSAI Ad-Insertion → — Streaming-media-specific deep-dive: the four IP-control surfaces (per-territory licensing enforcement with hard-fail-closed HTTP 451 on ambiguous resolve, VPN/proxy/Tor circumvention defence with residential-proxy ASN block-list across Bright Data/Oxylabs/Smartproxy/IPRoyal, CDN POP steering and adaptive bitrate-ladder selection across Akamai/Cloudflare/Fastly/BunnyCDN/Lumen, and SSAI ad-insertion targeting with sports blackout windows via Haversine GPS-distance), ≤40 ms session-init budget on EU edges, studio-grade 24-month audit trail, threat fields on every plan, ASN-level granularity, and EU-hosted GDPR + AVMSD (Directive 2018/1808) posture.
-
IP Geolocation for E-commerce — Tax-Jurisdiction Routing, BIN-vs-IP Carding Defence, PPP-Adjusted Currency Display, and Shipping-Zone Fulfilment Routing → — E-commerce-specific deep-dive: the four IP-control surfaces (EU OSS distance-sales 27-rate map + UK VAT 20% + CH-VAT 7.7% + NO MVA 25% + US Wayfair 13-state nexus + CA GST/HST per-province + AU/SG/IN/BR/JP GST/ICMS/JCT with sanctions hard-stop on IR/KP/SY/CU/BY/RU/MM/VE at checkout; BIN-vs-IP carding + refund-fraud 6-factor weighted score at place-order with residential-proxy ASN block-list across Bright Data/Oxylabs/Smartproxy/IPRoyal/Tier3; PPP-adjusted 7-tier pricebook on first paint with VPN/proxy fall-back to BIN-billing-country; 9-warehouse fulfilment routing FRA/AMS/MAD/MIL/DOV/IAD/LAX/DEL/SIN with DDP/DDU duty pre-calc and lithium/aerosol/prescription destination-gates), ≤40 ms checkout-first-paint budget, DAC7/GDPR/EU OSS audit posture, bundled threat fields on every plan, ASN-level granularity, and EUR billing.
-
IP Geolocation for Healthcare — Cross-Border Telehealth Licensing, HIPAA PHI/EPHI Access Geofencing, EU Patient-Data Residency w/ Schrems II Routing, and Cross-Border Pharma + DEA Schedule Gating → — Healthcare-specific deep-dive: the four IP-control surfaces (cross-border telehealth licensure match at consult-init w/ US IMLC 41-state partial + CA/FL/NY/TX independent + EU MRPQ Directive 2005/36/EC + DE Bundesärztekammer + NL BIG + FR ONM + UK GMC + HTTP 451 hard-fail-closed on jurisdiction-mismatch + NO_RECIPROCITY hard-stop on IR/KP/SY/CU/BY/RU/MM/VE/AF/SO; HIPAA 45 CFR §164.308(a)(4) PHI/EPHI access geofencing w/ clinical-ASN allowlist Epic/Cerner/Allscripts/Mayo/MGH/Cleveland/Kaiser + residential-proxy ASN reject Bright Data/Oxylabs/Smartproxy/IPRoyal/Tier3 + home-office BAA-attested workstation allowlist + risk_score < 30 soft-allow; EU patient-data residency w/ GDPR Art. 9 special-category + EDPB Recommendations 01/2020 supplementary technical measures + Schrems II SCC flag for US-shard + routing to 6 EHR shards EU-FRA/EU-AMS/UK-LON/US-IAD/CA-YYZ/AU-SYD w/ VPN/proxy → fall-back to EU-FRA highest protection; cross-border pharma + controlled-substance gating w/ DEA Schedules I-V + Ryan Haight Act §3 in-person-eval requirement for telemed Rx + EU Falsified Medicines Directive 2011/62/EU originator-country audit + per-country bans for cannabis/CBD/psilocybin/MDMA/kratom), ≤40 ms consult-init budget, HIPAA/GDPR Art. 9/Schrems II/DEA/EU FMD audit posture, bundled threat fields on every plan, ASN-level granularity, and EUR billing.
-
IP Geolocation for Travel + Hospitality — Geo-Rate Enforcement + Dynamic-Pricing per Booking Origin, OTA Carding + ATO Defence, OFAC/EU CONSILIUM/UK OFSI Sanctions Screening at Booking-Init, and GDS + EU OSS / DAC7 Reporting → — Travel/hospitality-specific deep-dive: the four IP-control surfaces (geo-rate enforcement + dynamic-pricing per booking origin w/ 8-tier pricebook T1 EU-Lux 1.00x → T8 Africa 0.75x + VPN/proxy/Tor fall-back to T2_NA_LUX anti-arbitrage + SANCTIONS_HARDSTOP on IR/KP/SY/CU/BY/RU/MM/VE/AF/SO HTTP 451 at search-render + BIN-billing-country pin at checkout; OTA carding + ATO defence at booking checkout w/ corporate-travel-platform ASN allowlist AS-CWT/Amex GBT/BCD/FCM/Egencia/Navan/Amadeus/Sabre fast-lane + consumer-OTA reject on VPN/Tor/relay + residential-proxy ASN block Bright Data/Oxylabs/Smartproxy/IPRoyal/Tier3 + 6-factor carding score threshold ≥70; OFAC + EU CONSILIUM + UK OFSI sanctions screening at booking-init w/ sanctioned-origin hard-stop regardless of session residency + EU 6AMLD compelled-disclosure on VPN/proxy + US-Cuba 31 CFR §515 General License gate + luxury-segment AML thresholds yacht €10K / private jet €20K / villa €5K/night / heli €3K + PEP screen + source-of-funds eval; GDS + inventory routing + EU OSS / DAC7 reporting w/ Amadeus EU/UK + Sabre US/CA + Travelport APAC + 27 EU-MS destination-VAT rates DE 19% → HU 27% + NO 25% + CH 8.1% + UK 20% + DAC7 Directive 2021/514 reportable-platform-operator evidence-log 5-year retention + Jan-31 lead-MS annual report), ≤40 ms search-render budget, OFAC/EU CONSILIUM/UK OFSI/DAC7/EU OSS/HOTREC audit posture, bundled threat fields on every plan, ASN-level granularity, and EUR billing.
Last reviewed 2026-05-10 · IP Geo API team · Comments / corrections: hello@ipgeo.10b.app
Pairs with the full DB-IP alternative comparison page and the head-on IP Geo API vs DB-IP review.
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.