Online API · self-hosted
IP risk profile
Give us an IP address and we return what we can currently say about its risk, together with its
network and geographic ownership. Proxies, VPNs, dial-up pools, cloud phones and datacenters are
the infrastructure attackers hide behind — and the traces they leave on the network can be captured.
The biggest difference from a traditional IP intelligence database:
what we return is a judgement that expires, not a label that stays true forever.
The same address that was a proxy last week may or may not still be one today; it depends on how
old the evidence is.
Try an address →
Why permanent labels make you block the wrong people
An IP address is not a fixed asset; it moves. A residential line held by a dial-up pool today may be
back with a real subscriber next week; a cloud host used as a proxy gets its address reassigned once
the lease ends. Keeping a permanent “proxy” label on addresses like those stops being a
defence against attackers and starts being a tax on whoever inherits the address.
So every judgement we return carries when it was last observed. The older the
evidence, the lower the score; past the freshness window for that class of risk, the score reaches
zero and the judgement is void. Letting conclusions expire on their own is the core design
of this product.
What the score is, and what it is not
The response contains no Chinese. Place names, usage types and risk types come back
as standard codes or stable slugs, so your parsing layer never has to deal with Chinese text.
The code tables are below and in the API reference.
| Field | What it means |
risk.score |
0–100. The freshness and strength of verifiable risk evidence, decaying as
the evidence ages. It is not the probability that the address belongs to an
attacker. This product gives exactly one score per address:
score on /pulse/v1/ip has the same source and the same value. |
risk.level |
high / medium / low / none, derived from risk.score.
none means “we hold no currently verifiable evidence”, which
is not the same as safe. |
network / geo |
Address ownership, in the same shape as the professional tier of /pulse/v1/ip.
network.asn plus a usage_type code; geo gives the
continent code, ISO 3166-1 country code, the Latin place names
region / city / district
(the key set is constant: the six string keys are present for every address; region and city carry values for addresses in every country, district for addresses in China only — the place-name database covers China down to the county/district level and other countries down to the city; a name the database does not have is an empty string, not 0),
coordinates and time zone.
Operator names are not returned; the machine-readable identity is asn. |
evidence_state |
active: fresh evidence that still scores. stale: seen before, but past the freshness window
with a score of zero — usable as a weak signal, not as a blocking reason on its own.
none: never seen, which may mean a coverage gap. |
risk.signals |
An array of matched signal slugs, sorted alphabetically; the key is absent when nothing matched
(risk then carries score and level alone).
hosting / mobile are derived from the network usage type and are not
risks in themselves; the code table is in the API reference;
per-evidence detail and capture timestamps are on the
Pulse endpoint. |
A score of 0 does not mean safe
Zero only says we hold no currently verifiable evidence — the address may genuinely
be clean, or we may simply never have captured it. Read it as “nothing found”, not as
“cleared”. Route on evidence_state rather than on the score alone.
Where it gets used
Signup and login risk
Bulk registration, credential stuffing and account farming nearly all need a proxy pool to rotate
addresses. Check once at signup and on anomalous logins, and keep out requests that plainly
come from attack infrastructure.
Promotions and ad spend
Where coupon claims, referral pushes and campaign entries come from — and where ad impressions and
clicks come from. An abnormal share of datacenter and proxy addresses usually means that batch
is not human.
Content and API scraping
Scrapers rotate exits across proxy pools. Routing by risk type and sharing level catches more of
them, and hurts fewer real users, than rate limiting alone.
Post-incident review and arbitration
Whether a transaction should have been blocked has to be judged on the evidence available
at the time. The API can score against a specified moment, so you are not holding
yesterday's decision to today's conclusion.
Two ways to deploy
Online API
Usable as soon as you sign up, with a free allowance active the same day and monthly plans for higher volume. Suited to
traffic you control, where sending lookups over the public internet is acceptable. Integration is below.
Pulse self-hosted
We deliver the entire intelligence set onto your machines and every lookup happens
inside your network — we never learn which addresses you checked. The interface is identical to the
online version. About Pulse self-hosted →
Integration
The same profiling capability, callable from your risk system. No registration needed to try it; sign in to create a key and raise the limit.
GEThttps://ip99.com/v1/ip/{ip}
# No key needed (anonymous allowance)
curl https://ip99.com/v1/ip/8.8.8.8
# With a key you create yourself, the allowance is per account
curl -H "X-API-Key: YOUR_KEY" https://ip99.com/v1/ip/8.8.8.8
To ask what the risk state was at a past moment (post-incident review,
chargeback arbitration), use ?at= on the Pulse endpoint:
GET /pulse/v1/ip/{ip}?at=2026-08-26T13:34:36Z (RFC3339, up to 30 days back; a numeric offset works, but percent-encode its + as %2B); the returned
computed_at is exactly the moment you asked for. The profile endpoint on this page
answers for now only and does not accept at.
Pulse is professional-tier only: without a professional key it answers
403 professional_required, while the free profile stays open at /v1/ip;
for history, contact sales.
Response fields, allowances and error formats are all in the
API reference.
Coverage and refresh
10 risk signals
Proxy, VPN, dial-up pool, hijacked shared proxy, cloud phone, serverless egress, datacenter,
crawler, open-source intel and mobile network. Geolocation down to city level (district level for Chinese addresses), with ASN.
10-second refresh
Risk data arrives incrementally within a minute and lands in seconds; the geolocation database is
rebuilt daily. Every response carries computed_at — the moment the score applies to — so you
can archive that moment alongside the conclusion you acted on.
FAQ
Does a score of 0 mean the address is safe?
No. The score measures the freshness and strength of verifiable risk evidence, not the probability that the address is an attacker. A score of 0 with evidence_state none means we hold no current evidence; with stale it means evidence existed and has expired. Neither is a clean bill of health. Branch on evidence_state, not on the number.
How current is a verdict?
Every response carries computed_at. Evidence decays with age, so an address that was a proxy exit last week can be stale or none this week. Query at decision time instead of caching a verdict.
Can it detect residential proxies and dial-up pools?
Yes. risk.signals carries proxy, dialup_pool, vpn, cloud_phone and hosting from observed presence in proxy supply and infrastructure fingerprints; the age of each observation is on the evidence rows of the professional tier. See rotating residential proxies and dial-up pools.
Does a datacenter address mean a bot?
No. network.usage_type says what kind of network the address sits in; VPN providers, CI runners and monitoring agents live in datacenters legitimately. Read it together with the score and evidence_state.
How do I query it, and what does it cost?
GET https://ip99.com/v1/ip/{ip} returns JSON with no key and no signup: 500 lookups per day per client IP, 60 per minute. A free account raises that to 5000 per day; higher volumes are on the pricing page. AI agents can call the same lookup as an MCP tool at https://ip99.com/mcp.
Can it run inside our own network?
Yes. Pulse is the self-hosted deployment: the same scoring on a mirror you operate, so no query leaves your network.
Contact sales
Higher allowances, self-hosted deployment, or a trial run against your own data — tell us the use case
and the rough volume.
Open the contact form →