Skip to main content

Webhooks

Webhooks let your systems receive real-time events from the platform — call started, ended, transferred, transcript ready, and campaign state changes.

List webhooks

GET /v1/webhooks
Scope: voice:webhooks:read

{
"webhooks": [
{
"uuid": "wbh_w1x2y3",
"name": "CRM Sync",
"url": "https://workflow.example.com/nn-events",
"events": ["call.ended", "call.started"],
"is_active": true,
"last_triggered_at": "2026-05-12T14:34:00Z"
}
]
}

Register webhook

POST /v1/webhooksRate limit: 20/minute
Scope: voice:webhooks:write

{
"name": "CRM Sync",
"url": "https://workflow.example.com/nn-events",
"events": ["call.ended", "call.started", "call.transferred"],
"headers": {
"X-Workflow-Secret": "your-shared-secret"
}
}
FieldTypeRequiredNotes
namestring
urlstringHTTPS endpoint receiving POST requests
eventsstring[]One or more event types (see table below)
headersobjectCustom headers sent with every delivery

Delete webhook

DELETE /v1/webhooks/{webhook_id}
Scope: voice:webhooks:write


Delivery logs

GET /v1/webhooks/{webhook_id}/logs
Scope: voice:webhooks:read

Query parameters: limit (default 50, max 100), offset

{
"logs": [
{
"uuid": "wbl_l1m2n3",
"event_type": "call.ended",
"response_status": 200,
"success": true,
"triggered_at": "2026-05-12T14:34:05Z"
}
]
}

Event types

EventFired when
call.startedA call connects (human voice detected)
call.endedA call terminates — includes full transcript and outcome
call.transferredAI initiates a warm transfer to a human agent
call.no_answerCall goes unanswered after ring timeout
call.voicemailVoicemail detected — auto-disconnected
campaign.launchedOutbound campaign starts
campaign.stoppedOutbound campaign stops
campaign.completedAll contacts in the campaign have been dialled

Event payload envelope

Every delivery is a POST to your URL with this structure:

{
"event": "call.ended",
"fired_at": "2026-05-12T14:34:05Z",
"organisation_uuid": "org_o1p2q3",
"data": {
"call_uuid": "cal_c1d2e3f4",
"call_type": "outbound",
"campaign_uuid": "flw_f1g2h3",
"contact_uuid": "cst_c1d2e3",
"contact_phone": "+14155550192",
"contact_metadata": {
"lead_id": "LH-CA-2026050512-78231",
"cart_value": 850
},
"outcome": "connected",
"sentiment": "positive",
"duration_seconds": 113,
"language_detected": "en",
"transcript": [
{ "speaker": "agent", "text": "Hi, good morning!", "timestamp": 0.0 },
{ "speaker": "customer", "text": "Yes I was looking at that desk.", "timestamp": 6.2 }
],
"recording_url": "https://api.nextneural.ai/api/voice/calls/cal_c1d2e3f4/recording",
"started_at": "2026-05-12T14:32:01Z",
"ended_at": "2026-05-12T14:34:00Z"
}
}

Delivery behaviour

  • Retries: Up to 3 attempts with exponential backoff on non-2xx responses
  • Timeout: Respond within 10 seconds or the delivery is marked failed and retried
  • Signature: Verify deliveries using the X-NN-Signature header — HMAC-SHA256 of the raw body signed with your webhook secret