Example
Response
Response
Response
Response shape
| Field | Type | Notes |
|---|---|---|
ip | string | The IP that was looked up (echoed back). |
asn | integer | AS number from Team Cymru. 0 or missing if the lookup failed. |
asn_org | string | Human-readable AS organization name. |
country | string | ISO 3166-1 alpha-2. |
is_tunnelbyte_exit | boolean | true if the IP is currently a Tunnelbyte exit. false for retired nodes - check retired_at. |
region | string | Present when the IP is or was a Tunnelbyte exit. |
active_since | string | RFC3339 timestamp. The moment we started operating this IP. Present when we know the IP. |
retired_at | string | RFC3339 timestamp. Present only on retired nodes. After this date the IP has been returned to the provider’s pool and any complaint should go to its new operator. |
note | string | Plain-language explanation, present only when retired_at is set. |
abuse_contact | string | Always abuse@tunnelbyte.dev. The whole point of this endpoint. |
Errors
| Status | Body | Why |
|---|---|---|
| 400 | invalid IP address | Not a parseable IPv4 / IPv6. |
| 400 | address is not publicly routable | Loopback, private, link-local, or multicast. We don’t attribute those. |
| 429 | rate-limited | Too many requests from your source IP. Burst 10 / 1 rps. |
Why this exists
When a sysadmin or abuse desk sees traffic from one of our exit IPs and wants to know who to contact, this endpoint (and the tunnelbyte.dev/ip page in front of it) gives them an immediate, authoritative answer: the complaint goes toabuse@tunnelbyte.dev. See abuse policy.
Caching
- 5-minute in-memory cache per IP in the handler.
- 6-hour in-memory cache per /24 (IPv4) or /48 (IPv6) for the upstream ASN lookup. The ASN lookup result is shared with the rate-limit issuance code.
CORS
Access-Control-Allow-Origin: * on every response. The browser can hit this endpoint directly from any page.