Migration guide · ~an afternoon

Migrate from MaxMind to GeoQ

MaxMind ships GeoIP2 databases you download, host and keep updated, plus minFraud for proprietary scoring. GeoQ is a hosted API: one /v1/check call returns geo, ASN, abuse signals and a transparent risk score — no .mmdb files to fetch on a cron, no reader libraries, no metered minFraud queries to reconcile. If you'd rather not run a database update pipeline, that's the switch.

Based on publicly available information. We don't disparage competitors and make no "most accurate" or "cheapest" claims — if something here is wrong, tell us.

Why switch

Field mapping

Map each field you read today to its GeoQ equivalent. GeoQ's schema: ip, version, geo, network, signals, evidence, risk — see the full response schema.

MaxMind fieldGeoQ fieldNotes
(query IP) ip
city.names.en geo.city
subdivisions[0].names.en geo.region
country.iso_code geo.country_code GeoQ also returns the full name in geo.country.
location.latitude geo.latitude
location.longitude geo.longitude
location.time_zone geo.timezone
traits.autonomous_system_number network.asn
traits.autonomous_system_organization network.as_org
traits.is_anonymous_vpn signals.is_vpn From MaxMind's Anonymous IP DB / minFraud.
traits.is_public_proxy / is_residential_proxy signals.is_proxy Residential-proxy detection is beta in GeoQ.
traits.is_tor_exit_node signals.is_tor
traits.is_hosting_provider signals.connection_type === "datacenter" GeoQ adds signals.datacenter_provider (aws, gcp, azure, …) and a "satellite" connection type.
minFraud risk_score risk.score GeoQ's score is auditable: published formula + weights, plus risk.level and risk.reasons.
Downloadable .mmdb databases No equivalent — GeoQ is API-first. Keep MaxMind if you need offline databases.

Before & after

Before — MaxMind

// Before — MaxMind (download, host, update .mmdb)
import maxmind from "maxmind";
// ...fetch + refresh GeoLite2-City.mmdb on a cron
const lookup = await maxmind.open("./GeoLite2-City.mmdb");
const data = lookup.get(ip);
const city = data?.city?.names?.en;
// abuse signals = a separate Anonymous-IP DB or metered minFraud call

After — GeoQ

// After — GeoQ SDK (hosted, one call)
import { GeoQ } from "@geoq/sdk";

const geoq = new GeoQ(process.env.GEOQ_API_KEY);
const r = await geoq.check(ip);
const city = r.geo.city;
const isHosting = r.signals.connection_type === "datacenter"; // same call, no extra product

What you'll lose

MaxMind's GeoIP2 databases run fully offline and minFraud is a long-established scoring incumbent. GeoQ is hosted and online-only — if you need air-gapped/offline lookups or are standardised on minFraud's model, GeoQ doesn't replace those. It replaces the hosted-lookup workflow.

Other migration guides

FAQ

Frequently asked questions

How long does migrating from MaxMind actually take?
For most apps, an afternoon. Swap the endpoint and auth, map the fields you read using the table above, and adjust where the response shape differs. GeoQ returns geo, network and abuse signals from one /v1/check call.
Is GeoQ a drop-in replacement for MaxMind?
Not byte-for-byte — the JSON shapes differ. The field-mapping table above covers the common fields; see the full response schema for everything GeoQ returns.
Is this guide fair to MaxMind?
We describe MaxMind neutrally from publicly available information and link to their docs where we can. We don't claim to be the most accurate or the cheapest. If anything here is out of date, tell us and we'll fix it.

Switch from MaxMind this afternoon.

Get a free API key — 1,000 lookups/day, every signal, no credit card.