Skip to main content

Overview

Every successful response (HTTP 2xx) is a JSON object with a data field and a meta field. The shape of data depends on the endpoint:
data shapeUsed by
Array + nextCursorCursor-paginated list endpoints (most search/* and data/* endpoints)
Array, no nextCursorNon-paginated aggregations that return multiple rows (stats/families, stats/countries, stats/timeline, search/keyword)
Single objectSingle-resource and aggregation endpoints (domain/overview, domain/assets, victims/{id}, account, search/infection-analysis, search/categorize-domains, stats/overview)

Paginated list response

{
  "data": [ { "...": "..." } ],
  "nextCursor": "eyJzaWciOiJh...",
  "meta": {
    "request_id": "req_01HZXK3Q7N8YV6F3M2P9JABCDE",
    "took_ms": 38.2,
    "tier": "pro",
    "masked_fields": []
  }
}

Non-paginated array response

{
  "data": [ { "...": "..." } ],
  "meta": {
    "request_id": "req_01HZXK3Q7N8YV6F3M2P9JABCDE",
    "took_ms": 12.1,
    "tier": "pro",
    "freshness_at": "2026-06-15T09:45:00Z"
  }
}

Single-object response

{
  "data": { "...": "..." },
  "meta": {
    "request_id": "req_01HZXK3Q7N8YV6F3M2P9JABCDE",
    "took_ms": 51.4,
    "tier": "ultra"
  }
}
GET /v1/account returns only data with no meta — see its reference page.

The meta object

FieldTypeAlways presentDescription
request_idstringyesUnique ID for this request. Include this when contacting support about a specific call.
took_msnumberyesServer-side processing time in milliseconds.
tierfree | pro | ultrayesThe tier of the API key that made the request.
masked_fieldsstring[]noNames of fields in data that were masked or converted to a has_* boolean for this tier. Empty/absent if nothing was masked. See Data Masking.
freshness_atstring (ISO 8601) | nullnoTimestamp of the most recent underlying data point — present on cached/aggregated responses (e.g. stats/*, domain/overview).

Errors don’t use this envelope

Error responses use a separate { "error": { ... } } shape — see Errors.