IP Intelligence Data
Swap the base URL, keep your parser
Migrating off ip-api, ipwho.is, or ip2location.io usually means rewriting the pipeline that reads them. Ours answers on their exact paths with their exact field names, so the migration is a URL change, not a project.
3
Response shapes: compact, standard, full
Declared
Gaps, never silent blanks
Header
Default key transport
Per-account
Rate limits, not per-IP
curl -H "X-API-Key: $LR_KEY" https://api.ipwho.example/standard/115.129.29.119{
"ip": "115.129.29.119",
"success": true,
"type": "IPv4",
"continent": "Oceania",
"country": "Australia",
"country_code": "AU",
"region": "Victoria",
"city": "Melbourne",
"postal": "3000",
"connection": { "asn": 7545, "org": "TPG Telecom Limited", "isp": "TPG Internet Pty Ltd" },
"timezone": { "id": "Australia/Melbourne" }
}The Problem
IP data migrations break quietly
The risk in changing IP data vendors is not downtime, it is the parser. A missing field does not error, it flows downstream as a blank, and a changed field name flows downstream as a wrong join.
The Solution
Drop-in paths, declared gaps, honest fields
The compatibility surface reproduces the incumbent responses field for field, verified against real captured payloads in both directions. What we cannot source is named in a response header instead of shipped as a silent blank, which no incumbent does.
Verbatim migration paths
Existing integrations keep their paths: /json for ip-api clients, /ipwho for ipwho.is, and the root ?ip= lookup for ip2location.io clients. Canonical /geo/compact, /geo/standard, and /geo/full name the same three shapes without vendor branding.
Declared unavailable fields
Any field we cannot source is listed in the X-LR-Field-Unavailable header on every lookup response across the compact, standard, and full shapes. Your pipeline can tell a data gap from an empty value, which is the difference between a null and a lie.
Keys travel in headers
Authentication is X-API-Key or Authorization Bearer on every documented path. The one exception is the ip2location-parity root lookup, which accepts key= for exact drop-in compatibility; every other surface refuses a credential in a URL.
Batch keeps addresses out of logs
POST a list of addresses in the request body instead of one per URL. The addresses you look up never appear in an access log, ours or anyone's in between.
Per-account rate limiting
Limits attach to your account, not your egress IP, so a fleet behind one NAT does not share a per-IP bucket, and adding servers does not change your quota.
Full country and network context
The full shape carries about ninety fields: geolocation, timezone, country facts, ASN and network operator, usage type, and VPN, proxy, Tor, and datacenter verdicts. Anything we cannot source is declared, never guessed.
How It Works
Three steps to protection
Point your client at us
Change the base URL. Your existing parser keeps working because the response shape is the one it already reads.
Verify on your own traffic
Run both providers side by side on live lookups and diff the responses. The structural gaps, missing or unsourceable fields, are the ones we declare in the response headers.
Cut over and monitor
Watch the X-LR-Field-Unavailable header, the X-LR-Units cost header, and your account usage in the dashboard as your volume moves.
Integration
One call, the shape you already parse
The standard shape, trimmed. Compact is flatter, full carries about ninety fields.
curl -H "X-API-Key: $LR_KEY" \
https://api.lrdefender.lightningresearch.ai/geo/standard/115.129.29.119
{
"ip": "115.129.29.119",
"success": true,
"type": "IPv4",
"continent": "Oceania",
"country": "Australia",
"country_code": "AU",
"region": "Victoria",
"city": "Melbourne",
"postal": "3000",
"connection": { "asn": 7545, "org": "TPG Telecom Limited", "isp": "TPG Internet Pty Ltd" },
"timezone": { "id": "Australia/Melbourne" }
}Run the diff before you decide
Send us a sample of your own addresses and compare our responses against your current provider, field by field. We will tell you which fields we cannot source before you sign, not after.