Migration guide · ~an afternoon

Migrate from IPinfo to GeoQ

IPinfo is excellent at geolocation and ASN data depth. But its abuse signals — the privacy object with VPN, proxy, Tor and hosting flags — sit behind a paid plan. GeoQ returns those signals in every call, including the free tier, alongside geo, ASN and a transparent risk score. If your question is "can I trust this IP?", not just "where is it?", 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.

The drop-in path

Change one URL parameter, keep your parsing.

Add ?format=ipinfo to the GeoQ endpoint and point your existing IPinfo client at it. GeoQ returns an IPinfo-shaped response, so the code that reads privacy, loc, org and the rest keeps working — switch first, adopt native fields later.

Before — IPinfo

# Before — your existing IPinfo call
$ curl "https://ipinfo.io/8.8.8.8/json?token=$IPINFO_TOKEN"

After — GeoQ, ?format=ipinfo

# After — same response shape, one URL parameter changed
$ curl "https://api.geoq.io/v1/check?ip=8.8.8.8&format=ipinfo" \
    -H "x-api-key: $GEOQ_API_KEY"

Same shape comes back:

{
  "ip": "8.8.8.8",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.4,-122.1",
  "org": "AS15169 Google LLC",
  "timezone": "America/Los_Angeles",
  "privacy": { "vpn": false, "proxy": false, "tor": false, "hosting": true, "service": "" }
}

Migration aid only. This compatibility shape omits GeoQ's native extras — risk.reasons, the per-signal evidence labels and datacenter_provider. Once you've switched, drop format=ipinfo and read the native /v1/check format (the mapping below) for the full, transparent response. See the migration-mode docs for every field.

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.

IPinfo fieldGeoQ fieldNotes
ip ip
city geo.city
region geo.region
country geo.country_code IPinfo's country is the ISO code; GeoQ also returns the full name in geo.country.
loc ("lat,lng") geo.latitude + geo.longitude GeoQ splits the pair into two numeric fields.
timezone geo.timezone
org ("AS15169 Google LLC") network.asn + network.as_org GeoQ separates the ASN number and the AS organisation.
privacy.vpn signals.is_vpn Included in GeoQ's base call.
privacy.proxy signals.is_proxy Residential-proxy detection is beta.
privacy.tor signals.is_tor
privacy.relay signals.is_relay GeoQ detects privacy relays (e.g. Apple iCloud Private Relay) with signals.relay_provider.
privacy.hosting signals.connection_type === "datacenter" connection_type also reports "satellite"; GeoQ adds signals.datacenter_provider (e.g. aws, gcp).
privacy.service signals.relay_provider / datacenter_provider GeoQ exposes the relay or datacenter provider for attribution.
company / carrier / abuse objects GeoQ doesn't return these; it focuses on abuse signals + a risk score (risk.score, risk.level, risk.reasons).

Before & after

Before — IPinfo

// Before — IPinfo
const res = await fetch(
  `https://ipinfo.io/${ip}/json?token=${process.env.IPINFO_TOKEN}`
);
const data = await res.json();
const isVpn = data.privacy?.vpn; // privacy object requires a paid plan

After — GeoQ

// After — GeoQ SDK (signals included)
import { GeoQ } from "@geoq/sdk";

const geoq = new GeoQ(process.env.GEOQ_API_KEY);
const r = await geoq.check(ip);
const isVpn = r.signals.is_vpn;           // included on every plan
if (r.risk.level === "high") {
  // step up — and you get r.risk.reasons explaining why
}

What you'll lose

IPinfo's geolocation, company and carrier datasets are deep and well-maintained. If you need rich company/carrier enrichment or downloadable databases for offline use, GeoQ doesn't replace those — it's an API-first abuse-signal + risk service. Keep IPinfo for data depth; use GeoQ for the trust decision.

Other migration guides

FAQ

Frequently asked questions

How long does migrating from IPinfo 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 IPinfo?
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 IPinfo?
We describe IPinfo 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 IPinfo this afternoon.

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