Docs

Response schema

Every successful /v1/check call returns this structure. Fields are stable; new fields may be added over time but existing ones won't change meaning without a version bump.

{
  "ip": "8.8.8.8",
  "version": 4,
  "geo": {
    "country": "United States",
    "country_code": "US",
    "region": "California",
    "city": "Mountain View",
    "latitude": 37.4,
    "longitude": -122.1,
    "timezone": "America/Los_Angeles"
  },
  "network": {
    "asn": 15169,
    "as_org": "Google LLC"
  },
  "signals": {
    "is_datacenter": true,
    "datacenter_provider": "gcp",
    "is_tor": false,
    "is_vpn": false,
    "is_proxy": false,
    "is_bot": false
  },
  "risk": {
    "score": 35,
    "level": "medium",
    "reasons": [
      "is_datacenter"
    ]
  },
  "attribution": "https://geoq.io/attributions"
}

Fields

FieldTypeDescription
ipstringThe IP address that was checked.
versionnumberIP version: 4 or 6.
geo.countrystringCountry name.
geo.country_codestringISO 3166-1 alpha-2 country code.
geo.regionstringRegion / state (best-effort).
geo.citystringCity (best-effort).
geo.latitudenumberApproximate latitude of the network.
geo.longitudenumberApproximate longitude of the network.
geo.timezonestringIANA timezone, e.g. America/Los_Angeles.
network.asnnumberAutonomous System Number.
network.as_orgstringAS organisation name.
signals.is_vpnbooleanIP is in a known commercial VPN range.
signals.is_proxybooleanOpen/anonymising proxy (residential detection beta).
signals.is_datacenterbooleanIP is in a known hosting/cloud range.
signals.datacenter_providerstring|nullProvider code (aws, gcp, azure, …) or null.
signals.is_torbooleanIP is a current Tor exit node.
signals.is_botbooleanAutomation heuristic (beta).
risk.scorenumber0–100 capped sum of triggered signal weights.
risk.levelstringlow (<30), medium (30–59), high (≥60).
risk.reasonsstring[]The signal keys that contributed to the score.
attributionstringURL to the required attribution page.

Notes on honesty

  • geo is approximate and locates the network, not the device.
  • signals.is_proxy and signals.is_bot are beta.
  • All signals are probabilistic. risk.reasons shows exactly what fired so you can audit any score.
  • attribution must be honoured on the Free tier — see attributions.