`GET /api/reports/inbox` — the #1178 P3 per-inbox counter: what a public support inbox received, refused, handed off, answered from the documentation and cost over a rolling 24 hours, plus the derivative surge alarm.
const url = 'https://example.com/api/reports/inbox';const options = {method: 'GET', headers: {cookie: 'supacloud_session=<supacloud_session>'}};
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://example.com/api/reports/inbox \ --cookie supacloud_session=<supacloud_session>WORKSPACE-ADMIN, unlike the overview beside it. Refusal and hand-off counts are
operational data about an inbox under load; a front-end filter that merely hides
the tab is not a gate, so the gate is here. It composes with the same
intelligence.suggestions entitlement the rest of the hub uses.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The endpoint’s body. An envelope rather than a bare array so a later facet or total can be added without breaking the shape.
object
One inbox’s rolling 24-hour picture.
object
chatwoot | intercom.
Runs with no outcome row. ABSENT is not zero — without this number an unknown spend reads as a free one.
REAL spend from task_outcomes, never a second estimate: the ceiling’s
token estimator has to decide before a call, this reports after one.
#1178 P0 — questions answered from the documentation corpus, at no model cost. The one figure that says what the cheap path SAVED.
Ceilings that fired on the QUALITY axis (conversation.handed_off).
Ceilings that fired on the COST axis (conversation.rate_limited).
The bound channel resource — the inbox itself.
The DERIVATIVE alarm: this hour against this inbox’s own median.
Echoed so the reader can see which multiple was applied, rather than having to trust a bare boolean.
Examplegenerated
{ "items": [ { "channel": "example", "conversations_24h": 1, "cost_unknown_tasks": 1, "cost_usd_24h": 1, "docs_answers_24h": 1, "handoffs_24h": 1, "inbound_24h": 1, "inbound_median_hour": 1, "inbound_this_hour": 1, "refusals_24h": 1, "resource_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "resource_name": "example", "surge": true, "surge_factor": 1, "surge_floor": 1, "tokens_24h": 1 } ]}Authentication required
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Permission denied
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}Structured server error
The canonical JSON body of every error response — the single source of truth
the frontend binds to. Every AppError serializes as this exact shape, and
the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is
what the frontend error schema is generated from, so there is no hand-written
error schema on either end.
object
Machine-readable, stable error code.
Present only on a quota-exceeded 403 — the inline upgrade-CTA payload.
object
The entitlement feature key that was hit, e.g. apps.max_count.
The plan’s limit for this key.
Where to send the user to upgrade.
Current usage (count or bytes, per the key).
Human-readable message (the server’s English text; the client may localize
by code).
Example
{ "code": "not_found"}