Batch lookup results. Starter and up. results holds one row per distinct IP string in the request, in the order each first appears; an exact repeat is looked up once.
One row per distinct IP string: a lookup result, or a BatchRowError for an IP that could not be looked up.
The result of one IP lookup. Every key listed here is returned on every plan unless its description says otherwise. Most fields above your plan stay in the response with null, or false for the two residential proxy sub-flags; the few that are left out instead say so in their descriptions. Gate on your plan rather than on whether a key is present. x-min-plan names the lowest plan that fills each field. intro means every plan; the free sign-up lookups get the same fields as Intro. The API covers IPv4 today. IPv6 addresses are accepted but currently return little or no classification. The API refreshes once a day.
Credits charged for this request: one per distinct IP looked up. Rows with error are free. One address sent in two spellings (8.8.8.8 and ::ffff:8.8.8.8) gets two rows but is one IP, so it costs one credit. 0 when nothing is charged, as when every row has error.
Required range: x >= 0
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"VPN \u0026 Proxy Detection API","colors":{"primary":"#0F62FE","light":"#4589FF","dark":"#002D9C"},"favicon":"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/favicon.png","logo":{"light":"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/logo.svg","dark":"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/logo-dark.svg"},"api":{"openapi":["openapi.json"]},"navbar":{"links":[{"label":"Support","href":"mailto:service.desk@whoisxmlapi.com"}],"primary":{"type":"button","label":"Sign Up","href":"https://vpn-proxy-detection.whoisxmlapi.com/api/signup"}},"search":{"prompt":"Ask anything about VPN, proxy, or IP intelligence APIs..."},"footer":{"socials":{"website":"https://www.whoisxmlapi.com","github":"https://github.com/whois-api-llc"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Pricing","href":"https://vpn-proxy-detection.whoisxmlapi.com/api/pricing","icon":"tag"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"whoisapi","hasAudioNarration":false,"actualSubdomain":"whoisapi","customDomains":["vpn-docs.wxapros.com"],"gitSource":{"type":"github","owner":"whois-api-llc","repo":"wxa_vpn","deployBranch":"main","contentDirectory":"docs/api-reference","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae984eac5625f8486aa58b7","collectionId":"1900f435-482d-49ba-b279-086d15facb13","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae984eac5625f8486aa58b7"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae984ef93c14f424a7bb1c5","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Documentation","count":25},{"language":"default","tag":"Guides","count":6},{"language":"default","tag":"Aggregates","count":5},{"language":"default","tag":"Bulk Exports","count":4},{"language":"default","tag":"Getting Started","count":4},{"language":"default","tag":"Lookup","count":3},{"language":"default","tag":"Reference","count":2},{"language":"default","tag":"Account","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/lookup-batch","slug":"/api-reference/lookup-batch","pageMetadata":{"title":"Batch IP lookup","description":"Classify up to 100 IPs in one request.","openapi":"POST /api/v1/ip/batch","href":"/api-reference/lookup-batch"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Classify up to 100 IPs in one request.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Batch IP lookup","description":"Classify up to 100 IPs in one request.","openapi":"POST /api/v1/ip/batch","href":"/api-reference/lookup-batch"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Lookup Batch","operationId":"lookup_batch_api_v1_ip_batch_post","requestBody":"9dddd296-9a79-4025-af25-0e144cc9610d","responses":{"200":"5c1d3a21-a6a1-4b0b-9a44-60c542df3ac2","422":"d31f47a8-f60c-4ecf-9631-223af5a00c80"},"method":"post","type":"path","servers":["7146a852-320d-457e-92f4-ba15e4ba85a4"],"security":["ec8686e5-4c7b-4fce-b111-ff1d794dfa50"],"path":"/api/v1/ip/batch","baseUrlOptions":["https://vpn-proxy-detection.whoisxmlapi.com"],"title":"Lookup Batch","description":"Classify up to 100 IPs in one request.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"ips":{"items":{"type":"string","uniqueKey":"ips.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Ips","isRequired":true,"uniqueKey":"ips","typeLabel":"string[]"}},"type":"object","required":["ips"],"title":"BatchRequest","uniqueKey":"","typeLabel":"BatchRequest · object"},"examples":{"Example":{"title":"Example","value":{"ips":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"5c1d3a21-a6a1-4b0b-9a44-60c542df3ac2":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"BatchLookupResponse","description":"Batch lookup results. Starter and up. results holds one row per distinct IP string in the request, in the order each first appears; an exact repeat is looked up once.","properties":{"results":{"type":"array","description":"One row per distinct IP string: a lookup result, or a BatchRowError for an IP that could not be looked up.","items":{"oneOf":[{"type":"object","title":"IpLookupResponse","description":"The result of one IP lookup. Every key listed here is returned on every plan unless its description says otherwise. Most fields above your plan stay in the response with null, or false for the two residential proxy sub-flags; the few that are left out instead say so in their descriptions. Gate on your plan rather than on whether a key is present. x-min-plan names the lowest plan that fills each field. intro means every plan; the free sign-up lookups get the same fields as Intro. The API covers IPv4 today. IPv6 addresses are accepted but currently return little or no classification. The API refreshes once a day.","required":["ip","network","classification","provider","confidence","source","detection_method","first_seen","last_seen","observation_count","hits_days_pct","providers_num","confidence_decay","freshness_class","is_vpn","is_proxy","is_tor","is_relay","is_hosting","is_cdn","is_residential_proxy","is_residential_proxy_high_confidence","is_residential_proxy_mobile","is_open_proxy","is_corporate_vpn","infra_type","risk_score","asn","asn_org","netblock","netname","netblock_org","cdn_operator","metadata","reasons","asn_abuse","sanctions_risk","operator_profile","operator_group","operator_legal_name"],"properties":{"ip":{"type":"string","description":"The IP address you looked up, in canonical form.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.ip","typeLabel":"string"},"network":{"oneOf":[{"type":"string","description":"The classified network, in CIDR notation, that contains the IP. It can be a single address (a /32). Null when nothing matched, when the label comes from our sightings of this address as a residential proxy exit rather than from a listed network, or when the label is inferred from the ASN alone with no listed range behind it (source is then asn_classification).","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.network.oneOf.0","typeLabel":"string"},{"type":"null","description":"The classified network, in CIDR notation, that contains the IP. It can be a single address (a /32). Null when nothing matched, when the label comes from our sightings of this address as a residential proxy exit rather than from a listed network, or when the label is inferred from the ASN alone with no listed range behind it (source is then asn_classification).","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.network.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.network","typeLabel":"string | null"},"classification":{"type":"string","description":"The winning label for the IP, for example vpn, commercial_vpn, corporate_vpn, proxy, datacenter_proxy, residential_proxy, tor, relay, hosting or cdn. unknown means we hold no label for the IP: treat it as no data, not as clean. suspected_vpn and vpn_suspect are advisory and set no boolean flag. On Starter and up, a hosting address can be relabelled proxy because of its ASN's abuse profile (see asn_abuse_promoted).","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.classification","typeLabel":"string"},"provider":{"oneOf":[{"type":"string","description":"The named operator of the IP, where we have attributed one: a VPN service, proxy network, privacy relay, CDN, hosting provider or the Tor network. Residential proxy exits are attributed by name on a subset only, so provider can be null on every plan. Starter and up, and Pro and up when the classification is a residential proxy label; below that plan the key is present with null. For a residential proxy address it can name several networks, separated by a comma and a space.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.provider.oneOf.0","typeLabel":"string"},{"type":"null","description":"The named operator of the IP, where we have attributed one: a VPN service, proxy network, privacy relay, CDN, hosting provider or the Tor network. Residential proxy exits are attributed by name on a subset only, so provider can be null on every plan. Starter and up, and Pro and up when the classification is a residential proxy label; below that plan the key is present with null. For a residential proxy address it can name several networks, separated by a comma and a space.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.provider.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.provider","typeLabel":"string | null"},"confidence":{"oneOf":[{"type":"number","minimum":0,"maximum":1,"description":"How sure we are of the classification, from 0 to 1. 0 when the classification is unknown. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":1,"description":"How sure we are of the classification, from 0 to 1. 0 when the classification is unknown. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence","typeLabel":"number | null"},"source":{"oneOf":[{"type":"string","enum":["port_scan","proxy_enum","netflow_analysis","asn_classification","ct_log","rdns_cdn","ptr_resolution","public_list","partner_feed","dns_enumeration","appliance_probe","other",null],"description":"How the winning label was detected, as one value from a fixed list of method names. Null when the IP has no classification.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["port_scan","proxy_enum","netflow_analysis","asn_classification","ct_log","rdns_cdn","ptr_resolution","public_list","partner_feed","dns_enumeration","appliance_probe","other",null],"description":"How the winning label was detected, as one value from a fixed list of method names. Null when the IP has no classification.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.source","typeLabel":"enum\u003cstring> | null"},"detection_method":{"oneOf":[{"type":"string","enum":["port_scan","proxy_enum","netflow_analysis","asn_classification","ct_log","rdns_cdn","ptr_resolution","public_list","partner_feed","dns_enumeration","appliance_probe","other",null],"description":"The same value as source.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.detection_method.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["port_scan","proxy_enum","netflow_analysis","asn_classification","ct_log","rdns_cdn","ptr_resolution","public_list","partner_feed","dns_enumeration","appliance_probe","other",null],"description":"The same value as source.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.detection_method.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.detection_method","typeLabel":"enum\u003cstring> | null"},"first_seen":{"oneOf":[{"type":"string","format":"date-time","description":"When the winning label was first recorded for the IP or its range, in ISO 8601. Null when the classification is unknown, or when the label is inferred from the ASN alone with no listed range behind it (network is then null too). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.first_seen.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the winning label was first recorded for the IP or its range, in ISO 8601. Null when the classification is unknown, or when the label is inferred from the ASN alone with no listed range behind it (network is then null too). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.first_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.first_seen","typeLabel":"string\u003cdate-time> | null"},"last_seen":{"oneOf":[{"type":"string","format":"date-time","description":"When the winning label was last confirmed for the IP or its range, in ISO 8601. Null when the classification is unknown, or when the label is inferred from the ASN alone with no listed range behind it (network is then null too). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.last_seen.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the winning label was last confirmed for the IP or its range, in ISO 8601. Null when the classification is unknown, or when the label is inferred from the ASN alone with no listed range behind it (network is then null too). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.last_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.last_seen","typeLabel":"string\u003cdate-time> | null"},"observation_count":{"oneOf":[{"type":"integer","minimum":0,"description":"How many times we observed this exact address as a residential proxy exit over the trailing 90 days. An address we have not seen in that window keeps its last count. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.observation_count.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"How many times we observed this exact address as a residential proxy exit over the trailing 90 days. An address we have not seen in that window keeps its last count. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.observation_count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.observation_count","typeLabel":"integer | null"},"hits_days_pct":{"oneOf":[{"type":"number","minimum":0,"maximum":100,"description":"Percentage of the trailing 90 days on which the address was seen at least once, from 0 to 100. Null unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives null. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.hits_days_pct.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":100,"description":"Percentage of the trailing 90 days on which the address was seen at least once, from 0 to 100. Null unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives null. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.hits_days_pct.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.hits_days_pct","typeLabel":"number | null"},"providers_num":{"oneOf":[{"type":"integer","minimum":0,"description":"How many distinct residential proxy networks the address was seen on over about the last 90 days. The count is rebuilt weekly, so a network can stay counted for up to a week after its last sighting leaves that window, and an address we have not seen at all in that window keeps its last count. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.providers_num.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"How many distinct residential proxy networks the address was seen on over about the last 90 days. The count is rebuilt weekly, so a network can stay counted for up to a week after its last sighting leaves that window, and an address we have not seen at all in that window keeps its last count. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.providers_num.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.providers_num","typeLabel":"integer | null"},"confidence_decay":{"oneOf":[{"type":"number","minimum":0,"maximum":1.5,"description":"A score for a residential proxy address that combines how recently, how often and on how many networks it was seen. It runs from 0 to 1.5 and falls as the last sighting ages. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence_decay.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"maximum":1.5,"description":"A score for a residential proxy address that combines how recently, how often and on how many networks it was seen. It runs from 0 to 1.5 and falls as the last sighting ages. 0 unless the label comes from our sightings of the address itself (network is then null); a label from a listed network, a single-address /32 included, gives 0. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence_decay.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.confidence_decay","typeLabel":"number | null"},"freshness_class":{"oneOf":[{"type":"string","enum":["current","recent","stale","frozen",null],"description":"The age of last_seen as a bucket: current (less than 2 days old), recent (less than 8 days), stale (less than 91 days) or frozen (91 days or older, or never seen). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.freshness_class.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["current","recent","stale","frozen",null],"description":"The age of last_seen as a bucket: current (less than 2 days old), recent (less than 8 days), stale (less than 91 days) or frozen (91 days or older, or never seen). Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.freshness_class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.freshness_class","typeLabel":"enum\u003cstring> | null"},"is_vpn":{"type":"boolean","description":"True for a confirmed VPN label: vpn, commercial_vpn, corporate_vpn, vpn_hosting or the retired vpn_concentrator. Suspected VPN labels leave it false.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_vpn","typeLabel":"boolean"},"is_proxy":{"type":"boolean","description":"True when the classification is proxy, datacenter_proxy, mobile_proxy or suspected_proxy. Residential proxy labels set is_residential_proxy instead.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_proxy","typeLabel":"boolean"},"is_tor":{"type":"boolean","description":"True when the classification is tor.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_tor","typeLabel":"boolean"},"is_relay":{"type":"boolean","description":"True when the classification is relay, a privacy relay such as iCloud Private Relay.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_relay","typeLabel":"boolean"},"is_hosting":{"type":"boolean","description":"True when the classification is hosting.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_hosting","typeLabel":"boolean"},"is_cdn":{"type":"boolean","description":"True when the classification is cdn.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_cdn","typeLabel":"boolean"},"is_residential_proxy":{"type":"boolean","description":"True for any residential proxy label: residential_proxy, residential_proxy_gateway, residential_proxy_likely or residential_proxy_mobile.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_residential_proxy","typeLabel":"boolean"},"is_residential_proxy_high_confidence":{"type":"boolean","description":"True when the classification is residential_proxy itself, not its gateway, likely or mobile variant. Pro and up; below Pro the key is present with false.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_residential_proxy_high_confidence","typeLabel":"boolean"},"is_residential_proxy_mobile":{"type":"boolean","description":"True when the classification is residential_proxy_mobile. Pro and up; below Pro the key is present with false.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_residential_proxy_mobile","typeLabel":"boolean"},"is_open_proxy":{"type":"boolean","description":"True when the winning label comes from a public open proxy list. When a more specific label wins, for example residential_proxy or tor, it is false even if the IP is also on such a list.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_open_proxy","typeLabel":"boolean"},"is_corporate_vpn":{"type":"boolean","description":"True when the classification is corporate_vpn, a company VPN appliance. is_vpn is true as well.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.is_corporate_vpn","typeLabel":"boolean"},"infra_type":{"oneOf":[{"type":"string","enum":["datacenter","residential","mobile",null],"description":"The kind of network the IP sits on. It comes from the label when the label implies one, and otherwise from the ASN that announces the IP. Every residential proxy label gives residential. mobile comes only from the mobile_proxy label, which has not been assigned since 2026-05-02, and no ASN is classed as a mobile carrier today, so infra_type does not mark mobile networks. Null when neither says.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.infra_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["datacenter","residential","mobile",null],"description":"The kind of network the IP sits on. It comes from the label when the label implies one, and otherwise from the ASN that announces the IP. Every residential proxy label gives residential. mobile comes only from the mobile_proxy label, which has not been assigned since 2026-05-02, and no ASN is classed as a mobile carrier today, so infra_type does not mark mobile networks. Null when neither says.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.infra_type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.infra_type","typeLabel":"enum\u003cstring> | null"},"risk_score":{"type":"integer","minimum":0,"maximum":100,"description":"Risk score from 0 to 100, based on the classification and its confidence. Returned on every plan, Intro included. A residential proxy hit scores by how recently we saw the address, in the freshness_class buckets (the bucket itself is shown from Pro): current 95-100, recent 75-85, stale 45-60, frozen 25-35. Within a bucket, an address seen on more days and through more networks scores higher. A VPN, proxy, threat-list or hosting match on the same address keeps the score it would have on its own, so the band never lowers it. On a mobile carrier, satellite network or secure web gateway that we list as shared by many people, a residential proxy hit scores at most 60 whatever its recency and carries the SHARED_ADDRESS_NETWORK reason: step it up, with a challenge or a review, rather than block it. The list does not yet cover every such network. On Starter and up, the score for a hosting address also reflects its ASN's abuse profile (see hosting_risk_calibrated). The score is not a probability.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.risk_score","typeLabel":"integer"},"asn":{"oneOf":[{"type":"integer","description":"The autonomous system number that announces the IP. Null when unknown.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The autonomous system number that announces the IP. Null when unknown.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn","typeLabel":"integer | null"},"asn_org":{"oneOf":[{"type":"string","description":"The name of the organization that holds that ASN. Null when unknown.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_org.oneOf.0","typeLabel":"string"},{"type":"null","description":"The name of the organization that holds that ASN. Null when unknown.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_org.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_org","typeLabel":"string | null"},"netblock":{"oneOf":[{"type":"string","description":"The most specific registered network block that contains the IP, as its first and last address joined by a hyphen, for example 8.8.8.0-8.8.8.255. It is a range, not CIDR notation: a registered block need not fall on a CIDR boundary. Null when no registered block is known. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock.oneOf.0","typeLabel":"string"},{"type":"null","description":"The most specific registered network block that contains the IP, as its first and last address joined by a hyphen, for example 8.8.8.0-8.8.8.255. It is a range, not CIDR notation: a registered block need not fall on a CIDR boundary. Null when no registered block is known. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock","typeLabel":"string | null"},"netname":{"oneOf":[{"type":"string","description":"The registry's name for that block. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netname.oneOf.0","typeLabel":"string"},{"type":"null","description":"The registry's name for that block. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netname.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netname","typeLabel":"string | null"},"netblock_org":{"oneOf":[{"type":"string","description":"The organization the registry lists as holding that block. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock_org.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization the registry lists as holding that block. Starter and up; below Starter (Intro and the free sign-up lookups) the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock_org.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.netblock_org","typeLabel":"string | null"},"cdn_operator":{"oneOf":[{"type":"string","description":"The CDN operator. Set only when the classification is cdn, and null otherwise.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.cdn_operator.oneOf.0","typeLabel":"string"},{"type":"null","description":"The CDN operator. Set only when the classification is cdn, and null otherwise.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.cdn_operator.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.cdn_operator","typeLabel":"string | null"},"metadata":{"type":"object","properties":{"raw_score":{"oneOf":[{"type":"number","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.raw_score.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.raw_score.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.metadata.raw_score","typeLabel":"number | null"},"signals":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.signals.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.signals.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.metadata.signals","typeLabel":"object | null"},"dns_enrichment":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.dns_enrichment.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.dns_enrichment.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.metadata.dns_enrichment","typeLabel":"object | null"},"tls_enrichment":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.tls_enrichment.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"results.items.[INDEX].oneOf.0.metadata.tls_enrichment.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.metadata.tls_enrichment","typeLabel":"object | null"}},"description":"Extra detection detail. An empty object when the IP has no classification, or when the label is inferred from the ASN alone with no listed range behind it (network is then null too).","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.metadata","typeLabel":"object"},"reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"A stable reason code.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.reasons.items.[INDEX].code","typeLabel":"string"},"detail":{"type":"object","description":"Values behind the reason. It can be empty. PTR_HOSTNAME's detail is {\"reverse_dns\": true} rather than the hostname wherever the provider name is withheld by plan: below Starter, and on a residential proxy exit below Pro.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.reasons.items.[INDEX].detail","typeLabel":"object"}},"required":["code","detail"],"uniqueKey":"results.items.[INDEX].oneOf.0.reasons.items.[INDEX]","typeLabel":"object"},"description":"Reason codes that explain the classification, each with a detail object. The codes are stable. Empty when there is nothing to explain, for example when the classification is unknown. Codes that rest on network-telemetry signals are not returned on any plan today.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.reasons","typeLabel":"object[]"},"asn_abuse":{"oneOf":[{"type":"object","properties":{"abuse_score":{"type":"integer","minimum":0,"maximum":100,"description":"Abuse score of the ASN, from 0 to 100.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0.abuse_score","typeLabel":"integer"},"abuse_level":{"type":"string","enum":["clean","low","moderate","high","critical"],"description":"The score as a level: clean (below 20), low (20 to 39), moderate (40 to 59), high (60 to 79) or critical (80 and up).","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0.abuse_level","typeLabel":"enum\u003cstring>"},"flagged_ratio":{"type":"number","minimum":0,"description":"flagged_ip_count divided by total_announced_ips, or 0 when total_announced_ips is 0. Pro and up; not returned on lower plans.","x-min-plan":"pro","uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0.flagged_ratio","typeLabel":"number"},"flagged_ip_count":{"type":"integer","minimum":0,"description":"How many of the ASN's announced IPv4 addresses we flag. It counts our flagged range entries rather than single addresses, so it is an estimate, and it is never more than total_announced_ips. Pro and up; not returned on lower plans.","x-min-plan":"pro","uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0.flagged_ip_count","typeLabel":"integer"},"total_announced_ips":{"type":"integer","minimum":0,"description":"How many IPv4 addresses the ASN announces; 0 when we hold no IPv4 prefix for it. Pro and up; not returned on lower plans.","x-min-plan":"pro","uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0.total_announced_ips","typeLabel":"integer"}},"required":["abuse_score","abuse_level"],"description":"Abuse profile of the ASN that announces the IP. Null when we hold no score for that ASN, or when the check could not run (see data_status). Every plan gets abuse_score and abuse_level. Pro and up also get flagged_ratio, flagged_ip_count and total_announced_ips, which are not returned on lower plans.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"abuse_score":{"type":"integer","minimum":0,"maximum":100,"description":"Abuse score of the ASN, from 0 to 100.","x-min-plan":"intro"},"abuse_level":{"type":"string","enum":["clean","low","moderate","high","critical"],"description":"The score as a level: clean (below 20), low (20 to 39), moderate (40 to 59), high (60 to 79) or critical (80 and up).","x-min-plan":"intro"},"flagged_ratio":{"type":"number","minimum":0,"description":"flagged_ip_count divided by total_announced_ips, or 0 when total_announced_ips is 0. Pro and up; not returned on lower plans.","x-min-plan":"pro"},"flagged_ip_count":{"type":"integer","minimum":0,"description":"How many of the ASN's announced IPv4 addresses we flag. It counts our flagged range entries rather than single addresses, so it is an estimate, and it is never more than total_announced_ips. Pro and up; not returned on lower plans.","x-min-plan":"pro"},"total_announced_ips":{"type":"integer","minimum":0,"description":"How many IPv4 addresses the ASN announces; 0 when we hold no IPv4 prefix for it. Pro and up; not returned on lower plans.","x-min-plan":"pro"}},"required":["abuse_score","abuse_level"],"description":"Abuse profile of the ASN that announces the IP. Null when we hold no score for that ASN, or when the check could not run (see data_status). Every plan gets abuse_score and abuse_level. Pro and up also get flagged_ratio, flagged_ip_count and total_announced_ips, which are not returned on lower plans.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse","typeLabel":"object | null"},"sanctions_risk":{"oneOf":[{"type":"object","description":"Reserved for a sanctions-exposure assessment. Null on every plan; its fields are not part of this version of the API.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.sanctions_risk.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved for a sanctions-exposure assessment. Null on every plan; its fields are not part of this version of the API.","x-min-plan":"intro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.sanctions_risk.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.sanctions_risk","typeLabel":"object | null"},"operator_profile":{"oneOf":[{"type":"object","properties":{"network_type":{"type":"string","description":"The kind of proxy network, for example residential, mobile, datacenter or isp.","uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0.network_type","typeLabel":"string"},"supports_geo_targeting":{"type":"boolean","description":"True when we know the network lets its users choose the exit country. False means we know of no such option, not that the network lacks one.","uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0.supports_geo_targeting","typeLabel":"boolean"},"geo_markets":{"type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0.geo_markets.items.[INDEX]","typeLabel":"string"},"description":"Countries we know this network offers exits in, as lowercase ISO 3166-1 alpha-2 codes. Not a list of every country it covers.","uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0.geo_markets","typeLabel":"string[]"},"rotation":{"type":"string","enum":["rotating","sticky_supported"],"description":"sticky_supported when we know the network offers sessions that keep one exit; rotating otherwise. rotating does not mean the network lacks sticky sessions.","uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0.rotation","typeLabel":"enum\u003cstring>"}},"description":"Facts we hold about the proxy network named in provider. Null when provider is null, names more than one network, or we hold no profile for it, which includes VPN services. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"network_type":{"type":"string","description":"The kind of proxy network, for example residential, mobile, datacenter or isp."},"supports_geo_targeting":{"type":"boolean","description":"True when we know the network lets its users choose the exit country. False means we know of no such option, not that the network lacks one."},"geo_markets":{"type":"array","items":{"type":"string"},"description":"Countries we know this network offers exits in, as lowercase ISO 3166-1 alpha-2 codes. Not a list of every country it covers."},"rotation":{"type":"string","enum":["rotating","sticky_supported"],"description":"sticky_supported when we know the network offers sessions that keep one exit; rotating otherwise. rotating does not mean the network lacks sticky sessions."}},"description":"Facts we hold about the proxy network named in provider. Null when provider is null, names more than one network, or we hold no profile for it, which includes VPN services. Pro and up; below Pro the key is present with null.","x-min-plan":"pro","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_profile","typeLabel":"object | null"},"operator_group":{"oneOf":[{"type":"string","description":"The corporate group behind the named provider. Null when provider is null, or when we know no group for it. Starter and up, and Pro and up when the classification is a residential proxy label, the same rule as provider; below that plan the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_group.oneOf.0","typeLabel":"string"},{"type":"null","description":"The corporate group behind the named provider. Null when provider is null, or when we know no group for it. Starter and up, and Pro and up when the classification is a residential proxy label, the same rule as provider; below that plan the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_group.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_group","typeLabel":"string | null"},"operator_legal_name":{"oneOf":[{"type":"string","description":"The legal name of the company behind that group. Null when provider is null, or when we know no legal name for it. Starter and up, and Pro and up when the classification is a residential proxy label, the same rule as provider; below that plan the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_legal_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The legal name of the company behind that group. Null when provider is null, or when we know no legal name for it. Starter and up, and Pro and up when the classification is a residential proxy label, the same rule as provider; below that plan the key is present with null.","x-min-plan":"starter","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_legal_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.operator_legal_name","typeLabel":"string | null"},"original_classification":{"type":"string","description":"The classification before any ASN-abuse promotion. It equals classification unless asn_abuse_promoted is true. Starter and up; not returned on Intro or the free sign-up lookups.","x-min-plan":"starter","uniqueKey":"results.items.[INDEX].oneOf.0.original_classification","typeLabel":"string"},"asn_abuse_promoted":{"type":"boolean","description":"True when a hosting address was relabelled proxy because of its ASN's abuse profile. Starter and up; not returned on Intro or the free sign-up lookups.","x-min-plan":"starter","uniqueKey":"results.items.[INDEX].oneOf.0.asn_abuse_promoted","typeLabel":"boolean"},"hosting_risk_calibrated":{"type":"boolean","description":"True when risk_score for a hosting address was set from its ASN's abuse profile. False otherwise. Starter and up; not returned on Intro or the free sign-up lookups.","x-min-plan":"starter","uniqueKey":"results.items.[INDEX].oneOf.0.hosting_risk_calibrated","typeLabel":"boolean"},"data_status":{"type":"object","properties":{"asn_abuse_check":{"type":"string","enum":["degraded"],"description":"The ASN abuse check could not run.","uniqueKey":"results.items.[INDEX].oneOf.0.data_status.asn_abuse_check","typeLabel":"enum\u003cstring>"},"sanctions_check":{"type":"string","enum":["degraded"],"description":"The sanctions check could not run.","uniqueKey":"results.items.[INDEX].oneOf.0.data_status.sanctions_check","typeLabel":"enum\u003cstring>"}},"description":"Not always present: returned only when a check could not run. Each key it holds is set to degraded, and the matching field (asn_abuse or sanctions_risk) is then null because the check failed, not because no risk was found.","x-min-plan":"intro","uniqueKey":"results.items.[INDEX].oneOf.0.data_status","typeLabel":"object"},"observed_location":{"oneOf":[{"type":"object","properties":{"exit_country":{"oneOf":[{"type":"string","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.exit_country.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.exit_country.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.exit_country","typeLabel":"string | null"},"observed_lat":{"oneOf":[{"type":"number","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lat.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lat.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lat","typeLabel":"number | null"},"observed_lon":{"oneOf":[{"type":"number","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lon.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lon.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_lon","typeLabel":"number | null"},"observed_countries":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observed_countries","typeLabel":"string[] | null"},"observation_readings":{"oneOf":[{"type":"array","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observation_readings.oneOf.0","typeLabel":"array"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observation_readings.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.observation_readings","typeLabel":"array | null"},"user_countries":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_countries.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Countries of the users we observe connecting to this IP, as uppercase ISO 3166-1 alpha-2 codes. Null when we hold none.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_countries.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Countries of the users we observe connecting to this IP, as uppercase ISO 3166-1 alpha-2 codes. Null when we hold none.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_countries.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_countries","typeLabel":"string[] | null"},"user_country_count":{"oneOf":[{"type":"integer","minimum":1,"description":"How many countries user_countries lists. Null when user_countries is null.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_country_count.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"How many countries user_countries lists. Null when user_countries is null.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_country_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.user_country_count","typeLabel":"integer | null"},"netflow_protocol":{"oneOf":[{"type":"string","description":"The VPN protocol that the ports in this IP's traffic point to, for example openvpn, wireguard or ikev2. It is inferred from the ports, so treat it as an indication rather than a confirmed protocol. Not always present: returned only when one protocol's ports clearly dominate that traffic.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.netflow_protocol.oneOf.0","typeLabel":"string"},{"type":"null","description":"The VPN protocol that the ports in this IP's traffic point to, for example openvpn, wireguard or ikev2. It is inferred from the ports, so treat it as an indication rather than a confirmed protocol. Not always present: returned only when one protocol's ports clearly dominate that traffic.","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.netflow_protocol.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0.netflow_protocol","typeLabel":"string | null"}},"description":"Enterprise only: the key is not returned on other plans. Null when we hold no observation for the IP.","x-min-plan":"enterprise","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"exit_country":{"oneOf":[{"type":"string","description":"Reserved. Always null today."},{"type":"null","description":"Reserved. Always null today."}]},"observed_lat":{"oneOf":[{"type":"number","description":"Reserved. Always null today."},{"type":"null","description":"Reserved. Always null today."}]},"observed_lon":{"oneOf":[{"type":"number","description":"Reserved. Always null today."},{"type":"null","description":"Reserved. Always null today."}]},"observed_countries":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Reserved. Always null today."},{"type":"null","items":{"type":"string"},"description":"Reserved. Always null today."}]},"observation_readings":{"oneOf":[{"type":"array","description":"Reserved. Always null today."},{"type":"null","description":"Reserved. Always null today."}]},"user_countries":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Countries of the users we observe connecting to this IP, as uppercase ISO 3166-1 alpha-2 codes. Null when we hold none."},{"type":"null","items":{"type":"string"},"description":"Countries of the users we observe connecting to this IP, as uppercase ISO 3166-1 alpha-2 codes. Null when we hold none."}]},"user_country_count":{"oneOf":[{"type":"integer","minimum":1,"description":"How many countries user_countries lists. Null when user_countries is null."},{"type":"null","minimum":1,"description":"How many countries user_countries lists. Null when user_countries is null."}]},"netflow_protocol":{"oneOf":[{"type":"string","description":"The VPN protocol that the ports in this IP's traffic point to, for example openvpn, wireguard or ikev2. It is inferred from the ports, so treat it as an indication rather than a confirmed protocol. Not always present: returned only when one protocol's ports clearly dominate that traffic."},{"type":"null","description":"The VPN protocol that the ports in this IP's traffic point to, for example openvpn, wireguard or ikev2. It is inferred from the ports, so treat it as an indication rather than a confirmed protocol. Not always present: returned only when one protocol's ports clearly dominate that traffic."}]}},"description":"Enterprise only: the key is not returned on other plans. Null when we hold no observation for the IP.","x-min-plan":"enterprise","uniqueKey":"results.items.[INDEX].oneOf.0.observed_location.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.observed_location","typeLabel":"object | null"},"vpn_exit_confidence":{"type":"number","minimum":0.5,"maximum":0.99,"description":"Reserved. Not returned on any plan today. It is a Pro and up score, from 0.5 to 0.99, of how strongly our other signals back the VPN brand attribution when the classification is vpn and the source is dns_enumeration; it does not say whether the exit is in use right now.","x-min-plan":"pro","uniqueKey":"results.items.[INDEX].oneOf.0.vpn_exit_confidence","typeLabel":"number"}},"uniqueKey":"results.items.[INDEX].oneOf.0","typeLabel":"IpLookupResponse · object"},{"type":"object","title":"BatchRowError","description":"A batch row for an IP that could not be looked up.","required":["ip","error"],"properties":{"ip":{"type":"string","description":"The IP string as you sent it.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.ip","typeLabel":"string"},"error":{"oneOf":[{"type":"object","description":"The IP was not looked up: it does not parse (invalid_ip_format), is a bare integer (invalid_ip_integer_form), or is a private or reserved address (invalid_ip_reserved). CGNAT space (100.64.0.0/10) is not rejected: it is looked up and billed like any other address. code is the same one a single lookup of that IP returns with HTTP 400.","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_ip_format","invalid_ip_integer_form","invalid_ip_reserved"],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.0.message","typeLabel":"string"}},"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.0","typeLabel":"object"},{"type":"object","description":"The lookup failed on our side for this IP. Retry the IP later. code is internal_error, the same code a request that fails on our side returns with HTTP 500, and message is always the same sentence.","required":["code","message"],"properties":{"code":{"type":"string","enum":["internal_error"],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.1.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","enum":["An unexpected error occurred"],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.1.message","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error","typeLabel":"object"}},"uniqueKey":"results.items.[INDEX].oneOf.1","typeLabel":"BatchRowError · object"}],"uniqueKey":"results.items.[INDEX]","typeLabel":"IpLookupResponse · object | BatchRowError · object"},"isRequired":true,"uniqueKey":"results","typeLabel":"(IpLookupResponse · object | BatchRowError · object)[]"},"credits_charged":{"type":"integer","minimum":0,"description":"Credits charged for this request: one per distinct IP looked up. Rows with error are free. One address sent in two spellings (8.8.8.8 and ::ffff:8.8.8.8) gets two rows but is one IP, so it costs one credit. 0 when nothing is charged, as when every row has error.","isRequired":true,"uniqueKey":"credits_charged","typeLabel":"integer"}},"required":["results","credits_charged"],"uniqueKey":"","typeLabel":"BatchLookupResponse · object"},"examples":{"Example":{"title":"Example","value":{"results":[{"ip":"\u003cstring>","network":"\u003cstring>","classification":"\u003cstring>","provider":"\u003cstring>","confidence":0.5,"source":"port_scan","detection_method":"port_scan","first_seen":"2023-11-07T05:31:56Z","last_seen":"2023-11-07T05:31:56Z","observation_count":1,"hits_days_pct":50,"providers_num":1,"confidence_decay":0.75,"freshness_class":"current","is_vpn":true,"is_proxy":true,"is_tor":true,"is_relay":true,"is_hosting":true,"is_cdn":true,"is_residential_proxy":true,"is_residential_proxy_high_confidence":true,"is_residential_proxy_mobile":true,"is_open_proxy":true,"is_corporate_vpn":true,"infra_type":"datacenter","risk_score":50,"asn":123,"asn_org":"\u003cstring>","netblock":"\u003cstring>","netname":"\u003cstring>","netblock_org":"\u003cstring>","cdn_operator":"\u003cstring>","metadata":{"raw_score":123,"signals":{},"dns_enrichment":{},"tls_enrichment":{}},"reasons":[{"code":"\u003cstring>","detail":{}}],"asn_abuse":{"abuse_score":50,"abuse_level":"clean","flagged_ratio":1,"flagged_ip_count":1,"total_announced_ips":1},"sanctions_risk":{},"operator_profile":{"network_type":"\u003cstring>","supports_geo_targeting":true,"geo_markets":["\u003cstring>"],"rotation":"rotating"},"operator_group":"\u003cstring>","operator_legal_name":"\u003cstring>","original_classification":"\u003cstring>","asn_abuse_promoted":true,"hosting_risk_calibrated":true,"data_status":{"asn_abuse_check":"degraded","sanctions_check":"degraded"},"observed_location":{"exit_country":"\u003cstring>","observed_lat":123,"observed_lon":123,"observed_countries":["\u003cstring>"],"observation_readings":"\u003carray>","user_countries":["\u003cstring>"],"user_country_count":2,"netflow_protocol":"\u003cstring>"},"vpn_exit_confidence":0.745}],"credits_charged":1}}},"exampleType":"generated"}},"exampleType":"generated"},"d31f47a8-f60c-4ecf-9631-223af5a00c80":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"oneOf":[{"type":"string","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.1","typeLabel":"integer"}],"uniqueKey":"detail.items.[INDEX].loc.items.[INDEX]","typeLabel":"string | integer"},"type":"array","title":"Location","isRequired":true,"uniqueKey":"detail.items.[INDEX].loc","typeLabel":"(string | integer)[]"},"msg":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"detail.items.[INDEX].msg","typeLabel":"string"},"type":{"type":"string","title":"Error Type","isRequired":true,"uniqueKey":"detail.items.[INDEX].type","typeLabel":"string"},"input":{"oneOf":[{"title":"Input"}],"uniqueKey":"detail.items.[INDEX].input","typeLabel":"any"},"ctx":{"type":"object","title":"Context","uniqueKey":"detail.items.[INDEX].ctx","typeLabel":"Context · object"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError","uniqueKey":"detail.items.[INDEX]","typeLabel":"ValidationError · object"},"type":"array","title":"Detail","uniqueKey":"detail","typeLabel":"ValidationError · object[]"}},"type":"object","title":"HTTPValidationError","uniqueKey":"","typeLabel":"HTTPValidationError · object"},"examples":{"Example":{"title":"Example","value":{"detail":[{"loc":["\u003cstring>"],"msg":"\u003cstring>","type":"\u003cstring>","input":"\u003cunknown>","ctx":{}}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"ec8686e5-4c7b-4fce-b111-ff1d794dfa50":{"apiKey":{"type":"apiKey","in":"query","name":"apiKey","description":"Your API key, passed as the apiKey query parameter on every request. A key sent in a header (Authorization or X-API-Key) is not accepted and gets 401.","scopes":[],"schemeName":"apiKey"}}},"servers":{"7146a852-320d-457e-92f4-ba15e4ba85a4":{"url":"https://vpn-proxy-detection.whoisxmlapi.com","description":"The public API. Every path in this reference starts with /api/v1."}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"query","name":"apiKey","description":"Your API key, passed as the apiKey query parameter on every request. A key sent in a header (Authorization or X-API-Key) is not accepted and gets 401.","scopes":[],"schemeName":"apiKey"},"schema":{"title":"apiKey","type":"string","description":"Your API key, passed as the apiKey query parameter on every request. A key sent in a header (Authorization or X-API-Key) is not accepted and gets 401.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"apiKey"}],"title":"apiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"whoisapi","siteName":"VPN \u0026 Proxy Detection API","title":"Batch IP lookup - VPN \u0026 Proxy Detection API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-04-29T18:34:48.208Z","originalFileLocation":"api-reference/lookup-batch.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Classify up to 100 IPs in one request.\">\u003cmeta data-mint-head name=\"application-name\" content=\"VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/favicon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/favicon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/favicon.png\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/favicon.png\">\u003cmeta data-mint-head property=\"og:title\" content=\"Batch IP lookup - VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Classify up to 100 IPs in one request.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://vpn-docs.wxapros.com/api-reference/lookup-batch\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://whoisapi.mintlify.app/_mintlify/api/og/v2?division=Lookup\u0026amp;title=Batch+IP+lookup\u0026amp;description=Classify+up+to+100+IPs+in+one+request.\u0026amp;theme=2d814d5bab6035f0e6472a06\u0026amp;signature=aef075d8d8f58b066471e1ce9adac5be58a1e10b66e661df6dddf875a74caa4d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Batch IP lookup - VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Classify up to 100 IPs in one request.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://whoisapi.mintlify.app/_mintlify/api/og/v2?division=Lookup\u0026amp;title=Batch+IP+lookup\u0026amp;description=Classify+up+to+100+IPs+in+one+request.\u0026amp;theme=2d814d5bab6035f0e6472a06\u0026amp;signature=aef075d8d8f58b066471e1ce9adac5be58a1e10b66e661df6dddf875a74caa4d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0F62FE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://vpn-docs.wxapros.com/api-reference/lookup-batch\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/lookup-batch.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://vpn-docs.wxapros.com/#organization\",\"name\":\"VPN \u0026 Proxy Detection API\",\"url\":\"https://vpn-docs.wxapros.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintlify.s3.us-west-1.amazonaws.com/whoisapi/images/logo.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://vpn-docs.wxapros.com#website\",\"name\":\"VPN \u0026 Proxy Detection API\",\"url\":\"https://vpn-docs.wxapros.com\",\"publisher\":{\"@id\":\"https://vpn-docs.wxapros.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch#webpage\",\"url\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch\",\"name\":\"Batch IP lookup\",\"description\":\"Classify up to 100 IPs in one request.\",\"dateModified\":\"2026-04-29T18:34:48.208Z\",\"isPartOf\":{\"@id\":\"https://vpn-docs.wxapros.com#website\"},\"breadcrumb\":{\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Lookup\",\"item\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Batch IP lookup\",\"item\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch#apireference\",\"headline\":\"Batch IP lookup\",\"name\":\"Batch IP lookup\",\"description\":\"Classify up to 100 IPs in one request.\",\"url\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch\",\"mainEntityOfPage\":{\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-batch#webpage\"},\"dateModified\":\"2026-04-29T18:34:48.208Z\",\"publisher\":{\"@id\":\"https://vpn-docs.wxapros.com/#organization\"},\"isPartOf\":{\"@id\":\"https://vpn-docs.wxapros.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"VPN \u0026 Proxy Detection API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"VPN \u0026 Proxy Detection API","nav":{"global":{"anchors":[{"anchor":"Pricing","href":"https://vpn-proxy-detection.whoisxmlapi.com/api/pricing","icon":"tag"}]},"anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"},{"title":"Tiers","href":"/tiers"}]},{"group":"Guides","pages":[{"title":"IP Lookups","href":"/guides/lookups"},{"title":"Categories and actions","href":"/guides/categories-and-actions"},{"title":"Point-in-time lookups","href":"/guides/point-in-time"},{"title":"Bulk Exports","href":"/guides/bulk-export"},{"title":"ASN Abuse","href":"/guides/asn-abuse"},{"title":"Error Handling","href":"/guides/error-handling"}]},{"group":"Reference","pages":[{"title":"API Reference Overview","href":"/api-reference/overview"},{"title":"Changelog","href":"/changelog"}]},{"group":"Lookup","pages":[{"title":"Look up a single IP","description":"Classify one IP address.","openapi":"GET /api/v1","href":"/api-reference/lookup-ip"},{"title":"Batch IP lookup","openapi":"POST /api/v1/ip/batch","href":"/api-reference/lookup-batch"},{"title":"Shadow VPN lookup","description":"Remote-access infrastructure assets on an IP.","openapi":"GET /api/v1/shadow_vpn/lookup/{ip}","href":"/api-reference/shadow-vpn-lookup"}]},{"group":"Aggregates","pages":[{"title":"Global stats","openapi":"GET /api/v1/stats","href":"/api-reference/stats"},{"title":"List providers","openapi":"GET /api/v1/providers","href":"/api-reference/providers"},{"title":"Per-country VPN stats","openapi":"GET /api/v1/stats/country/{code}","href":"/api-reference/country-stats"},{"title":"ASN abuse leaderboard","openapi":"GET /api/v1/stats/asn-abuse","href":"/api-reference/asn-abuse-stats"},{"title":"ASN reputation","openapi":"GET /api/v1/asn/{asn}","href":"/api-reference/asn-reputation"}]},{"group":"Bulk Exports","pages":[{"title":"Export CSV","openapi":"GET /api/v1/export/csv","href":"/api-reference/export-csv"},{"title":"Export MMDB","openapi":"GET /api/v1/export/mmdb","href":"/api-reference/export-mmdb"},{"title":"Export Parquet","openapi":"GET /api/v1/export/parquet","href":"/api-reference/export-parquet"},{"title":"Export dataset listing","openapi":"GET /api/v1/export/dataset","href":"/api-reference/export-dataset"}]},{"group":"Account","pages":[{"title":"Coverage report","openapi":"GET /api/v1/coverage/report","href":"/api-reference/coverage-report"}]}]}]},"basePath":"","title":"Batch IP lookup - VPN \u0026 Proxy Detection API","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","Page-Bevw23-4.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}