Skip to content
BookifyCall
Developer docs: Webhooks

Webhooks

Event subscriptions pushed to your server.

List webhook subscriptions and the available eventsLink to List webhook subscriptions and the available events

GET/webhooks

Scope
webhooks:read
curl "https://bookifycall.com/api/v1/external/webhooks" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY"
Example response · 200
{
  "success": true,
  "data": {
    "webhooks": [
      {
        "id": "00000000-0000-4000-8000-000000000008",
        "name": "CRM sync",
        "url": "https://crm.example.com/hooks/bookifycall",
        "events": [
          "call.completed",
          "call.analyzed",
          "lead.created"
        ],
        "status": "active",
        "enabled": true,
        "lastSuccessAt": "2026-01-15T16:34:10.000Z",
        "failCount": 0,
        "createdAt": "2026-01-02T10:00:00.000Z",
        "updatedAt": "2026-01-02T10:00:00.000Z",
        "hasSecret": true,
        "format": "platform"
      }
    ],
    "availableEvents": [
      "call.started",
      "call.completed",
      "call.failed",
      "call.transferred",
      "message.taken",
      "lead.created",
      "lead.status_changed",
      "appointment.booked",
      "appointment.confirmed",
      "appointment.cancelled",
      "scheduled_call.created",
      "scheduled_call.completed",
      "scheduled_call.failed",
      "call.analyzed",
      "appointment.rescheduled",
      "call.recording_ready"
    ],
    "eventAliases": {
      "call_completed": "call.completed"
    }
  }
}

Subscribe a URL to events; the signing secret is returned onceLink to Subscribe a URL to events; the signing secret is returned once

POST/webhooks

Scope
webhooks:write
Idempotency-Key
supported

Body (JSON)

namestringrequired
Up to 100 characters
urlstringrequired
eventsany[][]required
secretstring
Your signing secret; generated when omittedAt least 16 characters · Up to 256 characters
curl -X POST "https://bookifycall.com/api/v1/external/webhooks" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"name":"CRM sync","url":"https://crm.example.com/hooks/bookifycall","events":["call.completed","call.analyzed","lead.created"]}'
Example response · 201
{
  "success": true,
  "data": {
    "id": "00000000-0000-4000-8000-000000000008",
    "name": "CRM sync",
    "url": "https://crm.example.com/hooks/bookifycall",
    "events": [
      "call.completed",
      "call.analyzed",
      "lead.created"
    ],
    "enabled": true,
    "status": "active",
    "createdAt": "2026-01-02T10:00:00.000Z",
    "format": "platform",
    "secret": "3b5d0c2e9f6a4b7c8d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c",
    "secretSource": "generated"
  }
}

Remove one subscription by id, or every subscription with a urlLink to Remove one subscription by id, or every subscription with a url

DELETE/webhooks

Scope
webhooks:write
Not found
404 WEBHOOK_001

Query parameters

urlstring
idstring
curl -X DELETE "https://bookifycall.com/api/v1/external/webhooks" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY"
Example response · 200
{
  "success": true,
  "message": "Webhook removed"
}

Edit a subscription, or re-enable it with { "enabled": true }Link to Edit a subscription, or re-enable it with { "enabled": true }

PATCH/webhooks/{id}

Scope
webhooks:write
Not found
404 WEBHOOK_001

Path parameters

idstringrequired

Body (JSON)

namestring
Up to 100 characters
urlstring
eventsstring[]
enabledboolean
false = disabled; true = active (also resets the failure counter)
curl -X PATCH "https://bookifycall.com/api/v1/external/webhooks/00000000-0000-4000-8000-000000000008" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'
Example response · 200
{
  "success": true,
  "data": {
    "id": "00000000-0000-4000-8000-000000000008",
    "name": "CRM sync",
    "url": "https://crm.example.com/hooks/bookifycall",
    "events": [
      "call.completed",
      "call.analyzed",
      "lead.created"
    ],
    "status": "active",
    "enabled": true,
    "lastSuccessAt": "2026-01-15T16:34:10.000Z",
    "failCount": 0,
    "createdAt": "2026-01-02T10:00:00.000Z",
    "updatedAt": "2026-01-02T10:00:00.000Z",
    "hasSecret": true,
    "format": "platform"
  }
}

Replace the signing secretLink to Replace the signing secret

POST/webhooks/{id}/rotate-secret

Send your own secret (echoed masked) or {} to get a generated one, returned once. Applies to every delivery sent from now on.

Scope
webhooks:write
Not found
404 WEBHOOK_001

Path parameters

idstringrequired

Body (JSON)

secretstring
Your new signing secret; generated (and returned once) when omittedAt least 16 characters · Up to 256 characters
curl -X POST "https://bookifycall.com/api/v1/external/webhooks/00000000-0000-4000-8000-000000000008/rotate-secret" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Example response · 200
{
  "success": true,
  "data": {
    "id": "00000000-0000-4000-8000-000000000008",
    "secret": "9f8e7d6c5b4a39281706f5e4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a0",
    "secretSource": "generated"
  }
}

Resend failed deliveries since a dateLink to Resend failed deliveries since a date

POST/webhooks/replay

Every failed delivery of enabled subscriptions, oldest first, 500 per call; `more: true` means call again.

Scope
webhooks:write

Body (JSON)

sincestring
ISO date; replays failed deliveries created at or after it (default: 7 days ago)
endpointIdstring
Only this endpoint (it must be enabled)
curl -X POST "https://bookifycall.com/api/v1/external/webhooks/replay" \
  -H "X-API-Key: $BOOKIFYCALL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"since":"2026-10-15T00:00:00Z"}'
Example response · 200
{
  "success": true,
  "data": {
    "replayed": 3,
    "more": false
  }
}