Appearance
recording.failed
When: The call won't have a recording: the tenant's storage quota was used up, it couldn't start, it started just before an upgrade of the media server and won't be delivered, or it never arrived from the media server (24 h after the call ended). A recording that arrives after that is still stored and sends recording.completed
Extra data: recording_id, reason (a sentence for people to read, not a code)
Example
Headers: X-Calloop-Event: recording.failed, X-Calloop-Event-Id, X-Calloop-Signature (verifying).
json
{
"event_id": "7c0b1e0c-8a45-4c1b-9d4c-0f3a6a2f9b11",
"event_type": "recording.failed",
"api_version": "2026-09-25",
"occurred_at": "2026-09-25T10:05:12.000Z",
"tenant_ref": "biz-123",
"data": {
"call": {
"callId": 42,
"callUuid": "00000000-0000-0000-0000-000000000042",
"tenantId": 1,
"tenantRef": "biz-123",
"channel": "WHATSAPP",
"channelId": 1,
"channelAddress": "+442079460000",
"channelRef": "support-line",
"queueId": 1,
"direction": "INBOUND",
"status": "TERMINATED",
"state": null,
"mediaTopology": "ROOM",
"customer": {
"address": "+447700900123",
"addressType": "E164",
"name": "Test Customer"
},
"agentId": 7,
"agentRef": "user-7",
"agentName": "Agent One",
"externalRef": "crm-call-42",
"providerCallId": "wacid.HBgL...",
"ivrFlowId": null,
"ringingAt": "2026-09-25T10:00:00.000Z",
"answeredAt": "2026-09-25T10:00:06.000Z",
"endedAt": "2026-09-25T10:05:12.000Z",
"terminationReason": "COMPLETED",
"terminatedBy": "CUSTOMER",
"durations": {
"ringing": 6,
"call": 306,
"queue": 4
},
"failureDetails": null,
"consumerMetadata": {
"crm_contact_id": 991
},
"createdAt": "2026-09-25T10:00:00.000Z"
},
"recording_id": 52,
"reason": "Recording skipped: storage quota exceeded"
}
}data.call is the full call at that moment — the same view GET /v1/calls/{callId} returns. Apply events by "latest occurred_at wins": they can arrive out of order.