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.

FieldWhat 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 →