Webhook triggers
Subscribe your own URL to RankLadder events like new conversations, missed calls, and new contacts using REST Hooks.
RankLadder pushes events to your systems with a REST Hooks model: you subscribe a URL to an event type, and RankLadder POSTs a JSON payload to that URL every time the event happens. This is the same mechanism the Zapier and Make apps use under the hood.
All endpoints require authentication.
Subscribe
POST /api/v1/hooksBody:
{
"event": "new_conversation",
"target_url": "https://example.com/rankladder-hook"
}target_url must be HTTPS. Response:
{ "id": "d4e5f6a7-0000-4000-8000-000000000000" }Keep the id if you want to unsubscribe later.
Example:
curl -X POST https://app.rankladder.app/api/v1/hooks \
-H "Authorization: Bearer rl_zapier_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"event": "missed_call", "target_url": "https://example.com/rankladder-hook"}'Errors: an unknown event type returns 400 with { "error": "invalid_event" }; a missing, unparseable, or non-HTTPS URL returns 400 with { "error": "invalid_target_url" }.
List subscriptions
GET /api/v1/hooksResponse:
{
"hooks": [
{
"id": "d4e5f6a7-0000-4000-8000-000000000000",
"event_type": "missed_call",
"target_url": "https://example.com/rankladder-hook",
"created_at": "2026-08-05T12:00:00Z"
}
]
}Unsubscribe
DELETE /api/v1/hooks/{id}Response: { "ok": true }.
Revoking your API key also deletes every subscription it created.
Delivery
RankLadder sends one POST to each subscribed URL with Content-Type: application/json:
{
"event": "missed_call",
"data": { "...": "event fields, see below" }
}Delivery is at most once. If your endpoint is down or returns an error, that delivery is not retried.
Event types
new_conversation
Fires when a phone call finishes, whether the AI answered it or it went to voicemail. Spam calls and immediate hang-ups are excluded. Voice calls only today: text and website chat conversations do not fire this event yet.
{
"event": "new_conversation",
"data": {
"conversation_id": "a1b2c3d4-0000-4000-8000-000000000000",
"channel": "voice",
"caller_name": "Sam Alvarez",
"caller_number": "+15035551234",
"summary": "Caller asked about weekend appointment availability."
}
}missed_call
Fires when the call went to voicemail. Same payload fields as new_conversation. A voicemail call fires both events, so subscribe to only one of them if you do not want two deliveries for the same call.
{
"event": "missed_call",
"data": {
"conversation_id": "a1b2c3d4-0000-4000-8000-000000000000",
"channel": "voice",
"caller_name": "Sam Alvarez",
"caller_number": "+15035551234",
"summary": "Caller left a voicemail about a leaking water heater."
}
}new_contact
Fires when a new contact is created in RankLadder, whether synced in from a connected CRM or created through the create-contact action. source is the provider that created the contact, for example jobber, square, zapier, or make.
{
"event": "new_contact",
"data": {
"contact_id": "b2c3d4e5-0000-4000-8000-000000000000",
"name": "Sam Alvarez",
"phone": "+15035551234",
"source": "jobber"
}
}