Support KPI rollup for the Application over an optional window (defaults to the last 30 days).
Containment / escalation / degrade / override rates, time-to-human percentiles, live operator load, cost per resolved conversation, and the currently-awaiting-a-human gauge. Rates are null when their denominator is zero. `from`/`to` are Unix ms (half-open); `origin` filters spend only. All time is `from=0`: a window reaching back before the Application existed is counted from the day it was created.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The Application (Network) id.
uuidThe tenant identifier
Query Parameters
Window start, Unix ms inclusive. Defaults to 30 days before to; 0 for all time.
int64Window end, Unix ms exclusive. Defaults to now.
int64Execution origin for spend attribution. Defaults to Production.
"UNSPECIFIED" | "PRODUCTION" | "TEST"Response Body
curl -X GET "https://api.fruxon.com/v1/tenants/string/networks/497f6eca-6276-4993-bfeb-53cbbbba6f08/supportKpis"{
"networkId": "00000000-0000-0000-0000-000000000000",
"window": {
"fromMs": 0,
"toMs": 0
},
"conversations": 0,
"containedConversations": 0,
"containmentRate": 0,
"escalatedConversations": 0,
"escalationRate": 0,
"tickets": 0,
"resolvedTickets": 0,
"escalations": 0,
"degraded": 0,
"degradeRate": 0,
"overrideHits": 0,
"overrideHitRate": 0,
"timeToHuman": {
"count": 0,
"p50Ms": 0,
"p95Ms": 0
},
"operatorLoad": [
{
"operatorParticipantId": "00000000-0000-0000-0000-000000000000",
"displayName": "string",
"activeTakeovers": 0
}
],
"availableOperators": 0,
"usesOperatorPool": false,
"relayTakeovers": 0,
"totalCostUsd": 0,
"costPerConversationUsd": 0,
"creditsCharged": 0,
"awaiting": {
"count": 0,
"oldestWaitMs": 0,
"p50WaitMs": 0
},
"unhealthyLlmConfigCount": 0,
"unhealthyCredentialCount": 0,
"unhealthyCredentials": [
{
"configId": "00000000-0000-0000-0000-000000000000",
"integrationId": "string",
"displayName": "string",
"health": "HEALTHY",
"detail": "string",
"since": 0
}
],
"budgetBlockedAgentCount": 0,
"budgetBlockedAgents": [
{
"agentId": "string",
"agentName": "string",
"period": "DAILY",
"environmentSlug": "string",
"amount": 0,
"currentCost": 0
}
]
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}The app's statement for a billing period.
What finished this billing period, in the ledger's own unit, against the app's price card: the flat part, the included volume, and the overage. A period is a month counted from the day the app went on its card. An app on credits gets a statement with no card, no period and no lines, which is how a client tells "nothing to bill" from "not found"; a card scheduled to start is named as upcoming. Provisional until the period has ended and its last day has been finalized.
Why the Application's conversations escalated over an optional window (defaults to the last 30 days).
Dead-ended escalation attempts by cause (summing to the rollup's `degraded`) with each cause's latest conversation, and the window's escalations grouped by the reason the agent gave — names and identifiers redacted (`redactionHits` counts them), grouped only when identical after that; groups holding a dead-end first, then most recent first — with how each group ended and the latest one's conversation, channel and agent. The operator queue keeps the reasons as written. Repeated attempts at one escalation count once; the queue's by-design requests and notifications, and lab rehearsals, are not escalations. `from`/`to` are Unix ms (half-open); all time is `from=0`. A window holding more escalation ledger rows than one read keeps is narrowed to its newest ones, and the response's `window` starts where they do.