Skip to main content

Normalized call record

Voxfra normalizes each provider’s payload into a unified call record. This is what you see in the admin console and when querying the Management API.
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "organization_id": "00000000-0000-0000-0000-000000000001",
  "client_id": "00000000-0000-0000-0000-000000000002",
  "created_at": "2026-04-14T10:05:31.204Z",
  "call_start_time": "2026-04-14T10:00:00Z",
  "call_end_time": "2026-04-14T10:05:30Z",
  "call_duration_seconds": 330,
  "caller_phone_number": "+15551234567",
  "caller_full_name": null,
  "call_summary": "Customer inquired about vehicle pricing.",
  "transcript": "Hello, how can I help you today?...",
  "transfer_flag": false,
  "hangup_reason": null,
  "recording_url": "https://recordings.vapi.ai/call_abc123.mp3",
  "phone_call_provider": "vapi",
  "call_provider_call_sid": "call_abc123"
}

Field mapping by provider

Normalized fieldVapi sourceLiveKit source
call_provider_call_sidcall.idroom.sid
call_start_timecall.startedAtroom.creation_time
call_end_timecall.endedAtroom.end_time
call_duration_secondsderivedroom.duration
caller_phone_numbercustomer.number
transcripttranscripttranscription.text
call_summaryanalysis.summary
recording_urlrecordingUrlrecording.download_url
Fields that a provider does not supply are stored as null.

Idempotency

Voxfra deduplicates webhooks by call ID within a 24-hour window. If your provider retries delivery:
  • The second request returns 200 immediately
  • No duplicate record is written
  • The duplicate: true flag is set in the response body
{
  "success": true,
  "requestId": "req_abc456",
  "duplicate": true
}