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
- Abuse signals (VPN/proxy/Tor/datacenter) are included in GeoQ's base call — on IPinfo the privacy object is a paid add-on.
- One call returns geo + network + signals + a risk score with reasons[], instead of composing multiple IPinfo products.
- Flat daily-quota pricing and a 1,000/day free tier with no credit card.
- A ?format=ipinfo compatibility mode lets you swap only the base URL to start (migration aid — see below).
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 field | GeoQ field | Notes |
|---|---|---|
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?
Is GeoQ a drop-in replacement for IPinfo?
Is this guide fair to IPinfo?
Switch from IPinfo this afternoon.
Get a free API key — 1,000 lookups/day, every signal, no credit card.