The envelope
data · meta · error, on every response
{
"data": {
"domain": "apnews.com",
"requested": "apnews.com",
"domain_rating": 91,
"ahrefs_rank": 412,
"monthly_visits": 105300000,
"monthly_visits_basis": "total",
"organic_monthly_visits": 38200000,
"sources": {
"domain_rating": { "provider": "ahrefs", "fetched_at": "2026-08-28T09:14:02Z", "status": "ok" },
"monthly_visits": { "provider": "similarweb", "fetched_at": "2026-08-27T22:41:55Z", "status": "ok" }
}
},
"meta": {
"resource": "domain",
"request_id": "req_01J6XY0M9…",
"cache": "hit",
"age_seconds": 254407,
"cost_units": 0,
"degraded": false
},
"error": null
}
- Numbers stay numbers.
105300000, never "105M+" — formatting is your UI's job.
null means unknown. Never zero, never a placeholder. The matching sources entry says why: no_data, provider_error, disabled or not_requested.
- Provenance per field. Each metric names its provider and fetch time — stamp your own freshness from
fetched_at, not from the moment you asked.
meta.cache + meta.cost_units. hit costs 0 credits; a fresh fetch costs 1 per provider call. degraded: true flags a stale-but-served answer.