Read ID graph metrics
const url = 'https://qinto-api.blotout.io/teams/7b8d1a52-6c1e-4b6f-9a30-2f8a54d1c3e9/domains/3f2a9c81-5d47-4e0b-8c66-91b2a7f04d15/id-graph/metrics?window=1h';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://qinto-api.blotout.io/teams/7b8d1a52-6c1e-4b6f-9a30-2f8a54d1c3e9/domains/3f2a9c81-5d47-4e0b-8c66-91b2a7f04d15/id-graph/metrics?window=1h' \ --header 'Authorization: Bearer <token>'Reports the Durable Object usage of the site’s identity graph — the per-device Anon DO and the per-person Global DO — over a recent window, hour by hour, with the window before it for comparison.
How it works
state: unavailable is not a failure of the call: retry later, and if it persists, check that the host’s Cloudflare token can read analytics.
Required permissions
domain:id_graph_explorer:readon all domains, or on the addressed domain when its id is in the route
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Unique id (UUID) of the team that owns the addressed resources, as shown in the team settings on the Blotout platform.
Example
7b8d1a52-6c1e-4b6f-9a30-2f8a54d1c3e9Unique id (UUID) of the team that owns the addressed resources, as shown in the team settings on the Blotout platform.
Unique id (UUID) of the site, as returned by the site operations.
Example
3f2a9c81-5d47-4e0b-8c66-91b2a7f04d15Unique id (UUID) of the site, as returned by the site operations.
Query Parameters
Section titled “Query Parameters”How far back to report, ending now. The previous window of the same length is reported alongside for comparison.
Example
24hHow far back to report, ending now. The previous window of the same length is reported alongside for comparison.
Responses
Section titled “Responses”The usage, or why there is none.
object
unavailable when the metrics cannot be read right now — the host’s token cannot read analytics, the read quota is spent, or Cloudflare refused — and namespaces is empty then.
The window reported.
One entry per class the site has recorded; empty unless state is ok.
Durable Object usage of one identity-graph class on the site.
object
Which identity-graph class: anon, one per device, or global, one per person.
What to show a reader for this class.
One bucket per hour with activity in the window, oldest first; idle hours are left out.
One hour of activity.
object
Start of the hour, as an ISO 8601 UTC timestamp.
Requests the objects served.
Requests that failed.
Wall-clock time the requests took, summed, in microseconds.
Storage rows the objects read.
Storage rows the objects wrote.
CPU time the requests used, summed, in microseconds.
Billed duration, in GB-seconds.
WebSocket messages the objects received.
Outbound requests the objects made.
The whole window, summed.
object
Requests the objects served.
Requests that failed.
Wall-clock time the requests took, summed, in microseconds.
Storage rows the objects read.
Storage rows the objects wrote.
CPU time the requests used, summed, in microseconds.
Billed duration, in GB-seconds.
WebSocket messages the objects received.
Outbound requests the objects made.
The window of the same length before it, summed, for comparison.
object
Requests the objects served.
Requests that failed.
Wall-clock time the requests took, summed, in microseconds.
Storage rows the objects read.
Storage rows the objects wrote.
CPU time the requests used, summed, in microseconds.
Billed duration, in GB-seconds.
WebSocket messages the objects received.
Outbound requests the objects made.
Example
{ "state": "ok", "window": "1h", "namespaces": [ { "identifier": "anon", "label": "Anon DO", "buckets": [ { "at": "2026-10-22T09:00:00Z", "requests": 1840, "errors": 2, "wallTimeUs": 920000, "rowsRead": 5400, "rowsWritten": 1200, "cpuTimeUs": 310000, "durationGbs": 0.42, "inboundWebsocketMessages": 960, "subrequests": 75 } ], "totals": { "requests": 1840, "errors": 2, "wallTimeUs": 920000, "rowsRead": 5400, "rowsWritten": 1200, "cpuTimeUs": 310000, "durationGbs": 0.42, "inboundWebsocketMessages": 960, "subrequests": 75 }, "previous": { "requests": 1840, "errors": 2, "wallTimeUs": 920000, "rowsRead": 5400, "rowsWritten": 1200, "cpuTimeUs": 310000, "durationGbs": 0.42, "inboundWebsocketMessages": 960, "subrequests": 75 } } ]}invalid_params — A path parameter failed validation (for example a malformed UUID); details pinpoints the offending parameter.
object
Machine-readable error slug; switch on this value rather than on the HTTP status alone.
Field-level validation errors: a tree keyed by input property, each node carrying an errors array of human-readable messages. Render it to help the caller correct the request.
object
Example
{ "error": "invalid_params", "details": { "errors": [], "properties": { "teamId": { "errors": [ "Invalid UUID" ] } } }}unauthenticated — The Authorization: Bearer token is missing, malformed, or no longer valid. Generate a team API token or obtain a new OAuth access token.
object
Machine-readable error slug; switch on this value rather than on the HTTP status alone.
Example
{ "error": "unauthenticated"}forbidden — The bearer credential lacks the required permission or belongs to another team, or its user lacks the organization role a developer operation needs. Update its policies, use a credential bound to the addressed team, or ask an organization owner for the role; message states the reason when one is known.
object
Machine-readable error slug; switch on this value rather than on the HTTP status alone.
Human-readable reason for this specific failure, intended for display — do not parse it programmatically.
Example
{ "error": "forbidden", "message": "The Cloudflare API token is invalid or expired."}internal — Unexpected server error. Nothing is guaranteed to have been persisted; idempotent operations are safe to retry.
object
Machine-readable error slug; switch on this value rather than on the HTTP status alone.
Example
{ "error": "internal"}