Skip to main content
IPinfo - Comprehensive IP address data, IP geolocation API and database

Batch Enrichment API

IPinfo bulk image header

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:

EndpointDefault lookupTierUse case
https://api.ipinfo.io/batch/lookup (Core/Plus/Max)PaidStandard batch lookups on the updated API schema
https://api.ipinfo.io/batch/lite/liteFree and paidCountry, continent, and ASN data for free-tier users
https://api.ipinfo.io/batch/legacy (or https://ipinfo.io/batch)Legacy ipinfo.ioPaidLegacy 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:

TXT
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

IPinfo bulk image usage example

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

Bash
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"
JSON
{
  "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

Bash
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"
JSON
{
  "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

Bash
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'
JSON
{
  "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

Bash
$ cat ips.txt
58.155.106.199
102.158.180.80
76.185.163.245
Bash
cat ips.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
JSON
{
  "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_satellite
  • lite/<ip>
  • lite/<ip>/ip
  • lite/<ip>/country
  • lite/<ip>/country_code
  • lite/<ip>/continent
  • lite/<ip>/continent_code
  • lite/<ip>/asn
  • lite/<ip>/as_name
  • lite/<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:

Bash
cat ips.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch/lite?token=$TOKEN"
JSON
{
  "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
Bash
cat ip_urls.txt | curl -XPOST --data-binary @- "https://api.ipinfo.io/batch?token=$TOKEN"
JSON
{
  "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:

Bash
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"
}
Bash
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.

Was this page helpful?