Docs

The /v1/check endpoint

GeoQ exposes a single endpoint. Everything — signals, geo, network and risk — comes back from one call.

GET https://api.geoq.io/v1/check

Query parameters

ParameterTypeRequiredDescription
ipstringNoIPv4 or IPv6 address to check. If omitted, GeoQ checks the caller's own source IP.
formatstringNoSet ?format=ipinfo for an IPinfo-compatible response shape so an existing IPinfo client keeps parsing. See migration mode.

Headers

HeaderValue
x-api-key<api_key> — required (see auth).
Acceptapplication/json (default).

Examples

Check a specific IP:

$ curl "https://api.geoq.io/v1/check?ip=8.8.8.8" \
    -H "x-api-key: $GEOQ_API_KEY"

Check the caller's own IP (self-lookup):

$ curl "https://api.geoq.io/v1/check" \
    -H "x-api-key: $GEOQ_API_KEY"

An IPv6 address:

$ curl "https://api.geoq.io/v1/check?ip=2606:4700:4700::1111" \
    -H "x-api-key: $GEOQ_API_KEY"

IPv6 is fully supported: the datacenter, tor and verified_bot signals now cover IPv6 as well as IPv4, and geo/ASN always have.

Checking many IPs? POST /v1/check/batch looks up to 100 in one call — see the batch endpoint.

Response

A 200 OK returns the full payload. Each successful response also carries an evidence object describing how directly each signal is observed (authoritative / inferred / beta) — see the response schema for every field.

{
  "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",
    "is_announced": true,
    "is_bogon": false,
    "rpki": "valid",
    "allocation_date": "2000-03-30",
    "allocation_age_days": 9566,
    "registration_country": "US"
  },
  "signals": {
    "connection_type": "datacenter",
    "datacenter_provider": "gcp",
    "relay_provider": null,
    "is_relay": false,
    "is_tor": false,
    "is_vpn": false,
    "is_proxy": false,
    "is_public_resolver": true,
    "is_drop_listed": false,
    "recent_abuse": false,
    "is_verified_bot": false,
    "verified_bot_name": null
  },
  "evidence": {
    "connection_type": "authoritative",
    "tor": "authoritative",
    "vpn": "inferred",
    "proxy": "beta",
    "verified_bot": "authoritative",
    "relay": "authoritative",
    "routing": "authoritative",
    "allocation": "authoritative",
    "drop_listed": "authoritative",
    "recent_abuse": "beta",
    "public_resolver": "authoritative"
  },
  "risk": {
    "score": 20,
    "level": "low",
    "reasons": [
      "connection_type:datacenter",
      "benign_network_kind"
    ]
  },
  "attribution": "https://geoq.io/attributions"
}

Status codes

CodeMeaning
200Success — payload returned.
400Invalid IP or malformed request.
401Missing or invalid API key.
429Daily quota / rate limit exceeded — see rate limits.
5xxServer error — retry with backoff.

Full error format on the errors page.