IP Geolocation API
Overview
IP Geolocation API provides real-time and accurate geolocation, asn, company, network, time zone, abuse, and security information for any IPv4 or IPv6 address and domain name, along with the detailed timezone and user-agent details for the provided user-agent string. You can geolocate your online visitors and provide them with a customized user-experience accordingly.
IPGeolocation API Endpoints
The IP Lookup API provides two endpoints to get geolocation & IP data information:
- Single IP Geolocation Lookup
- Bulk IPGeolocation Lookup
Free Plan Request and Response
Single IP Geolocation Lookup API
Use the Single IP Location API endpoint to look up any IPv4 or IPv6 address. You can also call this endpoint without an ip parameter to automatically look up the caller IP.
1. Lookup a specific IPv4 or IPv6 address (using ip )
I. IPv4 Example
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "continent_code": "EU",
5 "continent_name": "Europe",
6 "country_code2": "SE",
7 "country_code3": "SWE",
8 "country_name": "Sweden",
9 "country_name_official": "Kingdom of Sweden",
10 "country_capital": "Stockholm",
11 "state_prov": "Stockholms län",
12 "state_code": "SE-AB",
13 "district": "Stockholm",
14 "city": "Stockholm",
15 "zipcode": "164 40",
16 "latitude": "59.40510",
17 "longitude": "17.95510",
18 "is_eu": true,
19 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
20 "geoname_id": "9972319",
21 "country_emoji": "🇸🇪"
22 },
23 "country_metadata": {
24 "calling_code": "+46",
25 "tld": ".se",
26 "languages": [
27 "sv-SE",
28 "se",
29 "sma",
30 "fi-SE"
31 ]
32 },
33 "currency": {
34 "code": "SEK",
35 "name": "Swedish Krona",
36 "symbol": "kr"
37 },
38 "asn": {
39 "as_number": "AS1257",
40 "organization": "Tele2 Sverige AB",
41 "country": "SE"
42 },
43 "time_zone": {
44 "name": "Europe/Stockholm",
45 "offset": 1,
46 "offset_with_dst": 1,
47 "current_time": "2026-02-12 18:36:54.401+0100",
48 "current_time_unix": 1770917814.401,
49 "current_tz_abbreviation": "CET",
50 "current_tz_full_name": "Central European Standard Time",
51 "standard_tz_abbreviation": "CET",
52 "standard_tz_full_name": "Central European Standard Time",
53 "is_dst": false,
54 "dst_savings": 0,
55 "dst_exists": true,
56 "dst_tz_abbreviation": "CEST",
57 "dst_tz_full_name": "Central European Summer Time",
58 "dst_start": {
59 "utc_time": "2026-03-29 TIME 01:00",
60 "duration": "+1.00H",
61 "gap": true,
62 "date_time_after": "2026-03-29 TIME 03:00",
63 "date_time_before": "2026-03-29 TIME 02:00",
64 "overlap": false
65 },
66 "dst_end": {
67 "utc_time": "2026-10-25 TIME 01:00",
68 "duration": "-1.00H",
69 "gap": false,
70 "date_time_after": "2026-10-25 TIME 02:00",
71 "date_time_before": "2026-10-25 TIME 03:00",
72 "overlap": true
73 }
74 }
75}II. IPv6 Example
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=2607:fb91:16c6:8860:e531:2d1d:4944:6c7c'ip value will be an IPv6 address.2. Lookup the caller IP (no ip parameter)
If you don’t pass the ip parameter, the API automatically detects the public IP address of the requesting client and returns its IP data.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY'ip in the request. The difference is that ip will be the requesting client’s public IP.Credits charged for this endpoint
One successful request (status code returned 200 ) from this endpoint will consume 1 API Credit.
You can also confirm the charged credits from the response header:
• X-Credits-Charged
For a detailed explanation of our API credit consumption logic, please consult the Credits & Billing documentation.
Response in Multiple Languages
The geolocation information for an IP address from the IP Geolocation API can be retrieved in the following languages:
- English (en)
- German (de)
- Russian (ru)
- Japanese (ja)
- French (fr)
- Chinese Simplified (cn)
- Spanish (es)
- Czech (cs)
- Italian (it)
- Korean (ko)
- Persian (fa)
- Portuguese (pt)
By default, the API responds in English. You can change the response language by passing the language code as a query parameter lang . Here is an example to get the geolocation data for IP address '91.128.103.196' in Chinese language.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&lang=cn'Only paid plan subscriptions can receive responses in languages other than English. Free/Developer plan subscriptions return responses in English only. If a language other than English is specified in the lang parameter while using a Free/Developer plan API key, the request will result in a 401 (Unauthorized) response.
Additional Query Parameters
Use these query parameters to include additional data, exclude fields, or return only the fields you need. This helps you keep responses small, reduce bandwidth, and speed up processing on your side.
-
includeadds optional modules that are not included by default -
fieldsreturn only the fields you request -
excludesremoves fields or modules you don’t need
The include parameter is available on Paid plans. The fields and excludes parameters are available on all plans, including Free, and can be used to select and filter response fields.
1. Include Additional Data ( include parameter)
Use include query parameter in your request to add extra data to the response.
Available values:
Use the include parameter with one or more of the values below (comma separated if more than one).
- Enrichment data:
geo_accuracy,dma_code,user_agent,security,abuse - Hostname options:
hostname,liveHostname,hostnameFallbackLive
Examples and details for each option are provided below.
I. Include Additional Geo Accuracy Fields ( include=geo_accuracy )
Add include=geo_accuracy in your request to return three additional fields in the location object:
-
location.accuracy_radius: - Accuracy radius in km around location.latitude and location.longitude
-
location.confidence: - Confidence level for the accuracy radius: high, medium, or low.
-
location.locality: - Locality or neighborhood (may be the same as the city).
Example request and response are shown below.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=geo_accuracy'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "continent_code": "EU",
5 "continent_name": "Europe",
6 "country_code2": "SE",
7 "country_code3": "SWE",
8 "country_name": "Sweden",
9 "country_name_official": "Kingdom of Sweden",
10 "country_capital": "Stockholm",
11 "state_prov": "Stockholms län",
12 "state_code": "SE-AB",
13 "district": "Stockholm",
14 "city": "Stockholm",
15 "locality": "Stockholm",
16 "accuracy_radius": "4.395",
17 "confidence": "high",
18 "zipcode": "164 40",
19 "latitude": "59.40510",
20 "longitude": "17.95510",
21 "is_eu": true,
22 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
23 "geoname_id": "9972319",
24 "country_emoji": "🇸🇪"
25 },
26 "country_metadata": {
27 "...": "...",
28 },
29 "network": {
30 "...": "..."
31 },
32 "currency": {
33 "...": "..."
34 },
35 "asn": {
36 "...": "..."
37 },
38 "company": {
39 "...": "..."
40 },
41 "time_zone": {
42 "...": "..."
43 }
44}II. Include DMA Code ( include=dma_code parameter)
If you need the DMA (Designated Market Area) code, which is used in the United States for marketing and regional targeting, you can retrieve it through the IP Geolocation API on any Paid plan.
To include the DMA code in the location object, add include=dma_code to your request.
Below is an example IP Geolocation lookup request and response that includes the DMA code along with the location data for the IP address:
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=107.161.145.197&include=dma_code'1{
2 "ip": "107.161.145.197",
3 "location": {
4 "continent_code": "NA",
5 "continent_name": "North America",
6 "country_code2": "US",
7 "country_code3": "USA",
8 "country_name": "United States",
9 "country_name_official": "United States of America",
10 "country_capital": "Washington, D.C.",
11 "state_prov": "Pennsylvania",
12 "state_code": "US-PA",
13 "district": "Philadelphia County",
14 "city": "Philadelphia",
15 "dma_code": "504",
16 "zipcode": "19102",
17 "latitude": "39.95258",
18 "longitude": "-75.16522",
19 "is_eu": false,
20 "country_flag": "https://ipgeolocation.io/static/flags/us_64.png",
21 "geoname_id": "9849057",
22 "country_emoji": "🇺🇸"
23 },
24 "country_metadata": {
25 "...": "...",
26 },
27 "network": {
28 "...": "..."
29 },
30 "currency": {
31 "...": "..."
32 },
33 "asn": {
34 "...": "..."
35 },
36 "company": {
37 "...": "..."
38 },
39 "time_zone": {
40 "...": "..."
41 }
42}location.dma_code field will be non-empty only for IPs in the USA.III. Include User-Agent Information for a Device ( include=user_agent parameter)
IP Geolocation API also provides User-Agent information of the client on all the paid subscriptions, but doesn't respond it by default. To get User-Agent information along with the geolocation information, you must pass the include=user_agent as a query parameter in the request URL.
How User-Agent parsing works:
i. How User-Agent parsing works
- If you do not send a User-Agent header, the API uses the user agent of the requesting client and parses it automatically. This is useful for client-side requests.
- For server-side requests, send the visitor’s User-Agent value in the User-Agent header so the API returns details for the correct user.
Example requests and responses for both scenarios are given below.
A. Without a User-Agent header
The API parses the user agent of the requesting client.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=user_agent'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "...": "..."
5 },
6 "user_agent": {
7 "user_agent_string": "curl/8.5.0",
8 "name": "Curl",
9 "type": "Robot",
10 "version": "8.5.0",
11 "version_major": "8",
12 "device": {
13 "name": "Curl",
14 "type": "Robot",
15 "brand": "Curl",
16 "cpu": "Unknown"
17 },
18 "engine": {
19 "name": "curl",
20 "type": "Robot",
21 "version": "8.5.0",
22 "version_major": "8"
23 },
24 "operating_system": {
25 "name": "Cloud",
26 "type": "Cloud",
27 "version": "??",
28 "version_major": "??",
29 "build": "??"
30 }
31 },
32 "country_metadata": {
33 "...": "...",
34 },
35 "network": {
36 "...": "..."
37 },
38 "currency": {
39 "...": "..."
40 },
41 "asn": {
42 "...": "..."
43 },
44 "company": {
45 "...": "..."
46 },
47 "time_zone": {
48 "...": "..."
49 }
50}B. With a User-Agent header
The API parses the user agent value you provide in the User-Agent header.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=user_agent' \
-H 'User-Agent: python-requests/2.32.5'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "...": "..."
5 },
6 "user_agent": {
7 "user_agent_string": "python-requests/2.32.5",
8 "name": "Python-Requests",
9 "type": "Robot",
10 "version": "2.32.5",
11 "version_major": "2",
12 "device": {
13 "name": "Python Requests",
14 "type": "Robot",
15 "brand": "Python",
16 "cpu": "Unknown"
17 },
18 "engine": {
19 "name": "python-requests",
20 "type": "Robot",
21 "version": "2.32.5",
22 "version_major": "2"
23 },
24 "operating_system": {
25 "name": "Cloud",
26 "type": "Cloud",
27 "version": "??",
28 "version_major": "??",
29 "build": "??"
30 }
31 },
32 "country_metadata": {
33 "...": "...",
34 },
35 "network": {
36 "...": "..."
37 },
38 "currency": {
39 "...": "..."
40 },
41 "asn": {
42 "...": "..."
43 },
44 "company": {
45 "...": "..."
46 },
47 "time_zone": {
48 "...": "..."
49 }
50}IV. Hostname Lookup for an IP Address
IPGeolocation API also provides hostname lookup for an IP address on all the paid subscriptions, but doesn't respond it by default. To get the hostname for an IP address, you can pass one of the following three values in include request parameter:
-
hostname: - Returns the hostname from our local IP-to-hostname database.
-
liveHostname: - Performs a live hostname lookup.
-
hostnameFallbackLive: - Checks the local IP-to-hostname database first. If not found then performs a live hostname lookup.
Here is an example to IP Geolocation lookup that includes the hostname for the IP address:
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=107.161.145.197&include=liveHostname'1{
2 "ip": "107.161.145.197",
3 "hostname": "host197.lightwavenetworks.com",
4 "location": {
5 "continent_code": "NA",
6 "continent_name": "North America",
7 "country_code2": "US",
8 "country_code3": "USA",
9 "country_name": "United States",
10 "country_name_official": "United States of America",
11 "country_capital": "Washington, D.C.",
12 "state_prov": "Pennsylvania",
13 "state_code": "US-PA",
14 "district": "Philadelphia County",
15 "city": "Philadelphia",
16 "zipcode": "19102",
17 "latitude": "39.95258",
18 "longitude": "-75.16522",
19 "is_eu": false,
20 "country_flag": "https://ipgeolocation.io/static/flags/us_64.png",
21 "geoname_id": "9849057",
22 "country_emoji": "🇺🇸"
23 },
24 "country_metadata": {
25 "...": "...",
26 },
27 "network": {
28 "...": "..."
29 },
30 "currency": {
31 "...": "..."
32 },
33 "asn": {
34 "...": "..."
35 },
36 "company": {
37 "...": "..."
38 },
39 "time_zone": {
40 "...": "..."
41 }
42}i. include=hostname URL Parameter
This URL parameter enables the IPGeolocation API to lookup hostname from our IP-Hostname database and returns the same IP address if there is no hostname found for the queried IP address. Lookup through IP-Hostname database is faster than other options but is experimental and under process and can produce unwanted output.
ii. include=liveHostname URL Parameter
This URL parameter enables the IPGeolocation API to lookup hostname from live sources. Lookup through live sources is accurate but can introduce more latency to your query to IPGeolocation API.
iii. include=hostnameFallbackLive URL Parameter
This URL parameter enables the IPGeolocation API to lookup hostname from our IP-Hostname database and if there is no hostname found for the queried IP address, then lookup through the live sources. This option has been introduced for faster and accurate lookup.
V. IP-Security Information for an IP Address ( include=security parameter)
IP Geolocation API also provides IP-Security information on all the Paid API subscriptions, but doesn't include it in the response by default. To get IP-Security information along with the geolocation information, you must pass the include=security as a query parameter in the URL.
The security object returns structured risk signals for the IP address, including an overall threat_score plus boolean flags for common anonymization and abuse categories such as is_proxy , is_residential_proxy , is_vpn , is_tor , is_relay , is_bot , is_spam , is_known_attacker , is_anonymous and is_cloud_provider .
When a match is found, it can also include attribution and strength signals such as provider names (for example, proxy_provider_names , vpn_provider_names , cloud_provider_name ) along with confidence and recency fields like proxy_confidence_score , proxy_last_seen , vpn_confidence_score and vpn_last_seen .
For an example request and sample response showing how to include the security object in the default response, see below.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=2.56.188.34&include=security'1{
2 "ip": "2.56.188.34",
3 "location": {
4 "...": "..."
5 },
6 "security": {
7 "threat_score": 80,
8 "is_tor": false,
9 "is_proxy": true,
10 "proxy_provider_names": [
11 "Zyte Proxy"
12 ],
13 "proxy_confidence_score": 90,
14 "proxy_last_seen": "2025-12-12",
15 "is_residential_proxy": true,
16 "is_vpn": true,
17 "vpn_provider_names": [
18 "Nord VPN"
19 ],
20 "vpn_confidence_score": 90,
21 "vpn_last_seen": "2026-01-19",
22 "is_relay": false,
23 "relay_provider_name": "",
24 "is_anonymous": true,
25 "is_known_attacker": true,
26 "is_bot": false,
27 "is_spam": false,
28 "is_cloud_provider": true,
29 "cloud_provider_name": "Packethub S.A."
30 },
31 "country_metadata": {
32 "...": "...",
33 },
34 "network": {
35 "...": "..."
36 },
37 "currency": {
38 "...": "..."
39 },
40 "asn": {
41 "...": "..."
42 },
43 "company": {
44 "...": "..."
45 },
46 "time_zone": {
47 "...": "..."
48 }
49}security and abuse ) costs 1 credit, the total becomes 3 credits when security is included. For the exact charge on any request, check the X-Credits-Charged response header.i. If you only need the security object
You have two options:
A. Use this unified endpoint and return only security using fields
This costs 2 credits in total (not 1 + 2).
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=2.56.188.34&include=security&fields=security'1{
2 "ip": "2.56.188.34",
3 "security": {
4 "threat_score": 80,
5 "is_tor": false,
6 "is_proxy": true,
7 "proxy_provider_names": [
8 "Zyte Proxy"
9 ],
10 "proxy_confidence_score": 90,
11 "proxy_last_seen": "2025-12-12",
12 "is_residential_proxy": true,
13 "is_vpn": true,
14 "vpn_provider_names": [
15 "Nord VPN"
16 ],
17 "vpn_confidence_score": 90,
18 "vpn_last_seen": "2026-01-19",
19 "is_relay": false,
20 "relay_provider_name": "",
21 "is_anonymous": true,
22 "is_known_attacker": true,
23 "is_bot": false,
24 "is_spam": false,
25 "is_cloud_provider": true,
26 "cloud_provider_name": "Packethub S.A."
27 }
28}B. Use the dedicated Security endpoint ( /v3/security )
See the IP Security API documentation. Requests to /v3/security always cost 2 credits, since the endpoint returns security data only.
VI. Abuse Contact Information for an IP Address ( include=abuse parameter)
IP Geolocation API can also provide abuse contact information of an IP address on all the paid API subscriptions, but doesn't include it in the response by default. To get abuse contact information for any IPv4/IPv6 address along with the geolocation information, you must pass the include=abuse as a query parameter in the request URL.
An example request and response for this parameter is shown below.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=abuse'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "...": "..."
5 },
6 "abuse": {
7 "route": "91.128.0.0/14",
8 "country": "SE",
9 "name": "Swipnet Staff",
10 "organization": "",
11 "kind": "group",
12 "address": "Tele2 AB/Swedish IP Network IP Registry Torshamnsgatan 17 164 40 Kista SWEDEN",
13 "emails": [
14 "abuse@tele2.com"
15 ],
16 "phone_numbers": [
17 "+46 8 5626 42 10"
18 ]
19 },
20 "country_metadata": {
21 "...": "..."
22 },
23 "network": {
24 "...": "..."
25 },
26 "currency": {
27 "...": "..."
28 },
29 "asn": {
30 "...": "..."
31 },
32 "company": {
33 "...": "..."
34 },
35 "time_zone": {
36 "...": "..."
37 }
38}security and abuse ) costs 1 credit, the total becomes 2 credits when abuse is included. For the exact charge on any request, check the X-Credits-Charged response header.i. If you only need the abuse object
You have two options:
A. Use this unified endpoint and return only abuse using fields
This costs 1 credit in total (not 1 + 1).
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=abuse&fields=abuse'1{
2 "ip": "91.128.103.196",
3 "abuse": {
4 "route": "91.128.0.0/14",
5 "country": "SE",
6 "name": "Swipnet Staff",
7 "organization": "",
8 "kind": "group",
9 "address": "Tele2 AB/Swedish IP Network IP Registry Torshamnsgatan 17 164 40 Kista SWEDEN",
10 "emails": [
11 "abuse@tele2.com"
12 ],
13 "phone_numbers": [
14 "+46 8 5626 42 10"
15 ]
16 }
17}B. Use the dedicated Abuse endpoint ( /v3/abuse )
See the IP Abuse Contact API documentation. Requests to /v3/abuse always cost 1 credit, since the endpoint returns abuse contact data only.
2. Include Everything in One API Call ( include=* )
Use this option when you want IP geolocation plus all the available additional data in a single response.
You can include all additional data in the IP Geolocation lookup response in two ways:
-
include=*: This option includes all additional data modules (geo_accuracy, dma_code, user_agent, security, abuse, hostname) in the response. - Include each module separately: You can also include all additional data by specifying each module name in the include parameter, separated by commas. For example:
include=geo_accuracy,dma_code,user_agent,security,abuse,hostname.
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=security,abuse,user_agent,dma_code,geo_accuracy,hostname'curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&include=*'1{
2 "ip": "91.128.103.196",
3 "hostname": "91.128.103.196",
4 "location": {
5 "continent_code": "EU",
6 "continent_name": "Europe",
7 "country_code2": "SE",
8 "country_code3": "SWE",
9 "country_name": "Sweden",
10 "country_name_official": "Kingdom of Sweden",
11 "country_capital": "Stockholm",
12 "state_prov": "Stockholms län",
13 "state_code": "SE-AB",
14 "district": "Stockholm",
15 "city": "Stockholm",
16 "locality": "Stockholm",
17 "accuracy_radius": "4.395",
18 "confidence": "high",
19 "dma_code": "",
20 "zipcode": "164 40",
21 "latitude": "59.40510",
22 "longitude": "17.95510",
23 "is_eu": true,
24 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
25 "geoname_id": "9972319",
26 "country_emoji": "🇸🇪"
27 },
28 "country_metadata": {
29 "calling_code": "+46",
30 "tld": ".se",
31 "languages": [
32 "sv-SE",
33 "se",
34 "sma",
35 "fi-SE"
36 ]
37 },
38 "network": {
39 "connection_type": "",
40 "route": "91.128.0.0/14",
41 "is_anycast": false
42 },
43 "currency": {
44 "code": "SEK",
45 "name": "Swedish Krona",
46 "symbol": "kr"
47 },
48 "asn": {
49 "as_number": "AS1257",
50 "organization": "Tele2 Sverige AB",
51 "country": "SE",
52 "type": "ISP",
53 "domain": "tele2.com",
54 "date_allocated": "2024-12-13",
55 "rir": "RIPE"
56 },
57 "company": {
58 "name": "Tele2 Sverige AB",
59 "type": "ISP",
60 "domain": "tele2.com"
61 },
62 "security": {
63 "threat_score": 0,
64 "is_tor": false,
65 "is_proxy": false,
66 "proxy_provider_names": [],
67 "proxy_confidence_score": 0,
68 "proxy_last_seen": "",
69 "is_residential_proxy": false,
70 "is_vpn": false,
71 "vpn_provider_names": [],
72 "vpn_confidence_score": 0,
73 "vpn_last_seen": "",
74 "is_relay": false,
75 "relay_provider_name": "",
76 "is_anonymous": false,
77 "is_known_attacker": false,
78 "is_bot": false,
79 "is_spam": false,
80 "is_cloud_provider": false,
81 "cloud_provider_name": ""
82 },
83 "abuse": {
84 "route": "91.128.0.0/14",
85 "country": "SE",
86 "name": "Swipnet Staff",
87 "organization": "",
88 "kind": "group",
89 "address": "Tele2 AB/Swedish IP Network, IP Registry, Torshamnsgatan 17 164 40 Kista SWEDEN",
90 "emails": [
91 "abuse@tele2.com"
92 ],
93 "phone_numbers": [
94 "+46 8 5626 42 10"
95 ]
96 },
97 "time_zone": {
98 "name": "Europe/Stockholm",
99 "offset": 1,
100 "offset_with_dst": 1,
101 "current_time": "2026-02-13 09:19:24.410+0100",
102 "current_time_unix": 1770970764.41,
103 "current_tz_abbreviation": "CET",
104 "current_tz_full_name": "Central European Standard Time",
105 "standard_tz_abbreviation": "CET",
106 "standard_tz_full_name": "Central European Standard Time",
107 "is_dst": false,
108 "dst_savings": 0,
109 "dst_exists": true,
110 "dst_tz_abbreviation": "CEST",
111 "dst_tz_full_name": "Central European Summer Time",
112 "dst_start": {
113 "utc_time": "2026-03-29 TIME 01:00",
114 "duration": "+1.00H",
115 "gap": true,
116 "date_time_after": "2026-03-29 TIME 03:00",
117 "date_time_before": "2026-03-29 TIME 02:00",
118 "overlap": false
119 },
120 "dst_end": {
121 "utc_time": "2026-10-25 TIME 01:00",
122 "duration": "-1.00H",
123 "gap": false,
124 "date_time_after": "2026-10-25 TIME 02:00",
125 "date_time_before": "2026-10-25 TIME 03:00",
126 "overlap": true
127 }
128 },
129 "user_agent": {
130 "user_agent_string": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0",
131 "name": "Edge",
132 "type": "Browser",
133 "version": "143",
134 "version_major": "143",
135 "device": {
136 "name": "Linux Desktop",
137 "type": "Desktop",
138 "brand": "Unknown",
139 "cpu": "Intel x86_64"
140 },
141 "engine": {
142 "name": "Blink",
143 "type": "Browser",
144 "version": "143",
145 "version_major": "143"
146 },
147 "operating_system": {
148 "name": "Linux",
149 "type": "Desktop",
150 "version": "??",
151 "version_major": "??",
152 "build": "??"
153 }
154 }
155}fields and excludes to control which data is returned. Detailed usage for both parameters is covered in the next sections.On Free/Developer plan, using
include=* returns the same default response as a request without include=* . No additional modules are included.security , and 1 for abuse .Filter Responses
We’ve built the API to give you fine granularity. Specify what you want in the query parameter and get only those fields. This saves you processing time, bandwidth, and can improve API response time.
You can filter the API response in two ways using fields and/or excludes query parameters.
1. Get the Required Fields Only ( fields parameter)
First, you can filter the API response by specifying names of the fields that you want instead of getting the full response. Names of the required fields must be passed as a value (comma-separated if there are multiple) in the query Parameter fields of the request. Here are a few examples to get only the required fields:
I. Get Location Information Only
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&fields=location&ip=91.128.103.196'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "continent_code": "EU",
5 "continent_name": "Europe",
6 "country_code2": "SE",
7 "country_code3": "SWE",
8 "country_name": "Sweden",
9 "country_name_official": "Kingdom of Sweden",
10 "country_capital": "Stockholm",
11 "state_prov": "Stockholms län",
12 "state_code": "SE-AB",
13 "district": "Stockholm",
14 "city": "Stockholm",
15 "zipcode": "164 40",
16 "latitude": "59.40510",
17 "longitude": "17.95510",
18 "is_eu": true,
19 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
20 "geoname_id": "9972319",
21 "country_emoji": "🇸🇪"
22 }
23}II. Get country name and ASN organization only
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&fields=location.country_name,asn.organization&ip=91.128.103.196'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "country_name": "Sweden"
5 },
6 "asn": {
7 "organization": "Tele2 Sverige AB"
8 }
9}include parameter here, because the requested fields are part of the default response objects.III. Get only the city, threat score, and VPN status
Because security is not returned by default, include it first, then use fields to select the specific fields you want:
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&include=security&fields=location.city,security.threat_score,security.is_vpn'1{
2 "ip": "2.56.188.34",
3 "location": {
4 "city": "Dallas"
5 },
6 "security": {
7 "threat_score": 80,
8 "is_vpn": true
9 }
10}- If you select a field from an object that is not returned by default (such as
security,user_agent,geo_accuracy,hostname, orabuse), include it first usinginclude=.... - If you list both an object key and one of its fields in
fieldsparameter separated by a comma, the full object will be returned.
e.g.,fields=security,security.threat_score - Use
object_key.field_keyto select nested fields. For root-level fields, use the field name directly (without theobject_keyprefix).
Remove any Unnecessary Fields ( excludes parameter)
Second, you can filter the API response by excluding specific fields (except the ip address) or entire objects you do not need. To do this, pass the object key (for example, currency) or a specific field path (for example, location.continent_code ) in the excludes query parameter.
Use excludes to remove fields or objects you do not need (the ip field is always returned).
- Exclude an entire object:
currency - Exclude a field:
location.continent_code
Below are a few examples showing how to exclude unnecessary fields:
1. Exclude continent code, currency object, and company type
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=91.128.103.196&excludes=location.continent_code,currency,company.type'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "continent_name": "Europe",
5 "country_code2": "SE",
6 "country_code3": "SWE",
7 "country_name": "Sweden",
8 "country_name_official": "Kingdom of Sweden",
9 "country_capital": "Stockholm",
10 "state_prov": "Stockholms län",
11 "state_code": "SE-AB",
12 "district": "Stockholm",
13 "city": "Stockholm",
14 "zipcode": "164 40",
15 "latitude": "59.40510",
16 "longitude": "17.95510",
17 "is_eu": true,
18 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
19 "geoname_id": "9972319",
20 "country_emoji": "🇸🇪"
21 },
22 "country_metadata": {
23 "calling_code": "+46",
24 "tld": ".se",
25 "languages": [
26 "sv-SE",
27 "se",
28 "sma",
29 "fi-SE"
30 ]
31 },
32 "network": {
33 "connection_type": "",
34 "route": "91.128.0.0/14",
35 "is_anycast": false
36 },
37 "asn": {
38 "as_number": "AS1257",
39 "organization": "Tele2 Sverige AB",
40 "country": "SE",
41 "type": "ISP",
42 "domain": "tele2.com",
43 "date_allocated": "2024-12-13",
44 "rir": "RIPE"
45 },
46 "company": {
47 "name": "Tele2 Sverige AB",
48 "domain": "tele2.com"
49 },
50 "time_zone": {
51 "name": "Europe/Stockholm",
52 "offset": 1,
53 "offset_with_dst": 1,
54 "current_time": "2026-02-13 10:16:01.920+0100",
55 "current_time_unix": 1770974161.92,
56 "current_tz_abbreviation": "CET",
57 "current_tz_full_name": "Central European Standard Time",
58 "standard_tz_abbreviation": "CET",
59 "standard_tz_full_name": "Central European Standard Time",
60 "is_dst": false,
61 "dst_savings": 0,
62 "dst_exists": true,
63 "dst_tz_abbreviation": "CEST",
64 "dst_tz_full_name": "Central European Summer Time",
65 "dst_start": {
66 "utc_time": "2026-03-29 TIME 01:00",
67 "duration": "+1.00H",
68 "gap": true,
69 "date_time_after": "2026-03-29 TIME 03:00",
70 "date_time_before": "2026-03-29 TIME 02:00",
71 "overlap": false
72 },
73 "dst_end": {
74 "utc_time": "2026-10-25 TIME 01:00",
75 "duration": "-1.00H",
76 "gap": false,
77 "date_time_after": "2026-10-25 TIME 02:00",
78 "date_time_before": "2026-10-25 TIME 03:00",
79 "overlap": true
80 }
81 }
82}You can see that the currency object has been removed from the response. Similarly, company.type and location.continent_code are excluded as well.
- If you pass a field or object in excludes that does not exist, no error is returned. The API will still respond using the other parameters.
- If a field or object is listed in both
includeandexcludes, include takes priority. - To exclude fields from an object that is not returned by default (such as
securityorabuse), include it first.
Example: include=security&excludes=security.threat_score
Combine fields and excludes
You can use fields and excludes together to shape the response exactly the way you want.
A common pattern is:
- Use
fieldsto limit the response to a specific object (for example,locationonly). - Use
excludesto remove a few fields from that object that you do not need.
1. Get location only and exclude continent fields
curl -X GET 'https://api.ipgeolocation.io/v3/ipgeo?apiKey=API_KEY&ip=107.161.145.197&fields=location&excludes=location.continent_code,location.continent_name'1{
2 "ip": "91.128.103.196",
3 "location": {
4 "country_code2": "SE",
5 "country_code3": "SWE",
6 "country_name": "Sweden",
7 "country_name_official": "Kingdom of Sweden",
8 "country_capital": "Stockholm",
9 "state_prov": "Stockholms län",
10 "state_code": "SE-AB",
11 "district": "Stockholm",
12 "city": "Stockholm",
13 "zipcode": "164 40",
14 "latitude": "59.40510",
15 "longitude": "17.95510",
16 "is_eu": true,
17 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
18 "geoname_id": "9972319",
19 "country_emoji": "🇸🇪"
20 }
21}fields and excludes , it will be included in the response. fields takes priority.Bulk IP Geolocation Lookup API
This feature is available only on our paid API subscriptions.
The bulk endpoint allows you to perform IP geolocation lookup for multiple IPv4, IPv6, or domain names (maximum 50,000) in a single request.
- Bulk lookup supports the same query parameters as the single lookup (
include,excludes,fields,lang, andoutput).
- For bulk lookups, the requests count and quota billing are calculated per valid IP address or domain name submitted, using the same credit rules as single lookups (base 1 credit, +2 for Security, +1 for Abuse); bogon, private, and malformed IPs are not counted, and the exact charge is returned in the
X-Credits-Chargedresponse header. - The
X-Successful-Recordresponse header is also returned which shows how many IP addresses in the request returned valid data with an HTTP200status; invalid entries are excluded from this count.
1. Bulk lookup request
Send a POST request and pass the ips array as JSON.
curl -X POST 'https://api.ipgeolocation.io/v3/ipgeo-bulk?apiKey=API_KEY' \
-H 'Content-Type: application/json' \
-d '{"ips":["91.128.103.196","91.128.103.198","91.128.103.194"]}'1[
2 {
3 "ip": "91.128.103.196",
4 "location": {
5 "continent_code": "EU",
6 "continent_name": "Europe",
7 "country_code2": "SE",
8 "country_code3": "SWE",
9 "country_name": "Sweden",
10 "country_name_official": "Kingdom of Sweden",
11 "country_capital": "Stockholm",
12 "state_prov": "Stockholms län",
13 "state_code": "SE-AB",
14 "district": "Stockholm",
15 "city": "Stockholm",
16 "zipcode": "164 40",
17 "latitude": "59.40510",
18 "longitude": "17.95510",
19 "is_eu": true,
20 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
21 "geoname_id": "9972319",
22 "country_emoji": "🇸🇪"
23 },
24 "country_metadata": {
25 "calling_code": "+46",
26 "tld": ".se",
27 "languages": [
28 "sv-SE",
29 "se",
30 "sma",
31 "fi-SE"
32 ]
33 },
34 "network": {
35 "connection_type": "",
36 "route": "91.128.0.0/14",
37 "is_anycast": false
38 },
39 "currency": {
40 "code": "SEK",
41 "name": "Swedish Krona",
42 "symbol": "kr"
43 },
44 "asn": {
45 "as_number": "AS1257",
46 "organization": "Tele2 Sverige AB",
47 "country": "SE",
48 "type": "ISP",
49 "domain": "tele2.com",
50 "date_allocated": "2024-12-13",
51 "rir": "RIPE"
52 },
53 "company": {
54 "name": "Tele2 Sverige AB",
55 "type": "ISP",
56 "domain": "tele2.com"
57 },
58 "time_zone": {
59 "name": "Europe/Stockholm",
60 "offset": 1,
61 "offset_with_dst": 1,
62 "current_time": "2026-02-13 10:44:22.701+0100",
63 "current_time_unix": 1770975862.701,
64 "current_tz_abbreviation": "CET",
65 "current_tz_full_name": "Central European Standard Time",
66 "standard_tz_abbreviation": "CET",
67 "standard_tz_full_name": "Central European Standard Time",
68 "is_dst": false,
69 "dst_savings": 0,
70 "dst_exists": true,
71 "dst_tz_abbreviation": "CEST",
72 "dst_tz_full_name": "Central European Summer Time",
73 "dst_start": {
74 "utc_time": "2026-03-29 TIME 01:00",
75 "duration": "+1.00H",
76 "gap": true,
77 "date_time_after": "2026-03-29 TIME 03:00",
78 "date_time_before": "2026-03-29 TIME 02:00",
79 "overlap": false
80 },
81 "dst_end": {
82 "utc_time": "2026-10-25 TIME 01:00",
83 "duration": "-1.00H",
84 "gap": false,
85 "date_time_after": "2026-10-25 TIME 02:00",
86 "date_time_before": "2026-10-25 TIME 03:00",
87 "overlap": true
88 }
89 }
90 },
91 {
92 "ip": "91.128.103.198",
93 "location": {
94 "continent_code": "EU",
95 "continent_name": "Europe",
96 "country_code2": "SE",
97 "country_code3": "SWE",
98 "country_name": "Sweden",
99 "country_name_official": "Kingdom of Sweden",
100 "country_capital": "Stockholm",
101 "state_prov": "Stockholms län",
102 "state_code": "SE-AB",
103 "district": "Stockholm",
104 "city": "Stockholm",
105 "zipcode": "164 40",
106 "latitude": "59.40510",
107 "longitude": "17.95510",
108 "is_eu": true,
109 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
110 "geoname_id": "9972319",
111 "country_emoji": "🇸🇪"
112 },
113 "country_metadata": {
114 "calling_code": "+46",
115 "tld": ".se",
116 "languages": [
117 "sv-SE",
118 "se",
119 "sma",
120 "fi-SE"
121 ]
122 },
123 "network": {
124 "connection_type": "",
125 "route": "91.128.0.0/14",
126 "is_anycast": false
127 },
128 "currency": {
129 "code": "SEK",
130 "name": "Swedish Krona",
131 "symbol": "kr"
132 },
133 "asn": {
134 "as_number": "AS1257",
135 "organization": "Tele2 Sverige AB",
136 "country": "SE",
137 "type": "ISP",
138 "domain": "tele2.com",
139 "date_allocated": "2024-12-13",
140 "rir": "RIPE"
141 },
142 "company": {
143 "name": "Tele2 Sverige AB",
144 "type": "ISP",
145 "domain": "tele2.com"
146 },
147 "time_zone": {
148 "name": "Europe/Stockholm",
149 "offset": 1,
150 "offset_with_dst": 1,
151 "current_time": "2026-02-13 10:44:22.701+0100",
152 "current_time_unix": 1770975862.701,
153 "current_tz_abbreviation": "CET",
154 "current_tz_full_name": "Central European Standard Time",
155 "standard_tz_abbreviation": "CET",
156 "standard_tz_full_name": "Central European Standard Time",
157 "is_dst": false,
158 "dst_savings": 0,
159 "dst_exists": true,
160 "dst_tz_abbreviation": "CEST",
161 "dst_tz_full_name": "Central European Summer Time",
162 "dst_start": {
163 "utc_time": "2026-03-29 TIME 01:00",
164 "duration": "+1.00H",
165 "gap": true,
166 "date_time_after": "2026-03-29 TIME 03:00",
167 "date_time_before": "2026-03-29 TIME 02:00",
168 "overlap": false
169 },
170 "dst_end": {
171 "utc_time": "2026-10-25 TIME 01:00",
172 "duration": "-1.00H",
173 "gap": false,
174 "date_time_after": "2026-10-25 TIME 02:00",
175 "date_time_before": "2026-10-25 TIME 03:00",
176 "overlap": true
177 }
178 }
179 },
180 {
181 "ip": "91.128.103.194",
182 "location": {
183 "continent_code": "EU",
184 "continent_name": "Europe",
185 "country_code2": "SE",
186 "country_code3": "SWE",
187 "country_name": "Sweden",
188 "country_name_official": "Kingdom of Sweden",
189 "country_capital": "Stockholm",
190 "state_prov": "Stockholms län",
191 "state_code": "SE-AB",
192 "district": "Stockholm",
193 "city": "Stockholm",
194 "zipcode": "164 40",
195 "latitude": "59.40510",
196 "longitude": "17.95510",
197 "is_eu": true,
198 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
199 "geoname_id": "9972319",
200 "country_emoji": "🇸🇪"
201 },
202 "country_metadata": {
203 "calling_code": "+46",
204 "tld": ".se",
205 "languages": [
206 "sv-SE",
207 "se",
208 "sma",
209 "fi-SE"
210 ]
211 },
212 "network": {
213 "connection_type": "",
214 "route": "91.128.0.0/14",
215 "is_anycast": false
216 },
217 "currency": {
218 "code": "SEK",
219 "name": "Swedish Krona",
220 "symbol": "kr"
221 },
222 "asn": {
223 "as_number": "AS1257",
224 "organization": "Tele2 Sverige AB",
225 "country": "SE",
226 "type": "ISP",
227 "domain": "tele2.com",
228 "date_allocated": "2024-12-13",
229 "rir": "RIPE"
230 },
231 "company": {
232 "name": "Tele2 Sverige AB",
233 "type": "ISP",
234 "domain": "tele2.com"
235 },
236 "time_zone": {
237 "name": "Europe/Stockholm",
238 "offset": 1,
239 "offset_with_dst": 1,
240 "current_time": "2026-02-13 10:44:22.701+0100",
241 "current_time_unix": 1770975862.701,
242 "current_tz_abbreviation": "CET",
243 "current_tz_full_name": "Central European Standard Time",
244 "standard_tz_abbreviation": "CET",
245 "standard_tz_full_name": "Central European Standard Time",
246 "is_dst": false,
247 "dst_savings": 0,
248 "dst_exists": true,
249 "dst_tz_abbreviation": "CEST",
250 "dst_tz_full_name": "Central European Summer Time",
251 "dst_start": {
252 "utc_time": "2026-03-29 TIME 01:00",
253 "duration": "+1.00H",
254 "gap": true,
255 "date_time_after": "2026-03-29 TIME 03:00",
256 "date_time_before": "2026-03-29 TIME 02:00",
257 "overlap": false
258 },
259 "dst_end": {
260 "utc_time": "2026-10-25 TIME 01:00",
261 "duration": "-1.00H",
262 "gap": false,
263 "date_time_after": "2026-10-25 TIME 02:00",
264 "date_time_before": "2026-10-25 TIME 03:00",
265 "overlap": true
266 }
267 }
268 }
269]2. Bulk lookup with additional request parameters
This example uses include, fields, and excludes together. The goal is to return only:
-
location.city - the full
currencyobject) - the
securityobject, but withoutsecurity.threat_score
Here is how each parameter is used:
- Include
security(not returned by default):include=security - Select only the required objects and fields:
fields=location.city,currency,security - Exclude
threat_scorefromsecurity:excludes=security.threat_score
curl -X POST 'https://api.ipgeolocation.io/v3/ipgeo-bulk?apiKey=API_KEY&include=security&fields=location.city,currency,security&excludes=security.threat_score' \
-H 'Content-Type: application/json' \
-d '{"ips":["2.56.188.34","91.128.103.196","107.161.145.198"]}'1[
2 {
3 "ip": "2.56.188.34",
4 "location": {
5 "city": "Dallas"
6 },
7 "currency": {
8 "code": "USD",
9 "name": "US Dollar",
10 "symbol": "$"
11 },
12 "security": {
13 "is_tor": false,
14 "is_proxy": true,
15 "proxy_provider_names": [
16 "Zyte Proxy"
17 ],
18 "proxy_confidence_score": 90,
19 "proxy_last_seen": "2025-12-12",
20 "is_residential_proxy": true,
21 "is_vpn": true,
22 "vpn_provider_names": [
23 "Nord VPN"
24 ],
25 "vpn_confidence_score": 90,
26 "vpn_last_seen": "2026-01-19",
27 "is_relay": false,
28 "relay_provider_name": "",
29 "is_anonymous": true,
30 "is_known_attacker": true,
31 "is_bot": false,
32 "is_spam": false,
33 "is_cloud_provider": true,
34 "cloud_provider_name": "Packethub S.A."
35 }
36 },
37 {
38 "ip": "91.128.103.196",
39 "location": {
40 "city": "Stockholm"
41 },
42 "currency": {
43 "code": "SEK",
44 "name": "Swedish Krona",
45 "symbol": "kr"
46 },
47 "security": {
48 "is_tor": false,
49 "is_proxy": false,
50 "proxy_provider_names": [],
51 "proxy_confidence_score": 0,
52 "proxy_last_seen": "",
53 "is_residential_proxy": false,
54 "is_vpn": false,
55 "vpn_provider_names": [],
56 "vpn_confidence_score": 0,
57 "vpn_last_seen": "",
58 "is_relay": false,
59 "relay_provider_name": "",
60 "is_anonymous": false,
61 "is_known_attacker": false,
62 "is_bot": false,
63 "is_spam": false,
64 "is_cloud_provider": false,
65 "cloud_provider_name": ""
66 }
67 },
68 {
69 "ip": "107.161.145.198",
70 "location": {
71 "city": "Philadelphia"
72 },
73 "currency": {
74 "code": "USD",
75 "name": "US Dollar",
76 "symbol": "$"
77 },
78 "security": {
79 "is_tor": false,
80 "is_proxy": false,
81 "proxy_provider_names": [],
82 "proxy_confidence_score": 0,
83 "proxy_last_seen": "",
84 "is_residential_proxy": false,
85 "is_vpn": false,
86 "vpn_provider_names": [],
87 "vpn_confidence_score": 0,
88 "vpn_last_seen": "",
89 "is_relay": false,
90 "relay_provider_name": "",
91 "is_anonymous": false,
92 "is_known_attacker": true,
93 "is_bot": false,
94 "is_spam": false,
95 "is_cloud_provider": true,
96 "cloud_provider_name": "LightWave Networks"
97 }
98 }
99]3. Bulk Lookup Response for Invalid IPs
In a bulk request, each IP address is processed independently.
If an IP address is invalid (non-public, non-routable, or malformed), the API returns an object containing only a descriptive message field for that entry along with the valid public IP address responses.
curl -X POST 'https://api.ipgeolocation.io/v3/ipgeo-bulk?apiKey=API_KEY' \
-H 'Content-Type: application/json' \
-d '{"ips":["10.0.0.0","91.128.103.196","107.161.145.198"]}'1[
2 {
3 "message": "'10.0.0.0' is a bogon IP address."
4 },
5 {
6 "ip": "91.128.103.196",
7 "location": {
8 "continent_code": "EU",
9 "continent_name": "Europe",
10 "country_code2": "SE",
11 "country_code3": "SWE",
12 "country_name": "Sweden",
13 "country_name_official": "Kingdom of Sweden",
14 "country_capital": "Stockholm",
15 "state_prov": "Stockholms län",
16 "state_code": "SE-AB",
17 "district": "Stockholm",
18 "city": "Stockholm",
19 "zipcode": "164 40",
20 "latitude": "59.40510",
21 "longitude": "17.95510",
22 "is_eu": true,
23 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
24 "geoname_id": "9972319",
25 "country_emoji": "🇸🇪"
26 },
27 "country_metadata": {
28 "calling_code": "+46",
29 "tld": ".se",
30 "languages": [
31 "sv-SE",
32 "se",
33 "sma",
34 "fi-SE"
35 ]
36 },
37 "network": {
38 "connection_type": "",
39 "route": "91.128.0.0/14",
40 "is_anycast": false
41 },
42 "currency": {
43 "code": "SEK",
44 "name": "Swedish Krona",
45 "symbol": "kr"
46 },
47 "asn": {
48 "as_number": "AS1257",
49 "organization": "Tele2 Sverige AB",
50 "country": "SE",
51 "type": "ISP",
52 "domain": "tele2.com",
53 "date_allocated": "2024-12-13",
54 "rir": "RIPE"
55 },
56 "company": {
57 "name": "Tele2 Sverige AB",
58 "type": "ISP",
59 "domain": "tele2.com"
60 },
61 "time_zone": {
62 "name": "Europe/Stockholm",
63 "offset": 1,
64 "offset_with_dst": 1,
65 "current_time": "2026-02-24 18:57:36.111+0100",
66 "current_time_unix": 1771955856.111,
67 "current_tz_abbreviation": "CET",
68 "current_tz_full_name": "Central European Standard Time",
69 "standard_tz_abbreviation": "CET",
70 "standard_tz_full_name": "Central European Standard Time",
71 "is_dst": false,
72 "dst_savings": 0,
73 "dst_exists": true,
74 "dst_tz_abbreviation": "CEST",
75 "dst_tz_full_name": "Central European Summer Time",
76 "dst_start": {
77 "utc_time": "2026-03-29 TIME 01:00",
78 "duration": "+1.00H",
79 "gap": true,
80 "date_time_after": "2026-03-29 TIME 03:00",
81 "date_time_before": "2026-03-29 TIME 02:00",
82 "overlap": false
83 },
84 "dst_end": {
85 "utc_time": "2026-10-25 TIME 01:00",
86 "duration": "-1.00H",
87 "gap": false,
88 "date_time_after": "2026-10-25 TIME 02:00",
89 "date_time_before": "2026-10-25 TIME 03:00",
90 "overlap": true
91 }
92 }
93 },
94 {
95 "ip": "107.161.145.198",
96 "location": {
97 "continent_code": "NA",
98 "continent_name": "North America",
99 "country_code2": "US",
100 "country_code3": "USA",
101 "country_name": "United States",
102 "country_name_official": "United States of America",
103 "country_capital": "Washington, D.C.",
104 "state_prov": "Pennsylvania",
105 "state_code": "US-PA",
106 "district": "Philadelphia County",
107 "city": "Philadelphia",
108 "zipcode": "19102",
109 "latitude": "39.95258",
110 "longitude": "-75.16522",
111 "is_eu": false,
112 "country_flag": "https://ipgeolocation.io/static/flags/us_64.png",
113 "geoname_id": "9849057",
114 "country_emoji": "🇺🇸"
115 },
116 "country_metadata": {
117 "calling_code": "+1",
118 "tld": ".us",
119 "languages": [
120 "en-US",
121 "es-US",
122 "haw",
123 "fr"
124 ]
125 },
126 "network": {
127 "connection_type": "",
128 "route": "107.161.144.0/23",
129 "is_anycast": false
130 },
131 "currency": {
132 "code": "USD",
133 "name": "US Dollar",
134 "symbol": "$"
135 },
136 "asn": {
137 "as_number": "AS12167",
138 "organization": "LightWave Networks",
139 "country": "US",
140 "type": "HOSTING",
141 "domain": "lightwavenetworks.com",
142 "date_allocated": "2024-11-14",
143 "rir": "ARIN"
144 },
145 "company": {
146 "name": "LightWave Networks",
147 "type": "HOSTING",
148 "domain": "lightwavenetworks.com"
149 },
150 "time_zone": {
151 "name": "America/New_York",
152 "offset": -5,
153 "offset_with_dst": -5,
154 "current_time": "2026-02-24 12:57:36.111-0500",
155 "current_time_unix": 1771955856.111,
156 "current_tz_abbreviation": "EST",
157 "current_tz_full_name": "Eastern Standard Time",
158 "standard_tz_abbreviation": "EST",
159 "standard_tz_full_name": "Eastern Standard Time",
160 "is_dst": false,
161 "dst_savings": 0,
162 "dst_exists": true,
163 "dst_tz_abbreviation": "EDT",
164 "dst_tz_full_name": "Eastern Daylight Time",
165 "dst_start": {
166 "utc_time": "2026-03-08 TIME 07:00",
167 "duration": "+1.00H",
168 "gap": true,
169 "date_time_after": "2026-03-08 TIME 03:00",
170 "date_time_before": "2026-03-08 TIME 02:00",
171 "overlap": false
172 },
173 "dst_end": {
174 "utc_time": "2026-11-01 TIME 06:00",
175 "duration": "-1.00H",
176 "gap": false,
177 "date_time_after": "2026-11-01 TIME 01:00",
178 "date_time_before": "2026-11-01 TIME 02:00",
179 "overlap": true
180 }
181 }
182 }
183]X-Successful-Record response header indicates how many IP addresses in the request returned valid data with a 200 status. Invalid entries are not included in this count.Plan-wise Reference to IPGeolocation API Response
This section documents every field that can appear in the unified IPGeolocation API response. Each table covers one JSON object, and the Availability column shows the minimum plan required to access that field.
Field availability is cumulative: everything available in the Free plan is also included in any Paid plan.
1. Full Response Examples
I. Free Plan
1{
2 "ip": "91.128.103.196",
3 "location": {
4 "continent_code": "EU",
5 "continent_name": "Europe",
6 "country_code2": "SE",
7 "country_code3": "SWE",
8 "country_name": "Sweden",
9 "country_name_official": "Kingdom of Sweden",
10 "country_capital": "Stockholm",
11 "state_prov": "Stockholms län",
12 "state_code": "SE-AB",
13 "district": "Stockholm",
14 "city": "Stockholm",
15 "zipcode": "164 40",
16 "latitude": "59.40510",
17 "longitude": "17.95510",
18 "is_eu": true,
19 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
20 "geoname_id": "9972319",
21 "country_emoji": "🇸🇪"
22 },
23 "country_metadata": {
24 "calling_code": "+46",
25 "tld": ".se",
26 "languages": [
27 "sv-SE",
28 "se",
29 "sma",
30 "fi-SE"
31 ]
32 },
33 "currency": {
34 "code": "SEK",
35 "name": "Swedish Krona",
36 "symbol": "kr"
37 },
38 "asn": {
39 "as_number": "AS1257",
40 "organization": "Tele2 Sverige AB",
41 "country": "SE"
42 },
43 "time_zone": {
44 "name": "Europe/Stockholm",
45 "offset": 1,
46 "offset_with_dst": 1,
47 "current_time": "2026-02-13 10:54:15.252+0100",
48 "current_time_unix": 1770976455.252,
49 "current_tz_abbreviation": "CET",
50 "current_tz_full_name": "Central European Standard Time",
51 "standard_tz_abbreviation": "CET",
52 "standard_tz_full_name": "Central European Standard Time",
53 "is_dst": false,
54 "dst_savings": 0,
55 "dst_exists": true,
56 "dst_tz_abbreviation": "CEST",
57 "dst_tz_full_name": "Central European Summer Time",
58 "dst_start": {
59 "utc_time": "2026-03-29 TIME 01:00",
60 "duration": "+1.00H",
61 "gap": true,
62 "date_time_after": "2026-03-29 TIME 03:00",
63 "date_time_before": "2026-03-29 TIME 02:00",
64 "overlap": false
65 },
66 "dst_end": {
67 "utc_time": "2026-10-25 TIME 01:00",
68 "duration": "-1.00H",
69 "gap": false,
70 "date_time_after": "2026-10-25 TIME 02:00",
71 "date_time_before": "2026-10-25 TIME 03:00",
72 "overlap": true
73 }
74 }
75}II. Paid Plan
1{
2 "ip": "91.128.103.196",
3 "hostname": "91.128.103.196",
4 "location": {
5 "continent_code": "EU",
6 "continent_name": "Europe",
7 "country_code2": "SE",
8 "country_code3": "SWE",
9 "country_name": "Sweden",
10 "country_name_official": "Kingdom of Sweden",
11 "country_capital": "Stockholm",
12 "state_prov": "Stockholms län",
13 "state_code": "SE-AB",
14 "district": "Stockholm",
15 "city": "Stockholm",
16 "locality": "Stockholm",
17 "accuracy_radius": "12.251",
18 "confidence": "high",
19 "dma_code": "",
20 "zipcode": "164 40",
21 "latitude": "59.40510",
22 "longitude": "17.95510",
23 "is_eu": true,
24 "country_flag": "https://ipgeolocation.io/static/flags/se_64.png",
25 "geoname_id": "9972319",
26 "country_emoji": "🇸🇪"
27 },
28 "country_metadata": {
29 "calling_code": "+46",
30 "tld": ".se",
31 "languages": [
32 "sv-SE",
33 "se",
34 "sma",
35 "fi-SE"
36 ]
37 },
38 "network": {
39 "connection_type": "",
40 "route": "91.128.0.0/14",
41 "is_anycast": false
42 },
43 "currency": {
44 "code": "SEK",
45 "name": "Swedish Krona",
46 "symbol": "kr"
47 },
48 "asn": {
49 "as_number": "AS1257",
50 "organization": "Tele2 Sverige AB",
51 "country": "SE",
52 "type": "ISP",
53 "domain": "tele2.com",
54 "date_allocated": "2024-12-13",
55 "rir": "RIPE"
56 },
57 "company": {
58 "name": "Tele2 Sverige AB",
59 "type": "ISP",
60 "domain": "tele2.com"
61 },
62 "security": {
63 "threat_score": 0,
64 "is_tor": false,
65 "is_proxy": false,
66 "proxy_provider_names": [],
67 "proxy_confidence_score": 0,
68 "proxy_last_seen": "",
69 "is_residential_proxy": false,
70 "is_vpn": false,
71 "vpn_provider_names": [],
72 "vpn_confidence_score": 0,
73 "vpn_last_seen": "",
74 "is_relay": false,
75 "relay_provider_name": "",
76 "is_anonymous": false,
77 "is_known_attacker": false,
78 "is_bot": false,
79 "is_spam": false,
80 "is_cloud_provider": false,
81 "cloud_provider_name": ""
82 },
83 "abuse": {
84 "route": "91.128.0.0/14",
85 "country": "SE",
86 "name": "Swipnet Staff",
87 "organization": "",
88 "kind": "group",
89 "address": "Tele2 AB/Swedish IP Network, IP Registry, Torshamnsgatan 17 164 40 Kista SWEDEN",
90 "emails": [
91 "abuse@tele2.com"
92 ],
93 "phone_numbers": [
94 "+46 8 5626 42 10"
95 ]
96 },
97 "time_zone": {
98 "name": "Europe/Stockholm",
99 "offset": 1,
100 "offset_with_dst": 1,
101 "current_time": "2026-02-13 10:55:01.983+0100",
102 "current_time_unix": 1770976501.983,
103 "current_tz_abbreviation": "CET",
104 "current_tz_full_name": "Central European Standard Time",
105 "standard_tz_abbreviation": "CET",
106 "standard_tz_full_name": "Central European Standard Time",
107 "is_dst": false,
108 "dst_savings": 0,
109 "dst_exists": true,
110 "dst_tz_abbreviation": "CEST",
111 "dst_tz_full_name": "Central European Summer Time",
112 "dst_start": {
113 "utc_time": "2026-03-29 TIME 01:00",
114 "duration": "+1.00H",
115 "gap": true,
116 "date_time_after": "2026-03-29 TIME 03:00",
117 "date_time_before": "2026-03-29 TIME 02:00",
118 "overlap": false
119 },
120 "dst_end": {
121 "utc_time": "2026-10-25 TIME 01:00",
122 "duration": "-1.00H",
123 "gap": false,
124 "date_time_after": "2026-10-25 TIME 02:00",
125 "date_time_before": "2026-10-25 TIME 03:00",
126 "overlap": true
127 }
128 },
129 "user_agent": {
130 "user_agent_string": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0",
131 "name": "Edge",
132 "type": "Browser",
133 "version": "143",
134 "version_major": "143",
135 "device": {
136 "name": "Linux Desktop",
137 "type": "Desktop",
138 "brand": "Unknown",
139 "cpu": "Intel x86_64"
140 },
141 "engine": {
142 "name": "Blink",
143 "type": "Browser",
144 "version": "143",
145 "version_major": "143"
146 },
147 "operating_system": {
148 "name": "Linux",
149 "type": "Desktop",
150 "version": "??",
151 "version_major": "??",
152 "build": "??"
153 }
154 }
155}Reference to IPGeolocation API Response
1. Standalone fields reference
These fields can appear at the root level of the response.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Standalone fields reference",
"description": "Schema for Standalone fields reference",
"type": "object",
"additionalProperties": false,
"properties": {
"ip": {
"type": "string",
"description": "The IP address used for the lookup (IPv4 or IPv6).",
"availability": "FREE",
"can-be-empty": false
},
"domain": {
"type": "string",
"description": "The input domain, returned only for domain-based lookups.",
"availability": "PAID",
"can-be-empty": false
},
"hostname": {
"type": "string",
"description": "Reverse DNS hostname (PTR) for the input IP; returns the input IP if not resolvable.",
"availability": "PAID",
"can-be-empty": false
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| ip | string | The IP address used for the lookup (IPv4 or IPv6). | No | FREE |
| domain | string | The input domain, returned only for domain-based lookups. | No | PAID |
| hostname | string | Reverse DNS hostname (PTR) for the input IP; returns the input IP if not resolvable. | No | PAID |
2. location json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "location json object reference",
"description": "Schema for location json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"continent_code": {
"type": "string",
"description": "Continent code as 2 uppercase letters (set: AF, AN, AS, EU, NA, OC, SA).",
"availability": "FREE",
"can-be-empty": false
},
"continent_name": {
"type": "string",
"description": "Continent name, like Europe.",
"availability": "FREE",
"can-be-empty": false
},
"country_code2": {
"type": "string",
"description": "Country code in ISO 3166-1 alpha-2 format (2 uppercase letters), like CZ.",
"availability": "FREE",
"can-be-empty": false
},
"country_code3": {
"type": "string",
"description": "Country code in ISO 3166-1 alpha-3 format (3 uppercase letters), like CZE.",
"availability": "FREE",
"can-be-empty": false
},
"country_name": {
"type": "string",
"description": "Common country name, like Czech Republic.",
"availability": "FREE",
"can-be-empty": false
},
"country_name_official": {
"type": "string",
"description": "Official country name (ISO-style), when different from country_name.",
"availability": "FREE",
"can-be-empty": false
},
"country_capital": {
"type": "string",
"description": "Capital city for the country, like Prague.",
"availability": "FREE",
"can-be-empty": false
},
"state_prov": {
"type": "string",
"description": "State/province/region name for the IP location.",
"availability": "FREE",
"can-be-empty": true
},
"state_code": {
"type": "string",
"description": "State/province/region code; format varies by country (often ISO 3166-2 or a local short code).",
"availability": "FREE",
"can-be-empty": true
},
"district": {
"type": "string",
"description": "District/county name, if available.",
"availability": "FREE",
"can-be-empty": true
},
"city": {
"type": "string",
"description": "City name, if available.",
"availability": "FREE",
"can-be-empty": true
},
"locality": {
"type": "string",
"description": "Smaller area within the city (neighborhood/suburb); may match city.",
"availability": "PAID",
"can-be-empty": true
},
"accuracy_radius": {
"type": "string",
"description": "Estimated accuracy radius in kilometers (numeric string) around latitude/longitude (example: 9.333).",
"availability": "PAID",
"can-be-empty": true
},
"confidence": {
"type": "string",
"description": "Location confidence level as a lowercase set: low, medium, high.",
"availability": "PAID",
"can-be-empty": true
},
"dma_code": {
"type": "string",
"description": "US-only DMA market code as digits in a string (example: 501).",
"availability": "PAID",
"can-be-empty": true
},
"zipcode": {
"type": "string",
"description": "Postal/ZIP code; format varies by country (digits/letters/spaces), like 779 00.",
"availability": "FREE",
"can-be-empty": true
},
"latitude": {
"type": "string",
"description": "Latitude in decimal degrees (string), range -90 to 90 (example: 49.59378).",
"availability": "FREE",
"can-be-empty": false
},
"longitude": {
"type": "string",
"description": "Longitude in decimal degrees (string), range -180 to 180 (example: 17.25088).",
"availability": "FREE",
"can-be-empty": false
},
"is_eu": {
"type": "boolean",
"description": "true if the country is in the European Union.",
"availability": "FREE",
"can-be-empty": false
},
"country_flag": {
"type": "string",
"description": "Country flag image URL.",
"availability": "FREE",
"can-be-empty": false
},
"geoname_id": {
"type": "string",
"description": "GeoNames place ID as a numeric string (digits), when available.",
"availability": "FREE",
"can-be-empty": true
},
"country_emoji": {
"type": "string",
"description": "Unicode country flag emoji (example: 🇨🇿).",
"availability": "FREE",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| continent_code | string | Continent code as 2 uppercase letters (set: | No | FREE |
| continent_name | string | Continent name, like | No | FREE |
| country_code2 | string | Country code in ISO 3166-1 alpha-2 format (2 uppercase letters), like | No | FREE |
| country_code3 | string | Country code in ISO 3166-1 alpha-3 format (3 uppercase letters), like | No | FREE |
| country_name | string | Common country name, like | No | FREE |
| country_name_official | string | Official country name (ISO-style), when different from | No | FREE |
| country_capital | string | Capital city for the country, like | No | FREE |
| state_prov | string | State/province/region name for the IP location. | Yes | FREE |
| state_code | string | State/province/region code; format varies by country (often ISO 3166-2 or a local short code). | Yes | FREE |
| district | string | District/county name, if available. | Yes | FREE |
| city | string | City name, if available. | Yes | FREE |
| locality | string | Smaller area within the city (neighborhood/suburb); may match | Yes | PAID |
| accuracy_radius | string | Estimated accuracy radius in kilometers (numeric string) around | Yes | PAID |
| confidence | string | Location confidence level as a lowercase set: | Yes | PAID |
| dma_code | string | US-only DMA market code as digits in a string (example: | Yes | PAID |
| zipcode | string | Postal/ZIP code; format varies by country (digits/letters/spaces), like | Yes | FREE |
| latitude | string | Latitude in decimal degrees (string), range | No | FREE |
| longitude | string | Longitude in decimal degrees (string), range | No | FREE |
| is_eu | boolean | | No | FREE |
| country_flag | string | Country flag image URL. | No | FREE |
| geoname_id | string | GeoNames place ID as a numeric string (digits), when available. | Yes | FREE |
| country_emoji | string | Unicode country flag emoji (example: | Yes | FREE |
3. country_metadata json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "country_metadata json object reference",
"description": "Schema for country_metadata json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"calling_code": {
"type": "string",
"description": "International dialing prefix for the country (example: +420).",
"availability": "FREE",
"can-be-empty": false
},
"tld": {
"type": "string",
"description": "Country-code top-level domain assigned to the country (example: .cz).",
"availability": "FREE",
"can-be-empty": false
},
"languages": {
"type": "list of strings",
"description": "List of common language codes spoken in the country (ISO 639-1).",
"availability": "FREE",
"can-be-empty": false
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| calling_code | string | International dialing prefix for the country (example: | No | FREE |
| tld | string | Country-code top-level domain assigned to the country (example: | No | FREE |
| languages | list of strings | List of common language codes spoken in the country (ISO 639-1). | No | FREE |
4. currency json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "currency json object reference",
"description": "Schema for currency json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"code": {
"type": "string",
"description": "Currency code in ISO 4217 format (3 uppercase letters), like USD.",
"availability": "FREE",
"can-be-empty": true
},
"name": {
"type": "string",
"description": "Currency name for the ISO 4217 code, like US Dollar.",
"availability": "FREE",
"can-be-empty": true
},
"symbol": {
"type": "string",
"description": "Currency symbol used for display, like $.",
"availability": "FREE",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| code | string | Currency code in ISO 4217 format (3 uppercase letters), like | Yes | FREE |
| name | string | Currency name for the ISO 4217 code, like | Yes | FREE |
| symbol | string | Currency symbol used for display, like | Yes | FREE |
5. asn json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "asn json object reference",
"description": "Schema for asn json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"as_number": {
"type": "string",
"description": "ASN identifier in AS<number> format (example: AS13036) associated with the IP’s network.",
"availability": "FREE",
"can-be-empty": true
},
"organization": {
"type": "string",
"description": "ASN operator name (typically the organization registered for the ASN).",
"availability": "FREE",
"can-be-empty": true
},
"country": {
"type": "string",
"description": "ASN registration country as ISO 3166-1 alpha-2 (2 uppercase letters), like CZ.",
"availability": "FREE",
"can-be-empty": true
},
"type": {
"type": "enum",
"description": "ASN category. Possible values include ISP, HOSTING, BUSINESS, EDUCATION, GOVERNMENT (when available).",
"availability": "PAID",
"can-be-empty": true
},
"domain": {
"type": "string",
"description": "ASN operator domain name (no scheme), like t-mobile.cz.",
"availability": "PAID",
"can-be-empty": true
},
"date_allocated": {
"type": "string",
"description": "ASN allocation/registration date in YYYY-MM-DD format, when available (example: 2021-11-19).",
"availability": "PAID",
"can-be-empty": true
},
"rir": {
"type": "enum",
"description": "Regional Internet Registry (RIR) that allocated the ASN. Possible values include RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, KRNIC, TWNIC, IDNIC, IANA.",
"availability": "PAID",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| as_number | string | ASN identifier in | Yes | FREE |
| organization | string | ASN operator name (typically the organization registered for the ASN). | Yes | FREE |
| country | string | ASN registration country as ISO 3166-1 alpha-2 (2 uppercase letters), like | Yes | FREE |
| type | enum | ASN category. Possible values include | Yes | PAID |
| domain | string | ASN operator domain name (no scheme), like | Yes | PAID |
| date_allocated | string | ASN allocation/registration date in | Yes | PAID |
| rir | enum | Regional Internet Registry (RIR) that allocated the ASN. Possible values include | Yes | PAID |
- Free plan subscribers receive
as_number,organization, andcountryin theasnobject. Paid plan subscribers receive all fields listed in the ASN table above. - For deeper ASN intelligence on paid plans, use the dedicated ASN API endpoint (
/v3/asn). It supports lookups by IPv4, IPv6, or ASN and returns additional data beyond the unified response, such asroutes,upstreams,downstreams, and the ASNWHOISdetails. Each dedicated ASN lookup costs 1 credit. For details, refer to the official ASN API documentation.
6. network json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "network json object reference",
"description": "Schema for network json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"connection_type": {
"type": "string",
"description": "Network access type classification, like DSL , Cable, Mobile, Wireless, 5G etc. (when available).",
"availability": "PAID",
"can-be-empty": true
},
"route": {
"type": "string",
"description": "Network prefix in CIDR notation (<ip>/<prefix_length>), like 2.36.96.0/22, that contains the IP.",
"availability": "PAID",
"can-be-empty": true
},
"is_anycast": {
"type": "boolean",
"description": "true if the IP is anycast (same IP announced from multiple locations).",
"availability": "PAID",
"can-be-empty": false
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| connection_type | string | Network access type classification, like | Yes | PAID |
| route | string | Network prefix in CIDR notation ( | Yes | PAID |
| is_anycast | boolean | | No | PAID |
7. company json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "company json object reference",
"description": "Schema for company json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Company name mapped to the IP (often the ISP or network operator).",
"availability": "PAID",
"can-be-empty": true
},
"type": {
"type": "enum",
"description": "Company category. Possible values include ISP, HOSTING, BUSINESS, EDUCATION, GOVERNMENT (when available).",
"availability": "PAID",
"can-be-empty": true
},
"domain": {
"type": "string",
"description": "Company domain name (no scheme), like verizon.co.uk, when available.",
"availability": "PAID",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| name | string | Company name mapped to the IP (often the ISP or network operator). | Yes | PAID |
| type | enum | Company category. Possible values include | Yes | PAID |
| domain | string | Company domain name (no scheme), like | Yes | PAID |
8. time_zone json object reference
This object is included in the response by default (no include parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "time_zone json object reference",
"description": "Schema for time_zone json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Time zone in IANA TZDB format (example: America/Los_Angeles).",
"availability": "FREE",
"can-be-empty": false
},
"offset": {
"type": "float",
"description": "Standard time UTC offset in hours (example: -8 for UTC-08:00).",
"availability": "FREE",
"can-be-empty": false
},
"offset_with_dst": {
"type": "float",
"description": "Current effective UTC offset in hours, including DST when active.",
"availability": "FREE",
"can-be-empty": false
},
"current_time": {
"type": "string",
"description": "Local date/time in YYYY-MM-DDTHH:mm:ss±ZZZZ format (example: 2026-02-11T09:02:24-0800).",
"availability": "FREE",
"can-be-empty": false
},
"current_time_unix": {
"type": "float",
"description": "Local time as Unix epoch seconds (may include decimals).",
"availability": "FREE",
"can-be-empty": false
},
"current_tz_abbreviation": {
"type": "string",
"description": "Current time zone abbreviation (example: PST).",
"availability": "FREE",
"can-be-empty": true
},
"current_tz_full_name": {
"type": "string",
"description": "Current time zone full name (example: Pacific Standard Time).",
"availability": "FREE",
"can-be-empty": true
},
"standard_tz_abbreviation": {
"type": "string",
"description": "Standard (non-DST) abbreviation (example: PST).",
"availability": "FREE",
"can-be-empty": true
},
"standard_tz_full_name": {
"type": "string",
"description": "Standard (non-DST) full name.",
"availability": "FREE",
"can-be-empty": true
},
"is_dst": {
"type": "boolean",
"description": "true if DST is active at the returned local time.",
"availability": "FREE",
"can-be-empty": false
},
"dst_savings": {
"type": "float",
"description": "DST shift amount in hours (example: 1). 0 when DST is not active.",
"availability": "FREE",
"can-be-empty": false
},
"dst_exists": {
"type": "boolean",
"description": "true if the time zone observes DST at any point in the year; when true, dst_start and dst_end are present.",
"availability": "FREE",
"can-be-empty": false
},
"dst_tz_abbreviation": {
"type": "string",
"description": "DST abbreviation used when DST is active (example: PDT).",
"availability": "FREE",
"can-be-empty": true
},
"dst_tz_full_name": {
"type": "string",
"description": "DST full name used when DST is active (example: Pacific Daylight Time).",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.utc_time": {
"type": "string",
"description": "DST start moment in UTC (string; format follows API output).",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.duration": {
"type": "string",
"description": "Clock change at DST start in hours (positive means clocks move forward). Example: 1.00H.",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.gap": {
"type": "boolean",
"description": "true if local time jumps forward and some local times do not exist.",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.date_time_after": {
"type": "string",
"description": "Local date/time immediately after the DST start transition.",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.date_time_before": {
"type": "string",
"description": "Local date/time immediately before the DST start transition.",
"availability": "FREE",
"can-be-empty": true
},
"dst_start.overlap": {
"type": "boolean",
"description": "true if local times repeat at DST start (rare; most zones have a gap instead).",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.utc_time": {
"type": "string",
"description": "DST end moment in UTC (string; format follows API output).",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.duration": {
"type": "string",
"description": "Clock change at DST end in hours (negative means clocks move back). Example: -1.00H.",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.gap": {
"type": "boolean",
"description": "true if local time jumps forward at DST end (rare; most zones have an overlap instead).",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.date_time_after": {
"type": "string",
"description": "Local date/time immediately after the DST end transition.",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.date_time_before": {
"type": "string",
"description": "Local date/time immediately before the DST end transition.",
"availability": "FREE",
"can-be-empty": true
},
"dst_end.overlap": {
"type": "boolean",
"description": "true if local times repeat (clocks move back) and the same local time occurs twice.",
"availability": "FREE",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| name | string | Time zone in IANA TZDB format (example: | No | FREE |
| offset | float | Standard time UTC offset in hours (example: | No | FREE |
| offset_with_dst | float | Current effective UTC offset in hours, including DST when active. | No | FREE |
| current_time | string | Local date/time in | No | FREE |
| current_time_unix | float | Local time as Unix epoch seconds (may include decimals). | No | FREE |
| current_tz_abbreviation | string | Current time zone abbreviation (example: | Yes | FREE |
| current_tz_full_name | string | Current time zone full name (example: | Yes | FREE |
| standard_tz_abbreviation | string | Standard (non-DST) abbreviation (example: | Yes | FREE |
| standard_tz_full_name | string | Standard (non-DST) full name. | Yes | FREE |
| is_dst | boolean | | No | FREE |
| dst_savings | float | DST shift amount in hours (example: | No | FREE |
| dst_exists | boolean | | No | FREE |
| dst_tz_abbreviation | string | DST abbreviation used when DST is active (example: | Yes | FREE |
| dst_tz_full_name | string | DST full name used when DST is active (example: | Yes | FREE |
| dst_start.utc_time | string | DST start moment in UTC (string; format follows API output). | Yes | FREE |
| dst_start.duration | string | Clock change at DST start in hours (positive means clocks move forward). Example: | Yes | FREE |
| dst_start.gap | boolean | | Yes | FREE |
| dst_start.date_time_after | string | Local date/time immediately after the DST start transition. | Yes | FREE |
| dst_start.date_time_before | string | Local date/time immediately before the DST start transition. | Yes | FREE |
| dst_start.overlap | boolean | | Yes | FREE |
| dst_end.utc_time | string | DST end moment in UTC (string; format follows API output). | Yes | FREE |
| dst_end.duration | string | Clock change at DST end in hours (negative means clocks move back). Example: | Yes | FREE |
| dst_end.gap | boolean | | Yes | FREE |
| dst_end.date_time_after | string | Local date/time immediately after the DST end transition. | Yes | FREE |
| dst_end.date_time_before | string | Local date/time immediately before the DST end transition. | Yes | FREE |
| dst_end.overlap | boolean | | Yes | FREE |
- All the time zone fields listed above are also available via the dedicated Time Zone API (
/v3/timezone), which is accessible to both Free and Paid subscribers. Each successful lookup costs 1 credit. - The dedicated Time Zone API supports additional lookup methods beyond IP, including time zone name, IATA code, ICAO code, LOCODE, latitude/longitude, and location. For time conversions, use the Time Zone Conversion endpoint (
/v3/timezone/convert), which supports the same lookup methods. - For more details, refer to the Time Zone API documentation.
9. user_agent json object reference
This object is not included in the response by default ( include=user_agent parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "user_agent json object reference",
"description": "Schema for user_agent json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"user_agent_string": {
"type": "string",
"description": "Raw User-Agent string used for parsing (from the request User-Agent header or provided UA input).",
"availability": "PAID",
"can-be-empty": true
},
"name": {
"type": "string",
"description": "Detected user agent product name (example: Chrome).",
"availability": "PAID",
"can-be-empty": true
},
"type": {
"type": "string",
"description": "User agent category (enum), like Browser, Mobile App, Bot (when available).",
"availability": "PAID",
"can-be-empty": true
},
"version": {
"type": "string",
"description": "Full product version string (example: 143.0.0.0).",
"availability": "PAID",
"can-be-empty": true
},
"version_major": {
"type": "string",
"description": "Major version extracted from version (example: 143).",
"availability": "PAID",
"can-be-empty": true
},
"device.name": {
"type": "string",
"description": "Detected device label (example: Linux Desktop).",
"availability": "PAID",
"can-be-empty": true
},
"device.type": {
"type": "string",
"description": "Device category (enum), like Desktop, Mobile, Tablet, Bot.",
"availability": "PAID",
"can-be-empty": true
},
"device.brand": {
"type": "string",
"description": "Device vendor/brand when identified (example: Apple, Samsung).",
"availability": "PAID",
"can-be-empty": true
},
"device.cpu": {
"type": "string",
"description": "CPU / architecture string (example: Intel x86_64, ARM64) when detected.",
"availability": "PAID",
"can-be-empty": true
},
"engine.name": {
"type": "string",
"description": "Rendering engine name (example: Blink, WebKit, Gecko).",
"availability": "PAID",
"can-be-empty": true
},
"engine.type": {
"type": "string",
"description": "Engine category (typically Browser).",
"availability": "PAID",
"can-be-empty": true
},
"engine.version": {
"type": "string",
"description": "Full engine version string, when available.",
"availability": "PAID",
"can-be-empty": true
},
"engine.version_major": {
"type": "string",
"description": "Major engine version extracted from engine.version, when available.",
"availability": "PAID",
"can-be-empty": true
},
"operating_system.name": {
"type": "string",
"description": "Operating system name (example: Linux, Windows, Android).",
"availability": "PAID",
"can-be-empty": true
},
"operating_system.type": {
"type": "string",
"description": "OS category (enum), like Desktop, Mobile, Server.",
"availability": "PAID",
"can-be-empty": true
},
"operating_system.version": {
"type": "string",
"description": "OS version string, when available (example: 14.4, 11).",
"availability": "PAID",
"can-be-empty": true
},
"operating_system.version_major": {
"type": "string",
"description": "Major OS version extracted from operating_system.version, when available.",
"availability": "PAID",
"can-be-empty": true
},
"operating_system.build": {
"type": "string",
"description": "OS build identifier, when available (example: 22631).",
"availability": "PAID",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| user_agent_string | string | Raw User-Agent string used for parsing (from the request | Yes | PAID |
| name | string | Detected user agent product name (example: | Yes | PAID |
| type | string | User agent category (enum), like | Yes | PAID |
| version | string | Full product version string (example: | Yes | PAID |
| version_major | string | Major version extracted from | Yes | PAID |
| device.name | string | Detected device label (example: | Yes | PAID |
| device.type | string | Device category (enum), like | Yes | PAID |
| device.brand | string | Device vendor/brand when identified (example: | Yes | PAID |
| device.cpu | string | CPU / architecture string (example: | Yes | PAID |
| engine.name | string | Rendering engine name (example: | Yes | PAID |
| engine.type | string | Engine category (typically | Yes | PAID |
| engine.version | string | Full engine version string, when available. | Yes | PAID |
| engine.version_major | string | Major engine version extracted from | Yes | PAID |
| operating_system.name | string | Operating system name (example: | Yes | PAID |
| operating_system.type | string | OS category (enum), like | Yes | PAID |
| operating_system.version | string | OS version string, when available (example: | Yes | PAID |
| operating_system.version_major | string | Major OS version extracted from | Yes | PAID |
| operating_system.build | string | OS build identifier, when available (example: | Yes | PAID |
- For all possible values of the User Agent type fields, please check the complete User Agent type reference.
- The User Agent Parser API is also available as a dedicated endpoint (
/v3/user-agent) for both Free and Paid subscribers. Each successful lookup costs 1 credit. Free plan subscribers cannot include theuser_agentmodule in the unified IP Geolocation API response, which is why its availability in the table above is marked as PAID. - For more details, refer to the User Agent Parser API documentation.
10. security json object reference
This object is not included in the response by default ( include=security parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "security json object reference",
"description": "Schema for security json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"threat_score": {
"type": "number",
"description": "Aggregate risk score from 0 to 100. Higher means higher likelihood of abusive or anonymous usage.",
"availability": "PAID",
"can-be-empty": false
},
"is_tor": {
"type": "boolean",
"description": "true if the IP matches a Tor exit node.",
"availability": "PAID",
"can-be-empty": false
},
"is_proxy": {
"type": "boolean",
"description": "true if the IP is associated with a proxy service/network.",
"availability": "PAID",
"can-be-empty": false
},
"proxy_provider_names": {
"type": "array[string]",
"description": "Detected proxy provider names, when identified.",
"availability": "PAID",
"can-be-empty": true
},
"proxy_confidence_score": {
"type": "number",
"description": "Proxy detection confidence from 0 to 100. 0 if not detected or unknown.",
"availability": "PAID",
"can-be-empty": false
},
"proxy_last_seen": {
"type": "string",
"description": "Last observed proxy activity date in YYYY-MM-DD, when available.",
"availability": "PAID",
"can-be-empty": true
},
"is_residential_proxy": {
"type": "boolean",
"description": "true if the IP is linked to a residential proxy network (consumer ISP exits).",
"availability": "PAID",
"can-be-empty": false
},
"is_vpn": {
"type": "boolean",
"description": "true if the IP is associated with a VPN service/network.",
"availability": "PAID",
"can-be-empty": false
},
"vpn_provider_names": {
"type": "array[string]",
"description": "Detected VPN provider names, when identified.",
"availability": "PAID",
"can-be-empty": true
},
"vpn_confidence_score": {
"type": "number",
"description": "VPN detection confidence from 0 to 100. 0 if not detected or unknown.",
"availability": "PAID",
"can-be-empty": false
},
"vpn_last_seen": {
"type": "string",
"description": "Last observed VPN activity date in YYYY-MM-DD, when available.",
"availability": "PAID",
"can-be-empty": true
},
"is_relay": {
"type": "boolean",
"description": "true if the IP is associated with a relay/anonymization relay network.",
"availability": "PAID",
"can-be-empty": false
},
"relay_provider_name": {
"type": "string",
"description": "Relay provider/name, when identified.",
"availability": "PAID",
"can-be-empty": true
},
"is_anonymous": {
"type": "boolean",
"description": "true if any anonymity signal is present (VPN, proxy, Tor, or relay).",
"availability": "PAID",
"can-be-empty": false
},
"is_known_attacker": {
"type": "boolean",
"description": "true if the IP is flagged for known attacker behavior based on your detection sources.",
"availability": "PAID",
"can-be-empty": false
},
"is_bot": {
"type": "boolean",
"description": "true if the IP is associated with automated/bot activity.",
"availability": "PAID",
"can-be-empty": false
},
"is_spam": {
"type": "boolean",
"description": "true if the IP is associated with spam activity.",
"availability": "PAID",
"can-be-empty": false
},
"is_cloud_provider": {
"type": "boolean",
"description": "true if the IP belongs to a cloud or hosting provider range.",
"availability": "PAID",
"can-be-empty": false
},
"cloud_provider_name": {
"type": "string",
"description": "Cloud/hosting provider name, when identified.",
"availability": "PAID",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| threat_score | number | Aggregate risk score from 0 to 100. Higher means higher likelihood of abusive or anonymous usage. | No | PAID |
| is_tor | boolean | | No | PAID |
| is_proxy | boolean | | No | PAID |
| proxy_provider_names | array[string] | Detected proxy provider names, when identified. | Yes | PAID |
| proxy_confidence_score | number | Proxy detection confidence from 0 to 100. | No | PAID |
| proxy_last_seen | string | Last observed proxy activity date in | Yes | PAID |
| is_residential_proxy | boolean | | No | PAID |
| is_vpn | boolean | | No | PAID |
| vpn_provider_names | array[string] | Detected VPN provider names, when identified. | Yes | PAID |
| vpn_confidence_score | number | VPN detection confidence from 0 to 100. | No | PAID |
| vpn_last_seen | string | Last observed VPN activity date in | Yes | PAID |
| is_relay | boolean | | No | PAID |
| relay_provider_name | string | Relay provider/name, when identified. | Yes | PAID |
| is_anonymous | boolean | | No | PAID |
| is_known_attacker | boolean | | No | PAID |
| is_bot | boolean | | No | PAID |
| is_spam | boolean | | No | PAID |
| is_cloud_provider | boolean | | No | PAID |
| cloud_provider_name | string | Cloud/hosting provider name, when identified. | Yes | PAID |
- The security fields listed above are also available via the dedicated IP Security API (
/v3/security). Each successful lookup through dedicated IP Security API endpoint costs 2 credits. - If security is included in the unified IP Geolocation API response, the request costs 3 credits total: 2 credits for the security module and 1 credit for the rest of the unified lookup data.
- For more details on the Security API, refer to the IP Security API documentation. For credit rules and billing details, refer to the Credits & Usage page.
11. abuse json object reference
This object is not included in the response by default ( include=abuse parameter required).
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "abuse json object reference",
"description": "Schema for abuse json object reference",
"type": "object",
"additionalProperties": false,
"properties": {
"route": {
"type": "string",
"description": "Abuse-handling IP range in CIDR notation (<ip>/<prefix_length>), like 195.39.4.200/29, when available.",
"availability": "PAID",
"can-be-empty": true
},
"country": {
"type": "string",
"description": "The ISO 3166-1 alpha-2 country code (two uppercase letters) representing the country where the abuse contact is registered, for example CZ.",
"availability": "PAID",
"can-be-empty": true
},
"name": {
"type": "string",
"description": "Display name for the abuse contact (team/person/org) from registry data.",
"availability": "PAID",
"can-be-empty": true
},
"organization": {
"type": "string",
"description": "Organization name for the abuse contact, when provided separately from name.",
"availability": "PAID",
"can-be-empty": true
},
"kind": {
"type": "enum",
"description": "Contact type from registry data, possible values group, individual.",
"availability": "PAID",
"can-be-empty": true
},
"address": {
"type": "string",
"description": "Registered address of the organization owning the queried IP.",
"availability": "PAID",
"can-be-empty": true
},
"emails": {
"type": "array[string]",
"description": "Abuse contact email addresses (one or more).",
"availability": "PAID",
"can-be-empty": true
},
"phone_numbers": {
"type": "array[string]",
"description": "Abuse contact phone numbers, typically in international format (often E.164).",
"availability": "PAID",
"can-be-empty": true
}
}
}| Field | Type | Description | Can be empty? | Availability |
|---|---|---|---|---|
| route | string | Abuse-handling IP range in CIDR notation ( | Yes | PAID |
| country | string | The ISO 3166-1 alpha-2 country code (two uppercase letters) representing the country where the abuse contact is registered, for example | Yes | PAID |
| name | string | Display name for the abuse contact (team/person/org) from registry data. | Yes | PAID |
| organization | string | Organization name for the abuse contact, when provided separately from | Yes | PAID |
| kind | enum | Contact type from registry data, possible values | Yes | PAID |
| address | string | Registered address of the organization owning the queried IP. | Yes | PAID |
| emails | array[string] | Abuse contact email addresses (one or more). | Yes | PAID |
| phone_numbers | array[string] | Abuse contact phone numbers, typically in international format (often E.164). | Yes | PAID |
- The IP Abuse Contact fields listed above are also available via the dedicated IP Abuse Contact API (
/v3/abuse). Each successful lookup through the dedicated IP Abuse Contact API endpoint costs 1 credit. - If abuse contact data is included in the unified IP Geolocation API response, the request costs 2 credits total: 1 credit for the abuse module and 1 credit for the rest of the unified lookup data.
- For more details on the IP Abuse Contact API, refer to the IP Abuse Contact API documentation. For credit rules and billing details, refer to the Credits & Usage page.
Error Codes
IP Geolocation API returns HTTP status code 200 for a successful API request along with the response.
While, in case of a bad or invalid request, IP Geolocation API returns 4xx HTTP status code along with a descriptive message explaining the reason for the error.
Below is a detailed explanation of the specific HTTP status codes and their corresponding error conditions:
| HTTP Status | Description |
|---|---|
| 400 Bad Request | It is returned for one of the following reasons:
|
| 401 Unauthorized | It is returned for one of the following reasons:
|
| 404 Not Found | It is returned for one of the following reasons:
|
| 405 Method Not Allowed |
|
| 413 Content Too Large |
|
| 415 Unsupported Media Type |
|
| 423 Locked |
|
| 429 Too Many Requests | It is returned for one of the following reasons:
|
| 499 Client Closed Request |
|
| 5XX Server Side Error |
|
API SDKs
To facilitate the developers, we have added some SDKs for various programming languages. The detailed documentation on how to use these SDKs is available in the respective SDK's documentation page linked below.
Our SDKs are also available on Github. Feel free to help us improve them. Following are the available SDKs: