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
- Hosted one-call API instead of downloading, hosting and updating GeoIP2 .mmdb databases.
- Abuse signals and a transparent risk score in the same call — no separate minFraud metering.
- The risk score is documented (published weights + reasons[]), not a proprietary minFraud number.
- Flat daily-quota pricing with a 1,000/day no-card free tier.
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 field | GeoQ field | Notes |
|---|---|---|
(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?
Is GeoQ a drop-in replacement for MaxMind?
Is this guide fair to MaxMind?
Switch from MaxMind this afternoon.
Get a free API key — 1,000 lookups/day, every signal, no credit card.