Account
Usage
What this account has used against its plan, and what it is allowed.
curl --request GET \
--url 'https://truestat.io/api/v1/usage' \
--header 'Authorization: Bearer <token>'{
"data": {
"events": {
"over": false,
"used": 3296,
"limit": 1000000,
"rejected": 0
},
"limits": {
"max_sites": 30,
"max_alerts": 30,
"max_team_seats": 30,
"retention_days": 1825
},
"period_end": "2026-10-03T17:55:11.000Z",
"period_start": "2026-09-03T17:55:11.000Z",
"crawler_events": {
"over": false,
"used": 14521,
"limit": 500000
}
},
"meta": {}
}Both meters, the plan's limits, and the window they apply to.
Two meters, never added together
events counts what people did. crawler_events counts what machines did.
They have separate allowances and opposite consequences:
| Exhausting | What happens |
events | Collection continues; reading closes until the plan grows. |
crawler_events | Crawler collection pauses; no screen closes. |
Summing the two would undo the reason they are separate. Measured over thirty days of real traffic: one site was 91.5% crawler, another 54%, a third 0%. On a single meter the first customer would burn a month's allowance on 850 human visits — on traffic a third party sent them and they never asked for.
Going over closes the reading, never the collecting
over: true means the account has gone past the allowance and beyond the
grace band. Collection does not stop — your events keep landing. What
pauses is reading the period, on the API and the dashboard together.
That is the deliberate trade, and it runs in the customer's favour: a gap in the data would be permanent, silent and impossible to buy back afterwards, while a locked screen is none of those things. Nothing is lost while this lasts, and moving up a step opens the period you already collected. At your limit covers it from the customer's side.
This endpoint keeps answering throughout — it is how you find out that is what
happened. So does account. Everything else,
including the site list, returns
402 quota_exhausted, exactly as the dashboard shows billing and nothing
else.
rejected is the honest half of the meter: events your site produced that
were not processed. It is published rather than hidden because it is the
number that says how much bigger the plan needs to be — counting only the
accepted events would understate it.
It resets with the period. What matters is what is being missed now, not a lifetime total.
null means unlimited
Not zero, and not unknown. A null limit is a real answer: this account has
no cap on that dimension.
data itself is null when there is no live plan. An account without a
subscription has no plan, so it has no quota either — answering "0 of 10,000
used" would invent one it does not have.
Which retention figure to trust
limits.retention_days is the account's quota.
Site settings reports the figure actually
applied to that site's reads, resolved by the same code that does the
clamping.
They agree on ordinary accounts. When they differ, the site's is the one that
decides whether your window comes back clamped.
Authorizations
AuthorizationstringheaderrequiredAn API key from Settings → API keys. Scopes available: analytics:read, sites:read, sites:write, settings:read, settings:write, goals:read, goals:write, funnels:read, funnels:write, notes:read, notes:write, alerts:read, alerts:write, team:read, team:write, revenue:read, revenue:write.
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Response
The answer.
dataobjectmetaobjecterrorobjecterrorobjecterrorobjecterrorobject