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

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 fieldGeoQ fieldNotes
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?
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 IPQualityScore?
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 IPQualityScore?
We describe IPQualityScore 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 IPQualityScore this afternoon.

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