RankLadder Help

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/hooks

Body:

{
  "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/hooks

Response:

{
  "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"
  }
}