API Documentation
Look up an IP against proxy, VPN, Tor, and hosting reputation lists — then get bot and risk scores in one request.
Overview
The Statin Traffic Analytics API checks each IP against maintained reputation lists (Tor exits, VPN networks, datacenter ranges), similar to classic proxy-check APIs. Use the flags to block abuse, challenge suspicious traffic, or enrich your analytics.
Base URL: https://traffic.statin.io
Authentication
Every request must include your API key. Create keys from the API page after signing in. Pass the key as a key query parameter (GET), or in the x-api-key header / Bearer Authorization.
# Query param (GET) ?key=ta_live_your_key_here&ip=79.111.119.213 # Or header x-api-key: ta_live_your_key_here
Keep keys secret. Revoke compromised keys immediately from the dashboard. Quota is shared across all keys in your workspace.
/api/v1/traffic/check
Look up one IP and get proxy, VPN, Tor, and hosting flags with risk and bot scores. Each successful call counts against your monthly quota and appears in the live request feed on your dashboard.
curl "https://traffic.statin.io/api/v1/traffic/check?key=ta_live_xxx&ip=79.111.119.213"
Plain-text mode (Y = proxy/VPN/Tor, N = clean, X = error):
curl "https://traffic.statin.io/api/v1/traffic/check?key=ta_live_xxx&ip=79.111.119.213&format=text"
/api/v1/traffic/check
Same check via JSON body and x-api-key header — useful for server integrations that prefer POST.
curl -X POST "https://traffic.statin.io/api/v1/traffic/check" \
-H "Content-Type: application/json" \
-H "x-api-key: ta_live_xxx" \
-d '{"ip":"79.111.119.213"}'Request parameters
GET uses query parameters. POST accepts the same fields as JSON (ip, source, format) with the key in a header.
| Field | Type | Description |
|---|---|---|
| iprequired | string | IPv4 or IPv6 address to look up in proxy / VPN / Tor / hosting reputation lists. |
| keyrequired | string | API key (GET query param). You can also send x-api-key or Authorization: Bearer. |
| format | string | Optional. "json" (default) or "text" for plain Y/N/X like classic proxy APIs. |
| source | string | Optional label for your own logging (e.g. web, mobile, batch). |
Response fields
A successful JSON check returns HTTP 200 with the following fields.
| Field | Type | Description |
|---|---|---|
| status | string | Always "success" when the check completes. |
| requestId | string | Unique ID for this request — useful for support and debugging. |
| ip | string | The IP that was analyzed. |
| country | string|null | Country name from MaxMind GeoLite2-City. |
| countryCode | string|null | ISO country code (e.g. US, IN). |
| continent | string|null | Continent name from MaxMind City. |
| region | string|null | Region / state from geo enrichment. |
| city | string|null | City from geo enrichment. |
| postalCode | string|null | Postal / ZIP code when available. |
| latitude | number|null | Approximate latitude. |
| longitude | number|null | Approximate longitude. |
| timezone | string|null | IANA timezone (e.g. America/Los_Angeles). |
| accuracyRadius | number|null | MaxMind location accuracy radius in kilometers. |
| asn | number|null | Autonomous system number from GeoLite2-ASN. |
| asn_name | string|null | ASN organization name (alias of asnOrganization). |
| asnOrganization | string|null | ASN organization / network owner from MaxMind ASN. |
| organization | string|null | Network organization (same as ASN org on free GeoLite2). |
| isp | string|null | ISP name (same as ASN org on free GeoLite2; paid ISP DB for true ISP). |
| connection_type | string | Hosting, Residential, Mobile, VPN, Proxy, Tor, or Unknown. |
| hosting | boolean | True if the IP belongs to a datacenter / cloud provider. |
| cloud_provider | string|null | Detected cloud provider when hosting (e.g. Cloudflare, AWS). |
| vpn | boolean | True if the IP falls in a known commercial VPN network range. |
| proxy | boolean | True if the IP matches known anonymous egress (VPN or Tor). |
| tor | boolean | True if the IP is a known Tor exit node. |
| residential | boolean | True when the IP looks like a consumer residential network. |
| mobile | boolean | True when the IP is on a mobile carrier network. |
| bot_hosting | boolean | True when hosting IP also has elevated bot probability. |
| fraud_score | number | 0–100 fraud / abuse risk score (same scale as riskScore). |
| anonymous | boolean | True when proxy, VPN, or Tor is detected. |
| risk_level | string | Low, Medium, or High — derived from fraud_score. |
| confidence | object | Per-signal confidence percentages for vpn, hosting, and residential. |
| botProbability | number | 0–100 bot likelihood derived from IP risk signals. |
| riskScore | number | 0–100 combined risk score (alias of fraud_score for older clients). |
| reasons | string[] | Machine-readable codes explaining why flags or scores were raised. |
Sample response
{
"status": "success",
"requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ip": "104.28.45.100",
"country": "United States",
"countryCode": "US",
"continent": "North America",
"region": "California",
"city": "Los Angeles",
"postalCode": "90012",
"latitude": 34.0544,
"longitude": -118.244,
"timezone": "America/Los_Angeles",
"accuracyRadius": 20,
"asn": 13335,
"asn_name": "Cloudflare, Inc.",
"asnOrganization": "Cloudflare, Inc.",
"organization": "Cloudflare, Inc.",
"isp": "Cloudflare, Inc.",
"connection_type": "Hosting",
"hosting": true,
"cloud_provider": "Cloudflare",
"vpn": false,
"proxy": false,
"tor": false,
"residential": false,
"mobile": false,
"bot_hosting": false,
"fraud_score": 20,
"anonymous": false,
"risk_level": "Low",
"confidence": {
"vpn": 93,
"hosting": 100,
"residential": 90
},
"botProbability": 15,
"riskScore": 20,
"reasons": ["hosting_or_datacenter_ip"]
}Errors
JSON errors include a message field. With format=text, errors return X. Common status codes:
- 401Missing or invalid API key.
- 400Invalid or missing ip field.
- 429Rate limit, daily quota, or monthly quota exceeded. Check response code field: RATE_LIMIT_EXCEEDED, DAILY_QUOTA_EXCEEDED, or MONTHLY_QUOTA_EXCEEDED.
- 500Unexpected server error. Retry with the same requestId.
Rate limits & quota
Every workspace has two kinds of limits:
- Per-second rate limit — stops bursts that could overload the API (token bucket, short 2-second burst allowed). Free: 2 req/s · 5K: 5 · 10K: 10 · 25K: 20 · Custom: 50 (or higher by agreement).
- Daily & monthly quota — plan allowance for total successful checks. Free includes 1,000/day; paid plans raise the daily and monthly caps.
When either limit is hit, the API returns 429 with a machine-readable code:
RATE_LIMIT_EXCEEDED— slow down; honorRetry-AfterandX-RateLimit-*headers.DAILY_QUOTA_EXCEEDED— wait until the daily reset (midnight server time) or upgrade.MONTHLY_QUOTA_EXCEEDED— upgrade or wait for the next billing month.
Check remaining quota on the dashboard or profile page. See pricing for plan rate limits, or contact us for a Custom plan.
Quick start
- Create an account and open the API page to copy your key.
- Call GET /api/v1/traffic/check?key=…&ip=… with the IP you want to score.
- Use proxy / VPN / Tor / hosting flags and riskScore in your product logic.
