One address in.
Every signal out.
A single GET returns every anonymity flag we hold for an address, each one carrying the provider behind it and how strongly it is supported.
Send a request. Read the answer.
No SDK and no key needed to try it — pick an address and read the body. Every flag arrives with the provider behind it and how strongly it is supported.
Robustness and scale.
Built in.
The happy path is the easy part. What matters at volume is that the awkward cases — a limit hit, a key rotated, an address we have nothing on — answer the same way every time, with a status you can branch on instead of a guess.
HTTP/1.1 429 Too Many RequestsRetry-After: 30{"error": "rate_limited","message": "Retry in 30s."}
The header tells the two 429s apart. Present means a transient rate limit and retrying works; absent means an allowance is spent and retrying will not help.
A 5xx is ours, not yours. Retry with exponential backoff and jitter and the next attempt lands on a healthy edge — every official client already does it for you.
Never billed. Private, loopback, link-local, documentation and multicast ranges — including 6to4 and Teredo — are answered as bogons and spend no quota on any plan.
No loose ends.
Which fields can I rely on being present?
ip and the flags your plan reads. Detail objects appear only when there is something to report, and a field we did not answer is absent rather than false.
Start without signing up.
Paste it into a terminal — no account needed. 1k daily allowance per user, answering ip and is_vpn.
{"ip": "45.83.91.1","is_vpn": true}