Batch Enrichment API

The /batch API endpoint lets you group up to 1,000 IPinfo API requests into a single HTTP request. This significantly speeds up bulk IP processing and also makes it easy to combine lookups across different APIs in one call.
Endpoints
The /batch endpoint is available on both our updated (api.ipinfo.io) and legacy (ipinfo.io) API services.
There are three batch endpoints:
| Endpoint | Default lookup | Tier | Use case |
|---|---|---|---|
https://api.ipinfo.io/batch | /lookup (Core/Plus/Max) | Paid | Standard batch lookups on the updated API schema |
https://api.ipinfo.io/batch/lite | /lite | Free and paid | Country, continent, and ASN data for free-tier users |
https://api.ipinfo.io/batch/legacy (or https://ipinfo.io/batch) | Legacy ipinfo.io | Paid | Legacy response shape and Privacy Extended data |
The default endpoint (api.ipinfo.io/batch) inherently uses /lookup, so you do not need to prefix IPs with lookup/. To use lite, resproxy, or other endpoints in the same request, use the URL patterns method described in the next section.
Free-tier users should use api.ipinfo.io/batch/lite, since /lookup is a paid-tier endpoint and will return an error on free tokens.
The legacy batch service is available at https://api.ipinfo.io/batch/legacy and at https://ipinfo.io/batch. Use it if you need the legacy response shape or Privacy Extended fields under privacy.
URL Patterns
IPinfo offers several IP data services through different API endpoints, including lite, general lookup, resproxy, and others. You may also want only part of a response, such as /country, /city, or /asn. To support this, the batch endpoint accepts URL patterns:
115.227.65.62
lookup/71.181.13.80
lite/157.47.66.225
lookup/74.75.228.56/anonymous
lite/23.1.118.150/country_code
resproxy/164.53.56.110
domains/1.1.1.1
ranges/nytimes.com
AS52188
Request Formats

The /batch endpoint takes a list of IPs or URL patterns and returns a JSON object where each input is a key and the corresponding lookup is the value. You can submit inputs as a JSON array, a newline-separated list, or a space-separated list. Examples of each format follow, along with the correct Content-Type header.
JSON Array
curl -XPOST --data \
'["lite/8.8.4.4", "lite/8.8.4.4/country", "8.8.4.4/anonymous", "1.1.1.1"]' \
"https://api.ipinfo.io/batch?token=$TOKEN"
{
"lite/8.8.4.4/country": "United States",
"lite/8.8.4.4": {
"ip": "8.8.4.4",
"asn": "AS15169",
"as_name": "Google LLC",
"as_domain": "google.com",
"country_code": "US",
"country": "United States",
"continent_code": "NA",
"continent": "North America"
},
"8.8.4.4/anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"1.1.1.1": {
"ip": "1.1.1.1",
"hostname": "one.one.one.one",
"geo": {
"city": "Brisbane",
"region": "Queensland",
"region_code": "QLD",
"country": "Australia",
"country_code": "AU",
"continent": "Oceania",
"continent_code": "OC",
"latitude": -27.48159,
"longitude": 153.0175,
"timezone": "Australia/Brisbane",
"postal_code": "4101",
"geoname_id": "2174003",
"radius": 10,
"last_changed": "2024-10-20"
},
"as": {
"asn": "AS13335",
"name": "Cloudflare, Inc.",
"domain": "cloudflare.com",
"type": "hosting",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": true,
"is_hosting": true,
"is_mobile": false,
"is_satellite": false
}
}
Newline-Separated List
echo -e "lite/8.8.4.4\nlite/8.8.4.4/country\n8.8.4.4/anonymous\n1.1.1.1" | \
curl -X POST \
--data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
{
"lite/8.8.4.4/country": "United States",
"lite/8.8.4.4": {
"ip": "8.8.4.4",
"asn": "AS15169",
"as_name": "Google LLC",
"as_domain": "google.com",
"country_code": "US",
"country": "United States",
"continent_code": "NA",
"continent": "North America"
},
"8.8.4.4/anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"1.1.1.1": {
"ip": "1.1.1.1",
"hostname": "one.one.one.one",
"geo": {
"city": "Brisbane",
"region": "Queensland",
"region_code": "QLD",
"country": "Australia",
"country_code": "AU",
"continent": "Oceania",
"continent_code": "OC",
"latitude": -27.48159,
"longitude": 153.0175,
"timezone": "Australia/Brisbane",
"postal_code": "4101",
"geoname_id": "2174003",
"radius": 10,
"last_changed": "2024-10-20"
},
"as": {
"asn": "AS13335",
"name": "Cloudflare, Inc.",
"domain": "cloudflare.com",
"type": "hosting",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": true,
"is_hosting": true,
"is_mobile": false,
"is_satellite": false
}
}
Space-Separated List
curl --request POST --url "https://api.ipinfo.io/batch?token=$TOKEN" \
--header 'Content-Type: text/plain' \
--data 'lite/8.8.4.4 lite/8.8.4.4/country 8.8.4.4/anonymous 1.1.1.1'
{
"lite/8.8.4.4/country": "United States",
"lite/8.8.4.4": {
"ip": "8.8.4.4",
"asn": "AS15169",
"as_name": "Google LLC",
"as_domain": "google.com",
"country_code": "US",
"country": "United States",
"continent_code": "NA",
"continent": "North America"
},
"8.8.4.4/anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"1.1.1.1": {
"ip": "1.1.1.1",
"hostname": "one.one.one.one",
"geo": {
"city": "Brisbane",
"region": "Queensland",
"region_code": "QLD",
"country": "Australia",
"country_code": "AU",
"continent": "Oceania",
"continent_code": "OC",
"latitude": -27.48159,
"longitude": 153.0175,
"timezone": "Australia/Brisbane",
"postal_code": "4101",
"geoname_id": "2174003",
"radius": 10,
"last_changed": "2024-10-20"
},
"as": {
"asn": "AS13335",
"name": "Cloudflare, Inc.",
"domain": "cloudflare.com",
"type": "hosting",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": true,
"is_hosting": true,
"is_mobile": false,
"is_satellite": false
}
}
IP List from File
$ cat ips.txt
58.155.106.199
102.158.180.80
76.185.163.245
cat ips.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
{
"58.155.106.199": {
"ip": "58.155.106.199",
"geo": {
"city": "Haidian",
"region": "Beijing",
"region_code": "BJ",
"country": "China",
"country_code": "CN",
"continent": "Asia",
"continent_code": "AS",
"latitude": 39.99064,
"longitude": 116.28868,
"timezone": "Asia/Shanghai",
"postal_code": "100000",
"geoname_id": "1809104",
"radius": 100,
"last_changed": "2025-08-03"
},
"as": {
"asn": "AS4538",
"name": "China Education and Research Network Center",
"domain": "cernet.edu.cn",
"type": "education",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": false,
"is_hosting": false,
"is_mobile": false,
"is_satellite": false
},
"102.158.180.80": {
"ip": "102.158.180.80",
"geo": {
"city": "Tunis",
"region": "Tunis Governorate",
"region_code": "11",
"country": "Tunisia",
"country_code": "TN",
"continent": "Africa",
"continent_code": "AF",
"latitude": 36.81897,
"longitude": 10.16579,
"timezone": "Africa/Tunis",
"geoname_id": "2464470",
"radius": 50
},
"as": {
"asn": "AS37705",
"name": "TOPNET",
"domain": "topnet.tn",
"type": "isp",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": false,
"is_hosting": false,
"is_mobile": false,
"is_satellite": false
},
"76.185.163.245": {
"ip": "76.185.163.245",
"hostname": "syn-076-185-163-245.res.spectrum.com",
"geo": {
"city": "San Antonio",
"region": "Texas",
"region_code": "TX",
"country": "United States",
"country_code": "US",
"continent": "North America",
"continent_code": "NA",
"latitude": 29.4275,
"longitude": -98.4601,
"timezone": "America/Chicago",
"postal_code": "78202",
"dma_code": "641",
"geoname_id": "4726206",
"radius": 10
},
"as": {
"asn": "AS11427",
"name": "Charter Communications Inc",
"domain": "charter.com",
"type": "isp",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": false,
"is_hosting": false,
"is_mobile": false,
"is_satellite": false
}
}
Endpoints and Input Parameters
Full Reference
https://api.ipinfo.io/batch/lite
The /lite endpoint is available to all users, both free and paid tier.
<ip><ip>/ip<ip>/country<ip>/country_code<ip>/continent<ip>/continent_code<ip>/asn<ip>/as_name<ip>/as_domain
https://api.ipinfo.io/batch
The default lookup type on this endpoint is /lookup, which is a paid-tier feature. Free-tier tokens will get an error. You can optionally use an explicit lookup/ prefix, but it is not required.
<ip><ip>/ip<ip>/hostname<ip>/geo<ip>/city<ip>/continent<ip>/continent_code<ip>/country<ip>/country_code<ip>/dma_code<ip>/geoname_id<ip>/latitude<ip>/longitude<ip>/postal_code<ip>/radius<ip>/region<ip>/region_code<ip>/timezone
<ip>/as<ip>/as/asn<ip>/as/domain<ip>/as/last_changed<ip>/as/name<ip>/as/type
<ip>/anonymous<ip>/anonymous/is_proxy<ip>/anonymous/is_relay<ip>/anonymous/is_res_proxy<ip>/anonymous/is_tor<ip>/anonymous/is_vpn<ip>/anonymous/name
<ip>/mobile<ip>/mobile/name<ip>/mobile/mcc<ip>/mobile/mnc
<ip>/is_anonymous<ip>/is_anycast<ip>/is_hosting<ip>/is_mobile<ip>/is_satellitelite/<ip>lite/<ip>/iplite/<ip>/countrylite/<ip>/country_codelite/<ip>/continentlite/<ip>/continent_codelite/<ip>/asnlite/<ip>/as_namelite/<ip>/as_domain<asn>resproxy/<ip>places/<ip>ranges/<domain>whois/net/<net_id>whois/net/<ip>whois/net/<domain>whois/net/<org_id>whois/net/<poc_id>
https://api.ipinfo.io/batch/legacy / https://ipinfo.io/batch
This route points to the ipinfo.io legacy API. We recommend using it only if you are on the legacy API or need Privacy Extended data.
<ip>/ip<ip>/hostname<ip>/geo<ip>/geo/city\<ip>/city<ip>/geo/region\<ip>/region<ip>/geo/postal\<ip>/postal<ip>/geo/country\<ip>/country<ip>/geo/loc\<ip>/loc<ip>/geo/timezone\<ip>/timezone
<ip>/asn<ip>/asn/asn<ip>/asn/domain<ip>/asn/name<ip>/asn/route<ip>/asn/type
<ip>/privacy<ip>/privacy/census<ip>/privacy/census_ports<ip>/privacy/confidence<ip>/privacy/coverage<ip>/privacy/device_activity<ip>/privacy/first_seen<ip>/privacy/hosting<ip>/privacy/inferred<ip>/privacy/last_seen<ip>/privacy/proxy<ip>/privacy/relay<ip>/privacy/service<ip>/privacy/tor<ip>/privacy/vpn<ip>/privacy/vpn_config<ip>/privacy/whois
<ip>/company<ip>/company/domain<ip>/company/name<ip>/company/type
<ip>/domains<ip>/domains/domains<ip>/domains/ip<ip>/domains/total
<ip>/abuse<ip>/abuse/address<ip>/abuse/country<ip>/abuse/email<ip>/abuse/name<ip>/abuse/network<ip>/abuse/phone
<ip>/is_anonymous<ip>/is_anycast<ip>/is_hosting<ip>/is_mobile<ip>/is_satellite
Lite Endpoint Option
You can also run batch enrichment against the Lite API:
cat ips.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch/lite?token=$TOKEN"
{
"76.185.163.245": {
"ip": "76.185.163.245",
"asn": "AS11427",
"as_name": "Charter Communications Inc",
"as_domain": "charter.com",
"country_code": "US",
"country": "United States",
"continent_code": "NA",
"continent": "North America"
},
"102.158.180.80": {
"ip": "102.158.180.80",
"asn": "AS37705",
"as_name": "TOPNET",
"as_domain": "topnet.tn",
"country_code": "TN",
"country": "Tunisia",
"continent_code": "AF",
"continent": "Africa"
},
"58.155.106.199": {
"ip": "58.155.106.199",
"asn": "AS4538",
"as_name": "China Education and Research Network Center",
"as_domain": "cernet.edu.cn",
"country_code": "CN",
"country": "China",
"continent_code": "AS",
"continent": "Asia"
}
}
Input Parameters
URL Patterns
cat ip_urls.txt
8.8.4.4/anonymous
1.1.1.1
lite/8.8.4.4
lite/8.8.4.4/country
AS52188
domains/1.1.1.1
ranges/nytimes.com
resproxy/1.1.1.1
cat ip_urls.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
{
"1.1.1.1": {
"ip": "1.1.1.1",
"hostname": "one.one.one.one",
"geo": {
"city": "Brisbane",
"region": "Queensland",
"region_code": "QLD",
"country": "Australia",
"country_code": "AU",
"continent": "Oceania",
"continent_code": "OC",
"latitude": -27.48159,
"longitude": 153.0175,
"timezone": "Australia/Brisbane",
"postal_code": "4101",
"geoname_id": "2174003",
"radius": 10,
"last_changed": "2024-10-20"
},
"as": {
"asn": "AS13335",
"name": "Cloudflare, Inc.",
"domain": "cloudflare.com",
"type": "hosting",
"last_changed": "2025-03-09"
},
"mobile": {},
"anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"is_anonymous": false,
"is_anycast": true,
"is_hosting": true,
"is_mobile": false,
"is_satellite": false
},
"lite/8.8.4.4/country": "United States",
"8.8.4.4/anonymous": {
"is_proxy": false,
"is_relay": false,
"is_tor": false,
"is_vpn": false
},
"lite/8.8.4.4": {
"ip": "8.8.4.4",
"asn": "AS15169",
"as_name": "Google LLC",
"as_domain": "google.com",
"country_code": "US",
"country": "United States",
"continent_code": "NA",
"continent": "North America"
}
// ...
}
Filter Option
The optional filter parameter removes any URLs that have no response from the output. This is useful for cases like finding hostnames that exist across a range of IPs:
echo -e '8.8.8.8/hostname\n8.8.8.9/hostname' | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
{
"8.8.8.9/hostname": null,
"8.8.8.8/hostname": "dns.google"
}
echo -e '8.8.8.8/hostname\n8.8.8.9/hostname' | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN&filter=1"
{
"8.8.8.8/hostname": "dns.google"
}
For request volume tracking, the /batch call itself is not counted, but every URL inside it is. The filter example above counts as 2 requests, and a single /batch call with 100 URLs counts as 100 requests.
The batch endpoint works across all our APIs, including ASN, IP ranges, and hosted domains.