IP Intelligence
Location and network details for an IPv4 or IPv6 address (country, region, city, time zone, ASN and network owner) with risk flags from open lists such as Tor exit nodes and cloud provider ranges. Location data comes from DB-IP Lite (CC BY 4.0) and must be credited wherever results are shown.
POST https://YOUR_API_HOST/v1/ip
Credits and caching
- Success billing. 1 credit per lookup. You are charged only when the lookup finds something; a not-found result is free.
- Results are cached per account for 7 days. Repeating the same lookup in that window is free and returns
cache_hit: true. - Invalid input, rate limits and errors are never charged.
- Read the billing rules for the full picture.
Request
Send a JSON body with Authorization: Bearer <key>. The body can be up to 64 KB.
| Field | Type | Required | Notes |
|---|---|---|---|
ip | string | yes | Up to 100 characters. |
Example request
curl -X POST https://YOUR_API_HOST/v1/ip \
-H "Authorization: Bearer $LOOKVALID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ip":"8.8.8.8"}'
const response = await fetch("https://YOUR_API_HOST/v1/ip", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LOOKVALID_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"ip": "8.8.8.8"
}),
});
const result = await response.json();
if (!response.ok) throw new Error(`${result.error.code}: ${result.error.fix}`);
console.log(result.found, result.data, result.credits_charged);
import os
import requests
response = requests.post(
"https://YOUR_API_HOST/v1/ip",
headers={"Authorization": f"Bearer {os.environ['LOOKVALID_API_KEY']}"},
json={
"ip": "8.8.8.8",
},
timeout=30,
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['fix']}")
print(result["found"], result["data"], result["credits_charged"])
Response
The status is 200 whether or not anything was found. Check found. Every response also carries the X-Request-Id, X-Credits-Charged, X-Credits-Remaining and X-RateLimit-* headers.
Envelope
| Field | Type | Notes |
|---|---|---|
request_id | string | - |
product | "ip" | - |
found | boolean | False means the lookup ran and found nothing; it is free. |
reason | string or null | Why nothing was found; null when found. |
sources | array of string | Where the data came from, including any attribution the licence requires. |
credits_charged | integer | 0 for a cache hit, a not-found result or an error. |
credits_remaining | integer | - |
cache_hit | boolean | True when the account already paid for this lookup within the cache window. |
cache | object | - |
The data object
Present when found is true, otherwise null.
| Field | Type | Notes |
|---|---|---|
ip | string | - |
version | 4 or 6 | - |
country | string or null | ISO 3166-1 alpha-2 country code |
region | string or null | - |
city | string or null | - |
latitude | number or null | - |
longitude | number or null | - |
timezone | string or null | IANA time zone name; null when the location source does not carry one (DB-IP Lite does not) |
asn | integer or null | Autonomous system number |
asn_org | string or null | Organization that holds the ASN |
is_hosting | boolean | True when the address is inside a published cloud or hosting provider range |
hosting_provider | string or null | - |
is_tor | boolean | True when the address is on the Tor Project exit list |
is_vpn | boolean or null | Always null in this release: no VPN data source with resale-compatible terms is installed, so VPN status is unknown |
risk_score | integer | Minimum 0. Maximum 100. |
risk_factors | array of object | - |
risk_factors[].factor | string | One of tor_exit, hosting_provider. |
risk_factors[].points | integer | - |
risk_factors[].description | string | - |
attribution | "IP geolocation by DB-IP" | - |
Captured example (2026-10-18)
A real run of this lookup on 2026-10-18, using the request above, which is a public input. The envelope fields are left out.
{
"product": "ip",
"found": true,
"data": {
"ip": "8.8.8.8",
"version": 4,
"country": "US",
"region": "California",
"city": "Mountain View",
"latitude": 37.422,
"longitude": -122.085,
"timezone": null,
"asn": 15169,
"asn_org": "Google LLC",
"is_hosting": true,
"hosting_provider": "Google",
"is_tor": false,
"is_vpn": null,
"risk_score": 25,
"risk_factors": [
{
"factor": "hosting_provider",
"points": 25,
"description": "The address belongs to a cloud or hosting provider (Google), where traffic is often automated."
}
],
"attribution": "IP geolocation by DB-IP"
},
"sources": [
"IP geolocation by DB-IP (db-ip.com), CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)",
"IP to ASN data by DB-IP (https://db-ip.com), licensed CC BY 4.0. License: https://creativecommons.org/licenses/by/4.0/",
"Published cloud provider IP ranges"
]
}
Errors
400invalid_input: The request input is invalid.401unauthorized: The API key is missing, malformed, revoked or unknown.402insufficient_credits: The account does not have enough credits for this lookup. Error code: insufficient_credits. During a trial whose allowance is used up the code is trial_allowance_exhausted: nothing is charged and the customer starts the plan from the billing page.405method_not_allowed: This endpoint does not accept that HTTP method.413payload_too_large: The request body is too large.429rate_limited: Too many requests for this API key.500internal_error: An unexpected error occurred.503provider_unavailable: The data source for this product is unavailable right now.