๐ŸŽ‰ Premium Proxies ยท 24-Hour Free TrialClaim Now
Guides

How to Check Proxy IP Fraud Score and Geo Accuracy

Test the pool before you buy. Check a proxy IP fraud score across scoring vendors, verify geolocation on three layers, and set honest pass or fail thresholds.

S SparkProxy 2 18 min read
Share
How to Check Proxy IP Fraud Score and Geo Accuracy

Every proxy vendor claims clean IPs in the country you want. A proxy IP fraud score from a third-party checker looks like the objective way to test that claim, and it mostly isn't: it is one vendor's opinion, on one vendor's scale, and every datacenter IP on earth fails it by design. This guide gives you a buying test that actually resolves the question, covering how to sample a pool, how to verify geolocation on the three layers that exist, how to read risk scores without fooling yourself, and where the pass or fail line sits for each use case.

Start Here: The Three Questions That Decide the Purchase

You are comparing providers on a trial and you have limited hours. Ask three questions, in this order:

QuestionHow you answer itDeal breaker if
Does the exit resolve to the country I paid for, in the database my target uses?Compare RDAP registration, two commercial GeoIP databases, and the target's own country signalThe target's view disagrees on a meaningful share of the sample
Is the risk score inside the band my use case tolerates?Pull two or three scoring vendors across the whole sample and look at the distributionThe band is worse than the class of proxy you thought you were buying
Does the sample pass on my real target URLs?Run a block-rate harness against the exact pages you scrapeSuccess rate is materially worse than your incumbent pool measured in the same hour

Only the third question is a purchase decision. The first two are diagnostics that tell you why the third came out the way it did, and which of the two fixable problems you have: a geo problem, which a competent network operator can correct, or a reputation problem, which usually means you bought the wrong proxy class.

Run them in that order and a trial takes an afternoon. Skip straight to question three and you get a number with no explanation, which is useless the moment you want to negotiate or escalate.


What a Proxy IP Fraud Score Actually Measures

A fraud score is not a property of an IP address. It is a classifier output, produced by a specific company, from signals that company happens to collect. Common inputs are the ASN class the address sits under, whether the range appears in public abuse feeds, open ports and known proxy ports, historical association with chargebacks or fake signups, and the velocity of distinct accounts seen behind the address.

Different vendors publish different fields on different scales:

VendorField and scaleWhat it mostly reacts toFree access
IPQualityScore`fraud_score` 0 to 100, plus proxy and vpn booleansProxy and VPN classification, abuse historyLimited free tier
ScamalyticsRisk score 0 to 100 with named bandsHosting ASN, abuse reportsWeb lookup
IP2Location IP2Proxy`proxy_type` codes such as DCH, VPN, PUB, TOR, RESRegistry plus infrastructure classificationLITE database, attribution required
AbuseIPDB`abuseConfidenceScore` 0 to 100, `totalReports`Crowd-submitted abuse reports onlyFree API key
ipinfo.io Privacy DetectionBooleans for hosting, proxy, vpn, tor, relayASN and infrastructure classificationPaid add-on
SpurAnonymizing-infrastructure classificationObserved proxy and VPN trafficPaid

Field names, scales and band definitions above are taken from each vendor's own published documentation as of September 2026. Vendors revise thresholds without much announcement, so read their current docs before you hard-code a cutoff.

Here is the part most buying guides skip. A datacenter IP will be flagged as hosting infrastructure by every one of these vendors, and that flag is correct. The address is registered to a hosting ASN, and no amount of vendor quality changes the classification. If your requirement is a clean "not a proxy" verdict, you are not shopping for datacenter proxies at all, and the honest comparison is residential versus datacenter proxies rather than one datacenter vendor against another.

What genuinely varies between datacenter providers, and what your test should isolate, is narrower: abuse history on the specific ranges, the behaviour of neighbouring addresses in the same /24, and whether the range appears on the public cloud-provider lists that many sites block wholesale. Those lists matter on their own, since a range that lands on one is blocked before any scoring vendor is consulted. See what cloud provider IP ranges are, with the wider background in what IP reputation is and why it matters.


Free trial

Scraping at scale? Skip the blocks.

Fast, unblockable datacentre proxies with unlimited bandwidth.

The Three Layers of Proxy Geolocation

"The IP is German" can mean three different things, and they routinely disagree:

LayerSource of truthHow to query itWho consumes it
RegistrationRIR records at ARIN, RIPE NCC, APNIC, LACNIC, AFRINICRDAP, for example `https://rdap.org/ip/`Compliance checks, some fraud vendors
Commercial databaseMaxMind GeoIP2, IP2Location, DB-IP, ipinfoVendor API or a local database fileMost websites and CDNs
The target's own viewThe site you are scrapingSend a request through the proxy and read the country signal it returnsYour actual outcome

Layer three is the only one that pays. Layers one and two exist to explain layer three.

The mechanism connecting them is the piece almost no proxy comparison mentions: RFC 8805 geofeeds. A network operator publishes a CSV listing its prefixes with their intended country, region and city, then advertises that file from a geofeed: attribute in its RIR whois record, the practice described in RFC 9092. Database vendors ingest those feeds on their own refresh cycles. That is how a provider corrects its own geolocation, and it is why corrections take days to weeks rather than minutes.

Turn that into a buying question. Ask a prospective provider two things: are the ranges I am buying covered by a published geofeed, and how long does a geo correction take to reach MaxMind and IP2Location? A provider that runs its own address space can answer both. A provider reselling someone else's allocations can answer neither, which means it cannot fix a geo problem you report, only swap you onto different addresses and hope. For the underlying model of how addresses get allocated and announced, BGP and RIR IP allocations covers it, and what geo-targeting means in proxies covers the product side.


Build a Test Sample Worth Trusting

Sample size determines what your test can even see. With 50 addresses, a single failure reads as 2 percent, so you cannot distinguish a 1 percent bad rate from a 3 percent one. Decide up front what failure rate would change your decision, then sample enough to detect it.

A practical rule for a trial: gather 50 to 100 distinct exits per country you actually care about, and never fewer than the thread count you plan to run. Testing 20 addresses before buying a 500-thread plan tells you almost nothing about the pool you will be using.

Collect the sample by rotating through the gateway and recording what comes back:

import collections
import requests

GATEWAY = "http://USER:PASS@gateway.sparkproxy.io:11000"
PROXIES = {"http": GATEWAY, "https": GATEWAY}

seen = collections.Counter()
for _ in range(400):
    try:
        ip = requests.get("https://api.ipify.org", proxies=PROXIES, timeout=15).text.strip()
        seen[ip] += 1
    except requests.RequestException:
        continue

print(len(seen), "distinct exits from 400 calls")
sample = list(seen)

Port 11000 rotates per request. If a check needs several requests to land on the same exit, use the sticky-session port 11002 instead, or 13000 for SOCKS5. Two things to watch while collecting. A pool that returns the same dozen addresses across 400 calls is far smaller than advertised for your country. A pool that returns a fresh address on every single call gives you no way to re-test the same IP a week later, so record the addresses, not just the count.


Test Geolocation Across All Three Layers

Start with registration, which is free and needs no key:

import requests

def rdap_country(ip: str) -> str:
    r = requests.get(f"https://rdap.org/ip/{ip}", timeout=15)
    r.raise_for_status()
    return r.json().get("country", "?")

Then the commercial databases. Query at least two, because agreement between two independent vendors is the signal, not the value from either one alone. MaxMind's GeoLite2 files have required a free account and a license key since December 2019, and IP2Location's LITE databases are free with attribution, so both are testable at zero cost:

import geoip2.database
import IP2Location

mm = geoip2.database.Reader("GeoLite2-Country.mmdb")
i2l = IP2Location.IP2Location("IP2LOCATION-LITE-DB1.BIN")

def db_countries(ip: str) -> dict:
    return {
        "maxmind": mm.country(ip).country.iso_code,
        "ip2location": i2l.get_country_short(ip),
    }

Now the layer that decides everything. Send a request through the proxy to the real target and read whatever country signal it exposes. Sites behind Cloudflare often return a CF-IPCountry header when the operator enables it. Retail sites usually redirect to a country path or switch currency. Search engines change result composition.

def target_country(url: str, proxy: str) -> str:
    r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30,
                     allow_redirects=False)
    if "cf-ipcountry" in r.headers:
        return r.headers["cf-ipcountry"]
    loc = r.headers.get("location", "")
    return loc.split("/")[3].upper() if loc.count("/") > 3 else "?"

Put the three results side by side and read the pattern:

RDAPGeoIP databasesTarget's viewWhat it means
DEDE and DEDEClean. Nothing further to check on geo.
DEDE and DEUSThe target uses a database you did not test, or its own override. Ask for the geofeed and re-check after the next refresh.
USDE and DEDERegistration lags a geofeed correction. Cosmetic for scraping, a real problem for compliance-sensitive work.
DEDE and USMixedGenuine database disagreement. Expect intermittent geo failures on any site licensing the dissenting vendor.
NLNL and NLNL, but 403Geolocation is fine. The problem is reputation, so move to the next section.

That last row is the most common outcome of a failed trial and the most commonly misdiagnosed. People see blocks while targeting a country and conclude the geo is wrong. It usually isn't.


Read Fraud Scores Without Fooling Yourself

Pull scores for the whole sample, not for the three addresses you happened to copy out of a terminal. AbuseIPDB is a reasonable first vendor because the key is free and the field means one specific thing, namely how many people reported this address:

import os
import requests

def abuse_score(ip: str):
    r = requests.get(
        "https://api.abuseipdb.com/api/v2/check",
        headers={"Key": os.environ["ABUSEIPDB_KEY"], "Accept": "application/json"},
        params={"ipAddress": ip, "maxAgeInDays": 90},
        timeout=15,
    )
    d = r.json()["data"]
    return d["abuseConfidenceScore"], d["totalReports"]

Then report a distribution, never an average. A mean of 4 across 60 addresses hides one address sitting at 100, and that address will be the one your scheduler hands the important job to:

import statistics

scores = sorted(abuse_score(ip)[0] for ip in sample)
print("median", statistics.median(scores))
print("p90   ", scores[int(len(scores) * 0.9)])
print("dirty ", sum(1 for s in scores if s > 25), "/", len(scores))

Three habits separate a useful score pull from a decorative one.

  • Check the /24, not only the address. Several scoring vendors and plenty of site operators treat a whole /24 as one entity. If two sampled addresses in the same /24 disagree wildly, assume the worse one sets the behaviour.
  • Bound the age of the data. AbuseIPDB's maxAgeInDays matters: a report from 2023 describes a previous tenant, not the address you are renting today.
  • Re-score the same addresses a week later. A pool that scores clean on day one and drifts by day twenty is churning ranges, which is a different and worse problem than a pool that starts slightly dirty and stays flat.

If scores come back poor across the board, the fix is rarely the scoring vendor. It is the range. What IP blacklisting is and how to avoid it covers the delisting side, and the ASN classification behind most of these verdicts is explained in what a datacenter ASN is.


The Test That Settles It: Block Rate on Your Targets

Everything above is a proxy for this. Run the real pages.

OK_TOKEN = "add-to-cart"   # a string that only appears on a genuinely rendered page

def probe(url: str, proxy: str) -> str:
    try:
        r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
    except requests.RequestException:
        return "error"
    if r.status_code in (403, 429):
        return "blocked"
    if r.status_code >= 500:
        return "server"
    return "ok" if OK_TOKEN in r.text else "soft-block"

The soft-block branch is the whole point. A 200 response carrying an empty results grid, a consent interstitial or a stripped product page is the single most common false pass in proxy trials, and any harness that checks only status codes reports it as success. Pick a token that cannot appear on a challenge page, then assert on it every time.

Two rules make the resulting number comparable:

  1. Run the incumbent in the same window. Absolute block rates move with the target's own posture on any given day. A 6 percent block rate means nothing alone and everything next to your current provider's number from the same hour.
  2. Hold everything else constant. Same user agent, same header order, same request rate, same TLS client. Otherwise you are measuring your scraper, not the pool. If blocks persist with clean geo and clean scores, the cause is usually further up the stack, which is the ground covered in bypassing IP fingerprinting with clean datacenter subnets.

For the wider set of connectivity, latency and protocol checks to run alongside this, the complete guide to proxy testing has the full battery.


Pass or Fail Thresholds by Use Case

There is no universal acceptable score, only an acceptable score for what you are doing:

Use caseGeo layer that must agreeTolerance for proxy flagsRealistic proxy class
SEO rank tracking by countryTarget's view, since the engine applies its own geoHigh. Behaviour matters more than proxy classificationDatacenter
Retail price and catalog scrapingTarget's view plus GeoIP database, since currency and stock follow itMediumDatacenter, residential for hardened sites
Ad verification and creative checksAll three layers, city level where the campaign is city-targetedMedium to lowResidential or ISP
Account creation and social signupTarget's viewVery low. A proxy flag is usually fatalResidential or mobile
Limited drops and checkout automationTarget's viewVery lowResidential or ISP
Load and availability testing from a regionGeoIP databaseIrrelevantDatacenter

Read that table before you read a single score. A fraud score of 45 is a non-event for rank tracking and disqualifying for account signup. Buying the wrong class and then testing it hard is the most common way a trial wastes a week. A structured version of this decision lives in what to evaluate when selecting a proxy service.


Symptom to Diagnosis: What Each Failure Tells You

What you observeMost likely causeWhat to ask the provider
RDAP and MaxMind both say DE, the site shows USDThe site licenses a database you did not check, or applies its own overrideWhich geo databases carry this range, and is there a published geofeed
Country correct, immediate 403 from the CDNReputation or ASN class, not geolocationAre these ranges shared, what is the abuse policy, can I get a different allocation
Some exits in country, others two countries awayBlended sub-allocations from mixed sourcesCan the country be pinned, and is the pin contractual or best effort
Geo correct at signup, drifts three weeks laterRange churn without geofeed updatesHow often do ranges rotate, and what is the geo correction turnaround
Scores clean, still soft-blocked behind 200sClient fingerprint, TLS signature or request cadenceNothing. This one is on your scraper, not the pool
One /24 fails, the rest of the sample passesContaminated neighbour rangeCan this /24 be excluded from my rotation

The last column is the practical payoff of running all three tests. It converts "your proxies don't work" into a specific, answerable request, and a vendor's answer to that request tells you more about whether to buy than any number in the test.


Running This Test Against SparkProxy

Point the scripts above at gateway.sparkproxy.io. Port 11000 handles HTTP and HTTPS with per-request rotation, port 11002 holds sticky sessions when a check needs the same exit twice, and port 13000 speaks SOCKS5. Authenticate with credentials in the proxy URL, or add your test machine to the plan's whitelist slots. The network covers more than 1 million datacenter IPs across 80 or more countries, including over 50,000 US datacenter addresses, so a per-country sample of 100 is realistic to collect for the major markets.

Size the plan to the concurrency your block-rate harness proved you need, not to the number of addresses:

PlanMonthlyThreadsWhitelist slotsFair-use speed ceiling
Starter$75100525 Mbps
Core$1402501050 Mbps
Boost$24050015100 Mbps
Plus$440100025150 Mbps

All four are unlimited bandwidth with 30 days validity. The speed figures are ceilings under the Fair Usage Policy, not a guaranteed sustained rate, and larger tiers exist above Plus for bigger deployments.

If the outcome of your testing is that you would rather not own the geo and reputation problem at all, the Scraping API takes the country as a parameter and handles exit selection, retries and rendering:

import os
import requests

r = requests.get(
    "https://scrape.sparkproxy.io/api/v1",
    headers={"X-API-Key": os.environ["SPARKPROXY_API_KEY"]},   # key format: sk-...
    params={
        "url": "https://example.com/de/products",
        "country_code": "de",     # geo-target the exit
        "render_js": False,       # 1 credit; True runs a real browser at 5 credits
        "premium_proxy": True,    # route through residential exits
    },
    timeout=60,
)
print(r.status_code, len(r.text))

Plain fetches cost 1 credit, JavaScript rendering 5, and screenshots or PDFs 10. There are 1,000 free credits with no card, enough to run the block-rate harness in this article against a few hundred real pages before committing to anything. Paid tiers start at $49 for 250,000 credits a month with 50 concurrent requests, then $99 for 1,000,000 at 100 concurrent, $249 for 3,000,000 at 200 concurrent, and $599 for 8,000,000 at 400 concurrent.


Frequently asked questions

FAQ

There is no universal number, because the threshold depends on the target. For scraping public pages, anything below a vendor's high-risk band is usually fine. For account creation or checkout flows, most operators want a score low enough that the address is not classified as anonymizing infrastructure at all, which datacenter IPs never achieve.

Because the address is registered to a hosting ASN, and every scoring vendor classifies hosting ASNs as datacenter infrastructure. That flag states a fact about the address category, not a measure of quality. What varies between datacenter providers is abuse history, neighbour behaviour, and whether the range sits on public cloud block lists.

There is no single answer, and that is the practical problem. MaxMind GeoIP2 and IP2Location are the most widely licensed, with DB-IP and ipinfo also common, and large sites frequently layer their own overrides on top. Testing two commercial databases plus the target's own response is the only way to know what your specific target sees.

Sample 50 to 100 distinct exits per country you care about, and never fewer than the thread count you intend to run. A 20-address sample cannot distinguish a 2 percent bad rate from a 10 percent one, which is exactly the range where the buying decision gets made.

Yes, if it controls the address space. The operator publishes an RFC 8805 geofeed, links it from its RIR whois record, and waits for database vendors to ingest it, which typically takes days to weeks rather than hours. A reseller with no control over the allocation can only move you to different addresses.

Re-score your sample weekly during a trial and monthly in production, using the same addresses each time so drift is visible. A pool whose scores stay flat is worth more than one that starts marginally cleaner and degrades, because the flat pool shows the provider is managing abuse rather than rotating away from it.


Special Discount ยท 20% off

Get 20% off your first month

Premium datacentre proxies with unlimited bandwidth. Use the code at checkout.

Save up to 15% more on quarterly, half-yearly and yearly plans

Claim Discount

About the Author

The SparkProxy Technical Team builds and operates SparkProxy's proxy infrastructure: over 1 million datacenter IPs across 80 or more countries, residential exits, and the SparkProxy Scraping API. We publish operational guidance drawn from running large proxy pools at scale, including geolocation management, abuse handling and block-rate diagnostics. Questions about validating a pool before you buy can go to support@sparkproxy.io.

Keep reading

Related articles

How Many Proxies Do I Need for Web Scraping?

How Many Proxies Do I Need for Web Scraping?

How many proxies do I need? Size threads, IPs per target and Mbps from your real scraping volume, then match the number to a plan you should actually buy.

SparkProxyยทGuides