Answer for a past day instead of now: a UTC calendar day written YYYY-MM-DD, for example 2026-09-01. Business and Enterprise only; other plans get 403. The answer is built from that day's archived data under today's data-handling and attribution rules, and its body is IpAsOfResponse, not IpLookupResponse. The archive starts on 2026-07-31 and gains a day each day. Errors: 400 invalid_as_of when the value is not a calendar day; 400 as_of_outside_coverage when the archive holds no such day, with first_day and last_day in the error; 503 as_of_warming, with Retry-After, while that day is being prepared (retry in a minute); 503 as_of_over_budget or as_of_unavailable when the lookup cannot be served right now. A successful answer uses one lookup credit; errors use none.
Response
Successful Response
IpLookupResponse
IpAsOfResponse
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.
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).
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Required range: 0.5 <= x <= 0.99
{"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-ip","slug":"/api-reference/lookup-ip","pageMetadata":{"title":"Look up a single IP","description":"Classify one IP address.","openapi":"GET /api/v1","href":"/api-reference/lookup-ip"},"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 one IP address.\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,pre:`pre`,span:`span`,..._provideComponents(),...props.components},{CodeBlock}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Pass the IP as the `,_jsx(_components.code,{children:`ipAddress`}),` query parameter, the way every WhoisXML API\ntakes its input:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`GET https://vpn-proxy-detection.whoisxmlapi.com/api/v1?apiKey=YOUR_API_KEY\u0026ipAddress=1.1.1.1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The path form `,_jsx(_components.code,{children:`GET /api/v1/ip/{ip}`}),` is still supported and returns the same\nresponse.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Look up a single IP","description":"Classify one IP address.","openapi":"GET /api/v1","href":"/api-reference/lookup-ip"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Look up a single IP","description":"Classify one IP address.","operationId":"lookup_ip_by_query_api_v1_get","parameters":["56c3cedd-4d5d-4244-af89-f5535c4d47ad","c0225198-2333-409b-911e-257af9a7ed5b","b40847c2-915d-48c8-a701-b24e148ba0a6"],"responses":{"200":"fb926074-b54c-4f71-bd35-1b9433bd2686","400":"44694957-ff87-43da-9cae-4b68ffd23247","401":"a4825496-ad74-48fb-9983-9b6bfd2c1e37","403":"472463d7-71f1-4507-be29-96848e96c91e"},"method":"get","type":"path","servers":["7146a852-320d-457e-92f4-ba15e4ba85a4"],"security":["ec8686e5-4c7b-4fce-b111-ff1d794dfa50"],"path":"/api/v1","baseUrlOptions":["https://vpn-proxy-detection.whoisxmlapi.com"],"title":"Look up a single IP","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"56c3cedd-4d5d-4244-af89-f5535c4d47ad":{"name":"ipAddress","in":"query","required":true,"description":"IPv4 or IPv6 address to classify. Omitting it returns 400 missing_ip_address.","schema":{"type":"string","title":"Ipaddress","isRequired":true,"description":"IPv4 or IPv6 address to classify. Omitting it returns 400 missing_ip_address.","uniqueKey":"","typeLabel":"string"}},"c0225198-2333-409b-911e-257af9a7ed5b":{"name":"outputFormat","in":"query","required":false,"description":"Response format. JSON only.","schema":{"type":"string","title":"Outputformat","isRequired":false,"description":"Response format. JSON only.","uniqueKey":"","typeLabel":"string"}},"b40847c2-915d-48c8-a701-b24e148ba0a6":{"name":"as_of","in":"query","required":false,"description":"Answer for a past day instead of now: a UTC calendar day written YYYY-MM-DD, for example 2026-09-01. Business and Enterprise only; other plans get 403. The answer is built from that day's archived data under today's data-handling and attribution rules, and its body is IpAsOfResponse, not IpLookupResponse. The archive starts on 2026-07-31 and gains a day each day. Errors: 400 invalid_as_of when the value is not a calendar day; 400 as_of_outside_coverage when the archive holds no such day, with first_day and last_day in the error; 503 as_of_warming, with Retry-After, while that day is being prepared (retry in a minute); 503 as_of_over_budget or as_of_unavailable when the lookup cannot be served right now. A successful answer uses one lookup credit; errors use none.","schema":{"type":"string","format":"date","title":"As Of","isRequired":false,"description":"Answer for a past day instead of now: a UTC calendar day written YYYY-MM-DD, for example 2026-09-01. Business and Enterprise only; other plans get 403. The answer is built from that day's archived data under today's data-handling and attribution rules, and its body is IpAsOfResponse, not IpLookupResponse. The archive starts on 2026-07-31 and gains a day each day. Errors: 400 invalid_as_of when the value is not a calendar day; 400 as_of_outside_coverage when the archive holds no such day, with first_day and last_day in the error; 503 as_of_warming, with Retry-After, while that day is being prepared (retry in a minute); 503 as_of_over_budget or as_of_unavailable when the lookup cannot be served right now. A successful answer uses one lookup credit; errors use none.","uniqueKey":"","typeLabel":"string\u003cdate>"}}},"responses":{"fb926074-b54c-4f71-bd35-1b9433bd2686":{"description":"Successful Response","content":{"application/json":{"schema":{"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":"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":"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":"oneOf.0.network.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"oneOf.0.provider.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.confidence.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.detection_method.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.first_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.last_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.observation_count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.hits_days_pct.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.providers_num.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.confidence_decay.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.freshness_class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.is_proxy","typeLabel":"boolean"},"is_tor":{"type":"boolean","description":"True when the classification is tor.","x-min-plan":"intro","isRequired":true,"uniqueKey":"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":"oneOf.0.is_relay","typeLabel":"boolean"},"is_hosting":{"type":"boolean","description":"True when the classification is hosting.","x-min-plan":"intro","isRequired":true,"uniqueKey":"oneOf.0.is_hosting","typeLabel":"boolean"},"is_cdn":{"type":"boolean","description":"True when the classification is cdn.","x-min-plan":"intro","isRequired":true,"uniqueKey":"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":"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":"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":"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":"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":"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":"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":"oneOf.0.infra_type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"oneOf.0.asn.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.asn_org.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.netblock.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.netname.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.netblock_org.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.cdn_operator.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.cdn_operator","typeLabel":"string | null"},"metadata":{"type":"object","properties":{"raw_score":{"oneOf":[{"type":"number","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.raw_score.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.raw_score.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.metadata.raw_score","typeLabel":"number | null"},"signals":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.signals.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.signals.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.metadata.signals","typeLabel":"object | null"},"dns_enrichment":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.dns_enrichment.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.dns_enrichment.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.metadata.dns_enrichment","typeLabel":"object | null"},"tls_enrichment":{"oneOf":[{"type":"object","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.tls_enrichment.oneOf.0","typeLabel":"object"},{"type":"null","description":"Reserved. Null on every plan today.","uniqueKey":"oneOf.0.metadata.tls_enrichment.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"oneOf.0.metadata","typeLabel":"object"},"reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"A stable reason code.","isRequired":true,"uniqueKey":"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":"oneOf.0.reasons.items.[INDEX].detail","typeLabel":"object"}},"required":["code","detail"],"uniqueKey":"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":"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":"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":"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":"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":"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":"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":"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":"oneOf.0.asn_abuse.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.sanctions_risk.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.operator_profile.oneOf.0.supports_geo_targeting","typeLabel":"boolean"},"geo_markets":{"type":"array","items":{"type":"string","uniqueKey":"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":"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":"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":"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":"oneOf.0.operator_profile.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.operator_group.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"oneOf.0.operator_legal_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"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":"oneOf.0.data_status.asn_abuse_check","typeLabel":"enum\u003cstring>"},"sanctions_check":{"type":"string","enum":["degraded"],"description":"The sanctions check could not run.","uniqueKey":"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":"oneOf.0.data_status","typeLabel":"object"},"observed_location":{"oneOf":[{"type":"object","properties":{"exit_country":{"oneOf":[{"type":"string","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.exit_country.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.exit_country.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.observed_location.oneOf.0.exit_country","typeLabel":"string | null"},"observed_lat":{"oneOf":[{"type":"number","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lat.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lat.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lat","typeLabel":"number | null"},"observed_lon":{"oneOf":[{"type":"number","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lon.oneOf.0","typeLabel":"number"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lon.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_lon","typeLabel":"number | null"},"observed_countries":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_countries.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.observed_location.oneOf.0.observed_countries","typeLabel":"string[] | null"},"observation_readings":{"oneOf":[{"type":"array","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observation_readings.oneOf.0","typeLabel":"array"},{"type":"null","description":"Reserved. Always null today.","uniqueKey":"oneOf.0.observed_location.oneOf.0.observation_readings.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.observed_location.oneOf.0.observation_readings","typeLabel":"array | null"},"user_countries":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"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":"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":"oneOf.0.observed_location.oneOf.0.user_countries.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"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":"oneOf.0.observed_location.oneOf.0.user_country_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"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":"oneOf.0.observed_location.oneOf.0.netflow_protocol.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"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":"oneOf.0.observed_location.oneOf.1","typeLabel":"null"}],"uniqueKey":"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":"oneOf.0.vpn_exit_confidence","typeLabel":"number"}},"uniqueKey":"oneOf.0","typeLabel":"IpLookupResponse · object"},{"type":"object","title":"IpAsOfResponse","description":"The answer to a lookup with as_of: our verdict for the IP on that past day. Business and Enterprise only. It is rebuilt from that day's archived data under today's data-handling and attribution rules, so it is not a copy of what a lookup returned that day. Fields that describe the present are not included: asn, asn_org, infra_type, risk_score, reasons, source, metadata and the enrichment objects.","required":["ip","as_of","network","classification","provider","confidence","first_seen","last_seen","observation_count","hits_days_pct","providers_num","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","netblock","netname","netblock_org","archive"],"properties":{"ip":{"type":"string","description":"The IP address you looked up, in canonical form.","isRequired":true,"uniqueKey":"oneOf.1.ip","typeLabel":"string"},"as_of":{"type":"string","description":"The UTC day this answer is for, as you sent it.","isRequired":true,"uniqueKey":"oneOf.1.as_of","typeLabel":"string"},"network":{"oneOf":[{"type":"string","description":"The classified network, in CIDR notation, that contained the IP that day. From 2026-09-08 the archive cuts networks at registered-block boundaries, so this can be narrower than the network a lookup returned that day; the label, provider and confidence are the same. Null when nothing matched, or when the label comes from our sightings of this address as a residential proxy exit.","isRequired":true,"uniqueKey":"oneOf.1.network.oneOf.0","typeLabel":"string"},{"type":"null","description":"The classified network, in CIDR notation, that contained the IP that day. From 2026-09-08 the archive cuts networks at registered-block boundaries, so this can be narrower than the network a lookup returned that day; the label, provider and confidence are the same. Null when nothing matched, or when the label comes from our sightings of this address as a residential proxy exit.","isRequired":true,"uniqueKey":"oneOf.1.network.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.network","typeLabel":"string | null"},"classification":{"type":"string","description":"The winning label for the IP that day, chosen by today's rules from that day's data. unknown means we held no label for the IP that day. Unlike a current lookup, it is never inferred from the ASN alone, and the ASN abuse relabelling of hosting addresses does not apply.","isRequired":true,"uniqueKey":"oneOf.1.classification","typeLabel":"string"},"provider":{"oneOf":[{"type":"string","description":"The named operator behind that day's label, where today's attribution rules name one, or null.","isRequired":true,"uniqueKey":"oneOf.1.provider.oneOf.0","typeLabel":"string"},{"type":"null","description":"The named operator behind that day's label, where today's attribution rules name one, or null.","isRequired":true,"uniqueKey":"oneOf.1.provider.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.provider","typeLabel":"string | null"},"confidence":{"oneOf":[{"type":"number","description":"How sure we were of that day's classification, from 0 to 1. 0 when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.confidence.oneOf.0","typeLabel":"number"},{"type":"null","description":"How sure we were of that day's classification, from 0 to 1. 0 when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.confidence.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.confidence","typeLabel":"number | null"},"first_seen":{"oneOf":[{"type":"string","description":"When the winning label was first recorded for the IP or its range, as of that day, in ISO 8601. Null when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.first_seen.oneOf.0","typeLabel":"string"},{"type":"null","description":"When the winning label was first recorded for the IP or its range, as of that day, in ISO 8601. Null when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.first_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.first_seen","typeLabel":"string | null"},"last_seen":{"oneOf":[{"type":"string","description":"When the winning label was last confirmed for the IP or its range, as of that day, in ISO 8601. Null when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.last_seen.oneOf.0","typeLabel":"string"},{"type":"null","description":"When the winning label was last confirmed for the IP or its range, as of that day, in ISO 8601. Null when the classification is unknown.","isRequired":true,"uniqueKey":"oneOf.1.last_seen.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.last_seen","typeLabel":"string | null"},"observation_count":{"oneOf":[{"type":"integer","description":"How many times we had observed this exact address as a residential proxy exit, as of that day. 0 unless the label comes from our sightings of the address itself (network is then null).","isRequired":true,"uniqueKey":"oneOf.1.observation_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"How many times we had observed this exact address as a residential proxy exit, as of that day. 0 unless the label comes from our sightings of the address itself (network is then null).","isRequired":true,"uniqueKey":"oneOf.1.observation_count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.observation_count","typeLabel":"integer | null"},"hits_days_pct":{"oneOf":[{"type":"number","description":"Percentage of the 90 days before that day 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.","isRequired":true,"uniqueKey":"oneOf.1.hits_days_pct.oneOf.0","typeLabel":"number"},{"type":"null","description":"Percentage of the 90 days before that day 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.","isRequired":true,"uniqueKey":"oneOf.1.hits_days_pct.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.hits_days_pct","typeLabel":"number | null"},"providers_num":{"oneOf":[{"type":"integer","description":"How many distinct residential proxy networks the address had been seen on, as of that day, counted under today's attribution rules. 0 unless the label comes from our sightings of the address itself.","isRequired":true,"uniqueKey":"oneOf.1.providers_num.oneOf.0","typeLabel":"integer"},{"type":"null","description":"How many distinct residential proxy networks the address had been seen on, as of that day, counted under today's attribution rules. 0 unless the label comes from our sightings of the address itself.","isRequired":true,"uniqueKey":"oneOf.1.providers_num.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.providers_num","typeLabel":"integer | null"},"freshness_class":{"oneOf":[{"type":"string","description":"The age of last_seen on that day, 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).","isRequired":true,"uniqueKey":"oneOf.1.freshness_class.oneOf.0","typeLabel":"string"},{"type":"null","description":"The age of last_seen on that day, 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).","isRequired":true,"uniqueKey":"oneOf.1.freshness_class.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.freshness_class","typeLabel":"string | null"},"is_vpn":{"type":"boolean","description":"True for a confirmed VPN label that day: vpn, commercial_vpn, corporate_vpn, vpn_hosting or the retired vpn_concentrator.","isRequired":true,"uniqueKey":"oneOf.1.is_vpn","typeLabel":"boolean"},"is_proxy":{"type":"boolean","description":"True when that day's classification is proxy, datacenter_proxy, mobile_proxy or suspected_proxy.","isRequired":true,"uniqueKey":"oneOf.1.is_proxy","typeLabel":"boolean"},"is_tor":{"type":"boolean","description":"True when that day's classification is tor.","isRequired":true,"uniqueKey":"oneOf.1.is_tor","typeLabel":"boolean"},"is_relay":{"type":"boolean","description":"True when that day's classification is relay, a privacy relay such as iCloud Private Relay.","isRequired":true,"uniqueKey":"oneOf.1.is_relay","typeLabel":"boolean"},"is_hosting":{"type":"boolean","description":"True when that day's classification is hosting.","isRequired":true,"uniqueKey":"oneOf.1.is_hosting","typeLabel":"boolean"},"is_cdn":{"type":"boolean","description":"True when that day's classification is cdn.","isRequired":true,"uniqueKey":"oneOf.1.is_cdn","typeLabel":"boolean"},"is_residential_proxy":{"type":"boolean","description":"True for any residential proxy label that day: residential_proxy, residential_proxy_gateway, residential_proxy_likely or residential_proxy_mobile.","isRequired":true,"uniqueKey":"oneOf.1.is_residential_proxy","typeLabel":"boolean"},"is_residential_proxy_high_confidence":{"type":"boolean","description":"True when that day's classification is residential_proxy itself, not its gateway, likely or mobile variant.","isRequired":true,"uniqueKey":"oneOf.1.is_residential_proxy_high_confidence","typeLabel":"boolean"},"is_residential_proxy_mobile":{"type":"boolean","description":"True when that day's classification is residential_proxy_mobile.","isRequired":true,"uniqueKey":"oneOf.1.is_residential_proxy_mobile","typeLabel":"boolean"},"is_open_proxy":{"type":"boolean","description":"True when that day's winning label comes from a public open proxy list. archive.errata says when a day's data is known to under-report it.","isRequired":true,"uniqueKey":"oneOf.1.is_open_proxy","typeLabel":"boolean"},"is_corporate_vpn":{"type":"boolean","description":"True when that day's classification is corporate_vpn, a company VPN appliance. is_vpn is true as well.","isRequired":true,"uniqueKey":"oneOf.1.is_corporate_vpn","typeLabel":"boolean"},"netblock":{"oneOf":[{"type":"string","description":"The most specific registered network block that contained the IP, as recorded that day, as its first and last address joined by a hyphen. Null when no registered block was known.","isRequired":true,"uniqueKey":"oneOf.1.netblock.oneOf.0","typeLabel":"string"},{"type":"null","description":"The most specific registered network block that contained the IP, as recorded that day, as its first and last address joined by a hyphen. Null when no registered block was known.","isRequired":true,"uniqueKey":"oneOf.1.netblock.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.netblock","typeLabel":"string | null"},"netname":{"oneOf":[{"type":"string","description":"The registry's name for that block, as recorded that day.","isRequired":true,"uniqueKey":"oneOf.1.netname.oneOf.0","typeLabel":"string"},{"type":"null","description":"The registry's name for that block, as recorded that day.","isRequired":true,"uniqueKey":"oneOf.1.netname.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.netname","typeLabel":"string | null"},"netblock_org":{"oneOf":[{"type":"string","description":"The organization the registry listed as holding that block, as recorded that day.","isRequired":true,"uniqueKey":"oneOf.1.netblock_org.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization the registry listed as holding that block, as recorded that day.","isRequired":true,"uniqueKey":"oneOf.1.netblock_org.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.netblock_org","typeLabel":"string | null"},"archive":{"type":"object","description":"What the archive holds, so you can tell a missing day from a missing label.","properties":{"first_day":{"type":"string","description":"The first day the archive can answer for (YYYY-MM-DD).","isRequired":true,"uniqueKey":"oneOf.1.archive.first_day","typeLabel":"string"},"last_day":{"type":"string","description":"The most recent day it can answer for. A day is added each day.","isRequired":true,"uniqueKey":"oneOf.1.archive.last_day","typeLabel":"string"},"data_as_of":{"type":"string","description":"The time of the most recent observation in that day's data, in ISO 8601. freshness_class is measured from it.","isRequired":true,"uniqueKey":"oneOf.1.archive.data_as_of","typeLabel":"string"},"errata":{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.archive.errata.items.[INDEX]","typeLabel":"string"},"description":"Known problems with that day's data, in plain words. Empty on most days.","isRequired":true,"uniqueKey":"oneOf.1.archive.errata","typeLabel":"string[]"}},"required":["first_day","last_day","data_as_of","errata"],"isRequired":true,"uniqueKey":"oneOf.1.archive","typeLabel":"object"}},"uniqueKey":"oneOf.1","typeLabel":"IpAsOfResponse · object"}],"uniqueKey":"","typeLabel":"IpLookupResponse · object | IpAsOfResponse · object"},"examples":{"Example":{"title":"Example","value":{"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}}},"exampleType":"generated"}},"exampleType":"generated"},"44694957-ff87-43da-9cae-4b68ffd23247":{"description":"missing_ip_address, invalid_ip_format, invalid_ip_integer_form, invalid_ip_reserved or unsupported_output_format","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"a4825496-ad74-48fb-9983-9b6bfd2c1e37":{"description":"Missing API key","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"472463d7-71f1-4507-be29-96848e96c91e":{"description":"Invalid API key, inactive subscription, or insufficient credits","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"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":"Look up a single IP - VPN \u0026 Proxy Detection API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T17:33:13.712Z","originalFileLocation":"api-reference/lookup-ip.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 one IP address.\">\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=\"Look up a single IP - VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Classify one IP address.\">\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-ip\">\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=Look+up+a+single+IP\u0026amp;description=Classify+one+IP+address.\u0026amp;theme=2d814d5bab6035f0e6472a06\u0026amp;signature=9ea01f4fcdd30a6a370164aa3c6cd24fd475c13ca073360c86742c3980e8586d\">\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=\"Look up a single IP - VPN \u0026amp; Proxy Detection API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Classify one IP address.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://whoisapi.mintlify.app/_mintlify/api/og/v2?division=Lookup\u0026amp;title=Look+up+a+single+IP\u0026amp;description=Classify+one+IP+address.\u0026amp;theme=2d814d5bab6035f0e6472a06\u0026amp;signature=9ea01f4fcdd30a6a370164aa3c6cd24fd475c13ca073360c86742c3980e8586d\">\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-ip\">\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-ip.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-ip#webpage\",\"url\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip\",\"name\":\"Look up a single IP\",\"description\":\"Classify one IP address.\",\"dateModified\":\"2026-10-19T17:33:13.712Z\",\"isPartOf\":{\"@id\":\"https://vpn-docs.wxapros.com#website\"},\"breadcrumb\":{\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"VPN \u0026 Proxy Detection API\",\"item\":\"https://vpn-docs.wxapros.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Look up a single IP\",\"item\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip#apireference\",\"headline\":\"Look up a single IP\",\"name\":\"Look up a single IP\",\"description\":\"Classify one IP address.\",\"url\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip\",\"mainEntityOfPage\":{\"@id\":\"https://vpn-docs.wxapros.com/api-reference/lookup-ip#webpage\"},\"dateModified\":\"2026-10-19T17:33:13.712Z\",\"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","description":"Changes to the API and these docs that affect what you send or get back, newest first.","href":"/changelog"}]},{"group":"Lookup","pages":[{"title":"Look up a single IP","openapi":"GET /api/v1","href":"/api-reference/lookup-ip"},{"title":"Batch IP lookup","description":"Classify up to 100 IPs in one request.","openapi":"POST /api/v1/ip/batch","href":"/api-reference/lookup-batch"},{"title":"Shadow VPN lookup","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":"Look up a single IP - 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"]}