Migration guide · ~an afternoon
Migrate from IPQualityScore to GeoQ
IPQualityScore is a broad fraud suite. If you only use its IP reputation endpoint, you're paying suite-level, query-credit pricing for one surface — and its fraud_score is a proprietary black box. GeoQ does IP-only at flat pricing and publishes the exact risk formula and weights, so the score is auditable and every result carries a reasons[] array.
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
- If you only use IP reputation, GeoQ covers it at a fraction of suite-level, per-query pricing.
- The risk score is auditable: published weights and a reasons[] array on every response, not a proprietary number.
- Flat daily-quota pricing with a 1,000/day no-card free tier.
- One /v1/check call returns geo, network, all abuse signals and the score.
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.
| IPQualityScore field | GeoQ field | Notes |
|---|---|---|
host / (request IP) | ip | |
city | geo.city | |
region | geo.region | |
country_code | geo.country_code | |
latitude | geo.latitude | |
longitude | geo.longitude | |
timezone | geo.timezone | |
ASN | network.asn | |
organization / ISP | network.as_org | GeoQ returns the AS organisation; it doesn't separate ISP/org the way the IPQS suite does. |
vpn | signals.is_vpn | |
proxy | signals.is_proxy | Residential-proxy detection is beta. |
tor | signals.is_tor | |
is_crawler | signals.is_verified_bot + signals.verified_bot_name | GeoQ verifies good crawlers (Googlebot/Bing) against published ranges; a verified crawler scores zero risk. |
fraud_score (0–100) | risk.score (0–100) | GeoQ's score is auditable: see the published formula + weights, plus risk.level and risk.reasons. |
recent_abuse / bot_status | — | No direct equivalent; GeoQ doesn't do behavioural bad-bot detection (on the roadmap). |
Before & after
Before — IPQualityScore
// Before — IPQualityScore (IP reputation) const res = await fetch( `https://ipqualityscore.com/api/json/ip/${process.env.IPQS_KEY}/${ip}` ); const data = await res.json(); if (data.fraud_score >= 85) { // why? the score is proprietary — no breakdown }
After — GeoQ
// After — GeoQ SDK (auditable score) import { GeoQ } from "@geoq/sdk"; const geoq = new GeoQ(process.env.GEOQ_API_KEY); const r = await geoq.check(ip); if (r.risk.score >= 60) { // r.risk.reasons tells you exactly which signals fired console.log(r.risk.reasons); // e.g. ["connection_type:datacenter", "is_vpn"] }
What you'll lose
IPQualityScore is a multi-surface suite: email, phone, device fingerprinting, transaction scoring and behavioural bot detection. GeoQ is IP-only. If you rely on those other surfaces or on behavioural bad-bot scoring, GeoQ won't replace the suite — it replaces the IP-reputation slice of it.
Other migration guides
FAQ
Frequently asked questions
How long does migrating from IPQualityScore actually take?
Is GeoQ a drop-in replacement for IPQualityScore?
Is this guide fair to IPQualityScore?
Switch from IPQualityScore this afternoon.
Get a free API key — 1,000 lookups/day, every signal, no credit card.