Skip to content
IPOK

Methodology

Updated 2026-10-21 · ipok.io

IPOK's risk score (0–100, higher means stronger adverse IP-level evidence observed by this site) blends numeric scores from several sources and applies in-house direct-signal and contextual floors. This page documents the complete IPOK aggregation, floor, and band logic; third-party sources still control their own internal algorithms.

Geolocation starts with ip-api; if unavailable, it falls back to IPinfo Lite, then ipapi.is. IPinfo Lite supplies country and ASN information only: it does not produce a risk verdict or enter scoring or consensus votes. City, coordinates and other detailed fields may be absent.

1. Weighted average of sources

Every source that returns a numeric risk score is blended by the weights below. Dormant, failed, or non-numeric sources are excluded from the average. The internal aggregate uses a base of 10 when no numeric score is returned, then takes the maximum of that base and triggered floors, rounded and clamped to 0–100. This internal value is not automatically a displayable conclusion. Missing current evidence, or stale / undated risk contributions in the aggregate, show “Insufficient evidence” with no total score. Historical observations remain visible without implying current safety or a current hit.

SourceWeightNotes
Scamalytics0.90Pro fraud score; proxy/VPN/datacenter coverage
IPQS0.70Fraud score (API key; currently dormant)
proxycheck0.85Proxy / VPN detection (subject to shared-cache freshness)
AbuseIPDB0.80Community abuse reports + whitelist flag
IPOK-DB0.80Six reputation/relay tables: Tor, X4BNet VPN, DROP, OpenProxyDB Wikipedia block labels, IPsum and Apple relay. Seven additional cloud feeds provide ownership context only. Current flags require fresh data covering the queried address family
ipapi.is0.70Calibrated abuse score + network intel
IPHub0.70Dedicated proxy / VPN / Tor / datacenter detection; we read its explicit verdicts only, not the broad block value
vpnapi.io0.70Explicit VPN / proxy / Tor verdicts; relay (iCloud Private Relay) kept separate, never counted as a proxy
StopForumSpam0.65Forum / signup spam DB (free, complements AbuseIPDB)
ip-api0.50Boolean inference only; lowest weight

Artifact built 2026-10-23. Per-source successful fetch dates and address-family coverage are shown below; a build date does not refresh a failed source.

Bundled coverage and fetch dates

InputIPv4IPv6
Tor exit listFresh · 543 ranges · fetched 2026-10-23Not supported by this source
X4BNet/lists_vpnFresh · 6690 ranges · fetched 2026-10-23Not supported by this source
Spamhaus DROPFresh · 1446 ranges · fetched 2026-10-23 · expires 2026-10-24 13:44 UTCNot supported by this source
OpenProxyDBFresh · 8222 ranges · fetched 2026-10-23Not supported by this source
IPsum (level 3)Fresh · 13136 ranges · fetched 2026-10-23Not supported by this source
iCloud Private Relay egress rangesFresh · 1011 ranges · fetched 2026-10-23Fresh · 5903 ranges · fetched 2026-10-23
AWS ip-rangesFresh · 938 ranges · fetched 2026-10-23Fresh · 2149 ranges · fetched 2026-10-23
Google Cloud IP rangesFresh · 170 ranges · fetched 2026-10-23Fresh · 17 ranges · fetched 2026-10-23
Cloudflare proxy IP rangesFresh · 14 ranges · fetched 2026-10-23Fresh · 7 ranges · fetched 2026-10-23
Oracle Cloud public IP rangesFresh · 478 ranges · fetched 2026-10-21Not supported by this source
Azure Service Tags (AzureCloud)Fresh · 500 ranges · fetched 2026-10-23Not supported by this source
DigitalOcean geofeedFresh · 102 ranges · fetched 2026-10-23Fresh · 39 ranges · fetched 2026-10-23
Akamai/Linode geofeedFresh · 95 ranges · fetched 2026-10-23Fresh · 22 ranges · fetched 2026-10-23

IPv6 parsing is available for Apple relay, AWS, Google Cloud, Cloudflare, DigitalOcean and Linode feeds only when their IPv6 data was ingested successfully. Tor, the current VPN/DROP/proxy/IPsum endpoints, OCI and AzureCloud do not provide IPv6 coverage here. A missing or stale family is not a clean result.

Cloudflare range membership identifies a published network range associated with its Anycast network. It does not prove a specific proxy product, WARP egress, or a physical location. WARP firewall documentation lists ingress ranges, not an egress-address feed.

2. Hard-signal floors

Once a signal is hit, the final score cannot fall below its floor, no matter how low the weighted average is (final = max of weighted average and all triggered floors). This stops a datacenter IP from being mislabeled "low observed risk" just because most sources score it low.

SignalFloorNotes
Tor exit node90Strong IP-level anonymity signal; many services commonly restrict Tor, but IPOK does not predict a specific platform outcome
On spam / abuse blocklist70Any hit among DNSBL checks actually completed in this lookup is direct IP-level evidence
Confirmed proxy / VPN65Hosting IPs need ≥2 usable non-ip-api proxy/VPN votes; non-hosting IPs need ≥2; a known anonymizer ASN also qualifies
Recent abuse history55Reports / abuse score above threshold
Flagged /24 ≥25%40Contextual floor only for non-blanket /24 flags; applies from 25% up to, but not including, 50%
Flagged /24 ≥50%50Contextual floor only for non-blanket /24 flags; applies at 50% or above
Datacenter / hosting35Hosting is a use case, not fraud — floor kept low

Three boundary rules apply: any explicit trusted-allowlist signal suppresses only the hosting contextual floor; when the same source marks both allowlisted and abusive, that source's contradictory abuse vote is ignored without overriding independent abuse evidence from other sources; and a /24 filled by one broad-CIDR blanket receives no extra neighborhood floor, avoiding duplicate use of the same block-level evidence. Other direct signals still apply. One more rule covers relays: when an IP falls in Apple's published iCloud Private Relay egress ranges, we stop applying the hosting floor and our own offline database stops casting a VPN vote (those ranges are 100% covered by third-party VPN lists, so without this every Private Relay user would be counted as a VPN exit). **If external sources still call it a proxy or VPN, the 65 floor stands** — the score retains those IP-level proxy labels without predicting whether a particular platform will accept the exit. Our answer is to label it clearly as iCloud Private Relay, not to overrule those vendors.

Vote thresholds are recalibrated weekly

How many votes the "confirmed proxy / VPN" floor requires is not a fixed constant: it is recomputed every week from this site's own public anonymous vote aggregate. We take the samples where proxycheck alone reported a proxy and check whether IPHub and vpnapi.io — two different vendors whose underlying data may overlap — reported the same. Our own final verdict is deliberately not used as the yardstick: on residential IPs that single vote is what produced the verdict, so calibrating against it would be circular. A confirmation rate of 70% or higher keeps the single-vote rule, below 40% tightens it to two votes, and anything in between leaves the current value untouched (the residential case also waits on the neighborhood human-presence rule). Three guardrails are hard-coded: the threshold may only be 1–2 votes for residential and 2–3 for datacenter; nothing moves while confirmations plus refutations stay under 500; and no run may move a threshold by more than one step. Every change is published here and at /api/data/calibration, so these parameters cannot drift quietly.

Residential 2 vote(s) · datacenter 2 · calibrated 2026-10-12 · 155,491 observations in a 30-day window · last change: residential 1 → 2

For four real addresses worked through weights, floors and bands, see IP fraud score, explained.

Evidence tiers (labelled, not scored)

The weight table above puts every source on one scale, but the evidence behind them does not come from the same kind of place: some lists are published by the operator of a network about its own exits, some contain third-party reports or block-list labels, and some are painted across a provider's entire ASN. We sort every source — and every table inside our own offline database — into the three tiers below, and label each row of the source table on /data/sources with its tier.

  • First-partyFirst-party self-declaration: a list of egress addresses published by the party that actually operates the network or service. For the question “does this address belong to them”, nobody is closer to the fact.
  • ReportedReported: third-party observations, community reports, block-list labels or explicit vendor verdicts. These may concern one IP or a whole range. They do not mean IPOK tested connectivity live, and do not establish independence between sources or current accuracy.
  • InferredInferred: derived from the block, the ASN, or the usage class the address sits in — VPN tables painted across an entire provider, “non-residential” hosting / datacenter classifications, proxy booleans synthesized out of other fields. The block-level statement may well be true while the statement about this one address is not.
SourceTierWhy
ip-apiInferredlib/sources/ipapi.ts reads only the data.proxy / data.hosting / data.mobile booleans, with no probe behind them. Measured over 15 days of live lookups: of the 1,704 lookups flagged by ip-api alone, 8.5% ended up suspicious against a 7.9% baseline — a 1.1x lift, statistically close to no information. Our consensus rule already refuses to count it as a dedicated vote.
IPQSInferredMarked inferred because we have no evidence, not because the vendor is judged weak. IPQS is listed in DORMANT_SOURCES: no API key, zero calls, so the explicit d.proxy / d.vpn / d.tor / d.recent_abuse booleans in lib/sources/ipqs.ts have never produced a single real response here. The field shape matches the measured tier, but we do not hand out a higher tier on an unverified basis. To be re-rated once a key is configured and real responses can be inspected.
ScamalyticsReportedlib/sources/scamalytics.ts reads scamalytics_score and scamalytics_proxy.is_vpn — the vendor's explicit VPN verdict and fraud score. The code notes that v3 has no is_proxy / is_tor at all, and deliberately refuses to synthesize a proxy flag out of is_datacenter. The is_datacenter field in the same response is a usage classification and is listed separately as inferred.
proxycheckReportedlib/sources/proxycheck.ts reads entry.proxy === "yes" plus entry.type (VPN / Tor / Compromised Server …) — the vendor's explicit proxy verdict, not something derived from other fields. Note that the tier describes provenance, not accuracy: in the same review this source flagged datacenter IPs on its own 8,370 times and 84% of those were overruled for lack of a second vote. Its 0.85 weight was left unchanged.
AbuseIPDBReportedIn lib/sources/abuseipdb.ts the abuser flag requires abuseConfidenceScore >= 25 and either 3+ total reports or 2+ distinct reporters — abuse reports filed by real operators, with a threshold that drops one-person grudge reports. The hosting flag derived from the usageType string, and the vendor-maintained isWhitelisted flag, are rated separately.
ipapi.isReportedlib/sources/ipapiis.ts reads is_tor and the calibrated abuser_score only (mapped through the Very Low…Very High label in parentheses; the abuser flag needs >= 55), and the code explicitly refuses to read is_vpn / is_proxy — they are noisy and once marked 8.8.8.8 as a VPN. The is_datacenter field from the same source is a block-level usage classification and is rated inferred.
StopForumSpamReportedIn lib/sources/stopforumspam.ts the abuser flag requires appears === 1 and frequency >= 3 — signup-spam reports filed one by one by forum operators, behind the same 3-report threshold we apply to AbuseIPDB rather than a single stray hit.
IPOK-DBReportedlib/lookup.ts folds six reputation/relay tables into one IPOK-DB SourceResult; seven cloud range feeds provide ownership context. They are not thirteen independent risk sources. Tor and relay are first-party lists; OpenProxyDB carries Wikipedia block labels; IPsum aggregates lists; DROP concerns ranges; X4BNet is range-based inference. Each result also depends on address-family coverage and freshness. The reported tier is not a claim of live verification.
IPHubReportedlib/sources/iphub.ts writes only the explicit proxyType.proxy / .tor / .hosting / .relay verdicts into flags, and the code states plainly that the broad block value is not treated as a proxy vote (8.8.8.8 itself is block=1, blockReason "Hosting, proxy or bad IP"). Note that block is not entirely unused: iphubRisk() still maps it to a risk number (block===2 → 45, block===1 → 35), and that part is inferred.
vpnapi.ioReportedlib/sources/vpnapi.ts reads the three explicit booleans security.vpn / .proxy / .tor into flags; security.relay is kept separate and never counted as a proxy vote. It returns no hosting / datacenter verdict, so it takes no part in the datacenter bucketing — no block-level inference enters through this source.

The six reputation/relay tables in IPOK-DB

The offline artifact contains six reputation/relay tables and seven cloud-provider range feeds: 13 inputs, not thirteen independent risk sources. Cloud feeds provide network-ownership context only; overlapping lists do not establish independent observations.

TableTierWhy
torFirst-partyFEEDS.tor uses the Tor Project torbulkexitlist for IPv4 exit records. Onionoo IPv6 or_addresses are relay listener addresses, not an IPv6 egress list. A current Tor flag requires supported, fresh data.
relayFirst-partyFEEDS.relay uses Apple’s egress-ip-ranges.csv. A fresh match identifies a published Private Relay egress range and overrides only this library’s VPN/cloud classification. It does not erase other providers’ evidence or prove a user benign. IPv6 is available only when the bundled artifact actually includes dated data.
proxyReportedOpenProxyDB extracts proxy-related labels from Wikipedia local and global block lists. scripts/iplists-core.mjs retains only single IPv4 rows with proxy=true and no cdn/webhost/rangeblock flag. Excluding broad ranges is not live verification of proxy connectivity; these remain third-party block labels.
ipsumReportedFEEDS.ipsum reads levels/3.txt: an IP appears in at least three upstream lists. Independence of those lists is not established; they may reuse upstream data. A match does not prove the host is currently attacking. It remains one aggregated source record.
abuseReportedFEEDS.abuse uses Spamhaus DROP records for hijacked ranges or ranges associated with professional spam/cybercrime operations. The record concerns a network range, not a live test of this connection. Stale matches are historical context and do not set current flags.
vpnInferredFEEDS.vpn uses X4BNet output/vpn/ipv4.txt, a range-level list based on known VPN networks and provider information. It does not verify each IP connection and is distinct from the repository’s legacy datacenter-wide ipv4.txt. Fresh Apple relay membership overrides this library’s VPN label.

Tiers are labelling and disclosure only. Weights, hard-signal floors and vote thresholds are not adjusted by tier, and the verdicts are byte-identical with and without this whole section. Whether one first-party statement should outweigh three inferred ones needs readings from the calibration loop described above; until those exist, tuning weights by tier would mean setting the tiers and the weights from the same data with no ground truth in it.

3. Spam / abuse blocklists (DNSBL)

IPOK plans five mail / abuse blocklist queries over Cloudflare DoH: SpamCop, UCEPROTECT, Barracuda, S5H, and Anonmails; the result reports how many actually completed. Partial failures are warned, and an all-failed run produces no blocklist verdict—neither is treated as clean. Any hit among completed checks triggers the blocklist floor. IPv4 only.

4. Risk bands

BandRangeMeaning
Insufficient evidence—No total score; review observation times and missing sources. Unknown is not safe
Low observed risk< 15Very weak adverse IP-level evidence in this lookup
Lower observed risk15 – < 50Weak adverse IP-level evidence in this lookup
Caution50 – < 70Moderate or strong adverse IP-level evidence in this lookup
High risk≥ 70Very strong adverse IP-level evidence in this lookup

5. Registration and geolocation consistency

RIR/RDAP describes registration; geolocation databases estimate location. Matching country fields do not prove a native, residential or unforwarded connection, and a mismatch alone does not prove broadcast routing or proxy use. Anycast can announce one address in multiple places, so a coordinate cannot establish a physical exit. Missing information remains unknown and does not predict platform access.

AbuseIPDB Contributor BadgeIPOK is a verified AbuseIPDB webmaster; the badge shows this account's own report count — IPOK only queries and never reports visitor IPs.
Disclaimer:The score summarizes only IP-level data available to IPOK. It does not test account state, device fingerprint, payment details, user behavior, or internal platform policy, and cannot promise signup, login, payment, or content-access outcomes. For network diagnostics and research reference only.