Skip to content

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

Swap the base URL · contract animation, nothing is sent from this page
the only change you makeincumbent
curl -H "X-API-Key: $LR_KEY" https://api.ipwho.example/standard/115.129.29.119
the response your parser already readsyour parser survives untouched
{
  "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.

Every incumbent uses different field names and different nesting, so switching means rewriting consumers.
Fields the vendor cannot source come back blank with no signal, indistinguishable from an address with no data.
Free tiers rate-limit by source IP, so every server behind one NAT shares one bucket and scaling makes it worse.
Keys ride in the URL as ?key=, which lands them in every proxy and access log between you and the vendor.
Submitting addresses in URLs writes them into intermediary logs, which for respondent addresses is a privacy problem.

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

1

Point your client at us

Change the base URL. Your existing parser keeps working because the response shape is the one it already reads.

2

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.

3

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.