Batch lookup

Classify up to 100 IPv4 addresses in a single call. Intended for fraud, risk, and content-moderation pipelines processing burst traffic.

API endpoint

POST https://vpn-proxy-detection.whoisxmlapi.com/api/v1/ip/batch

The API expects parameters to be JSON-encoded in the body of each request.

CURL request sample

curl https://vpn-proxy-detection.whoisxmlapi.com/api/v1/ip/batch -X POST -H "Content-Type: application/json" -d '{"apiKey": "YOUR_API_KEY", "ips": ["8.8.8.8", "1.1.1.1", "185.220.101.1"]}'

POST request body sample

{
    "apiKey": "YOUR_API_KEY",
    "ips": [
        "8.8.8.8",
        "1.1.1.1",
        "185.220.101.1"
    ],
    "min_confidence": 0.5
}

It takes up to a minute to activate your account after the registration.

Input parameters

apiKey

Required. Get your personal API key on the My products page.

ips

Required. Array of strings.

List of IPv4 addresses to classify. Maximum 100 entries per request.

min_confidence

Optional. Float.

Only attributions whose signal confidence is greater than or equal to this value are returned.

Allowed values: [0, 1].

Default: 0.

Sample output

{
    "results": [
        {
            "ip": "1.1.1.1",
            "network": "1.1.1.0\/24",
            "classification": "cdn",
            "provider": "Cloudflare",
            "confidence": 0.97,
            "source": "asn_classification",
            "detection_method": "asn_classification",
            "first_seen": "2024-01-15T08:30:00Z",
            "last_seen": "2026-05-20T11:04:00Z",
            "observation_count": 412,
            "hits_days_pct": null,
            "providers_num": 0,
            "confidence_decay": 0.0,
            "freshness_class": "current",
            "is_vpn": false,
            "is_proxy": false,
            "is_tor": false,
            "is_relay": false,
            "is_hosting": false,
            "is_cdn": true,
            "is_residential_proxy": false,
            "is_residential_proxy_high_confidence": false,
            "is_residential_proxy_mobile": false,
            "is_open_proxy": false,
            "is_corporate_vpn": false,
            "risk_score": 97,
            "asn": 13335,
            "asn_org": "CLOUDFLARENET",
            "cdn_operator": "cloudflare",
            "asn_abuse": {
                "abuse_score": 4,
                "abuse_level": "low"
            },
            "metadata": {
                "raw_score": 97,
                "signals": null,
                "dns_enrichment": null,
                "tls_enrichment": null
            },
            "observed_location": null
        },
        {
            "ip": "185.220.101.1",
            "network": "185.220.101.0\/24",
            "classification": "tor",
            "provider": null,
            "confidence": 1.0,
            "source": "port_scan",
            "detection_method": "port_scan",
            "first_seen": "2024-01-15T08:30:00Z",
            "last_seen": "2026-05-21T08:59:09Z",
            "observation_count": 127,
            "hits_days_pct": 47.78,
            "providers_num": 0,
            "confidence_decay": 0.6650,
            "freshness_class": "current",
            "is_vpn": false,
            "is_proxy": false,
            "is_tor": true,
            "is_relay": false,
            "is_hosting": false,
            "is_cdn": false,
            "is_residential_proxy": false,
            "is_residential_proxy_high_confidence": false,
            "is_residential_proxy_mobile": false,
            "is_open_proxy": false,
            "is_corporate_vpn": false,
            "risk_score": 100,
            "asn": 60729,
            "asn_org": "ZWIEBELFREUNDE",
            "cdn_operator": null,
            "asn_abuse": {
                "abuse_score": 88,
                "abuse_level": "high"
            },
            "metadata": {
                "raw_score": 100,
                "signals": { "open_ports": [9001, 9030] },
                "dns_enrichment": null,
                "tls_enrichment": null
            },
            "observed_location": null
        }
    ],
    "count": 2
}

Code: 200 OK.

Output parameters

results

Array. One classification object per input IP, in the same order as the request.

Each item has the same shape as the single-IP response. See Making requests for per-field descriptions.

count

Integer. The number of classifications returned. Matches the length of the input ips array on success.

Free access

After Sign Up you automatically get a free subscription plan limited to 10 queries.

Usage limits and requests throttling

The maximum number of requests per second is 30. In case that the limit is breached, your subsequent requests will be rejected until the next second.

This API is also available with a dedicated load balancer and premium endpoint to enable faster querying as part of our Premium API Services and Enterprise API Packages.