Skip to main content
RevDesk POSTs an event to your URL whenever something happens in your workspace — a call ends, an SMS is delivered, a number is provisioned. Subscribe once per event type; we deliver as the events occur.

Subscribe

curl -X POST https://api.revdesk.com/api/v1/webhook_subscriptions \
  -H "Authorization: Bearer $REVDESK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "webhook_url": "https://example.com/hooks/revdesk", "event_type": "call_completed" }'
# → { "id": "whk_…" }
FieldRequiredDescription
webhook_urlyesHTTPS URL that receives the POST.
event_typeyesOne of the event types below.
workflow_idnoScope delivery to a single workflow.
campaign_idnoScope delivery to a single campaign.

Unsubscribe

curl -X DELETE https://api.revdesk.com/api/v1/webhook_subscriptions/whk_… \
  -H "Authorization: Bearer $REVDESK_API_KEY"
# → 204 No Content

Event types

call_completed fires on every call end. The disposition events below fire in addition, only on the matching outcome — subscribe to them to branch (retry, SMS fallback) without parsing call records. Answered/successful calls emit no disposition event.
event_typeFires when
new_callA call starts.
call_completedA call ends (any outcome).
call_no_answerA call ended unanswered (rang out).
call_voicemailA call reached voicemail / an answering machine.
call_busyThe destination was busy.
call_failedA call failed (declined, unreachable, carrier rejection).
contact_repliedAn inbound SMS was received.
sms_sentAn outbound SMS was accepted by the carrier.
sms_deliveredAn outbound SMS was delivered to the handset.
sms_failedAn outbound SMS failed / was undelivered.
contact_createdA new contact was created.
number_purchasedA phone number finished provisioning and went active.
number_releasedA phone number was released from your workspace.
new_appointmentA booking was created.
workflow_contact_completedA contact finished a workflow.

Delivery

Each event is a POST with a JSON body to your webhook_url. Delivery is fire-and-forget; return a 2xx quickly and do any heavy work asynchronously. Subscribe to the same event type multiple times to fan out to multiple URLs.

Payload examples

Call disposition (call_no_answer, call_voicemail, call_busy, call_failed):
{
  "id": "call_abc123",
  "from_number": "+15551234567",
  "to_number": "+15557654321",
  "direction": "outbound",
  "duration_seconds": 0,
  "status": "VOICEMAIL",
  "failure_code": "voicemail_reached",
  "failure_category": "voicemail",
  "disconnection_reason": null,
  "created_at": "2026-06-30T19:30:00.000Z"
}
Outbound SMS (sms_sent, sms_delivered, sms_failed):
{
  "id": "msg_uuid",
  "phone_number": "+15557654321",
  "from_number": "+15551234567",
  "direction": "outbound",
  "status": "delivered",
  "provider_id": "…",
  "error_message": null,
  "channel": "sms",
  "created_at": "2026-06-30T19:30:00.000Z"
}
Number lifecycle (number_purchased, number_released):
{
  "id": 4821,
  "phone_number": "+15551234567",
  "area_code": "555",
  "status": "ACTIVE",
  "organization_id": "…"
}