KanutusDocs
kanutus.com Sign in / Create accountSign in

Webhooks and events

GET/v1/webhook-endpoints

List webhook endpoints

Permission: webhooks:write

Response 200

NameTypeDescription
data requiredobject[]
data[].id requiredstring
data[].url requiredstring
data[].events requiredstring[]
data[].status required"active" | "disabled"
data[].livemode requiredboolean
data[].created_at requiredstring

Example

curl
curl "https://api.kanutus.com/v1/webhook-endpoints" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

GET /v1/webhook-endpoints

Responses by status

200 Endpoints of this environment
200
{
  "data": [
    {
      "id": "string",
      "url": "string",
      "events": [
        "string"
      ],
      "status": "active",
      "livemode": true,
      "created_at": "string"
    }
  ]
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

POST/v1/webhook-endpoints

Create a webhook endpoint (the signing secret is returned once)

Permission: webhooks:write

Request body

NameTypeDescription
url requiredstringlength 0–2000
events required"room.started" | "room.ended" | "room.participant_joined" | "room.participant_left" | "session.started" | "session.ended" | "call.ringing" | "call.answered" | "call.voicemail" | "call.completed" | "call.failed" | "call.blocked" | "call.ended" | "meeting.created" | "meeting.updated" | "meeting.canceled" | "booking.created" | "booking.rescheduled" | "booking.canceled" | "transcript.ready" | "summary.ready" | "voice.consent_completed" | "voice.ready" | "voice.failed" | "usage.threshold" | "credential.expiring"[]
descriptionstringlength 0–200

Response 201

NameTypeDescription
id requiredstring
url requiredstring
events requiredstring[]
status required"active" | "disabled"
livemode requiredboolean
created_at requiredstring
secret requiredstringwhsec_… shown only now

Example

curl
curl -X POST "https://api.kanutus.com/v1/webhook-endpoints" \
  -H "Authorization: Bearer $KANUTUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com","events":["room.started"],"description":"string"}'
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

POST /v1/webhook-endpoints

Responses by status

201 Created
201
{
  "id": "string",
  "url": "string",
  "events": [
    "string"
  ],
  "status": "active",
  "livemode": true,
  "created_at": "string",
  "secret": "string"
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

DELETE/v1/webhook-endpoints/{id}

Delete a webhook endpoint

Permission: webhooks:write

Parameters

NameTypeDescription
id requiredpath · string

Response 200

NameTypeDescription
id requiredstring
deleted requiredtrue

Example

curl
curl -X DELETE "https://api.kanutus.com/v1/webhook-endpoints/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

DELETE /v1/webhook-endpoints/{id}

Responses by status

200 Deleted
200
{
  "id": "string",
  "deleted": true
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

404 Not found
404 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 404,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

POST/v1/webhook-endpoints/{id}/rotate-secret

Rotate the signing secret (both secrets sign for 24 h)

Permission: webhooks:write

Parameters

NameTypeDescription
id requiredpath · string

Response 200

NameTypeDescription
id requiredstring
secret requiredstring

Example

curl
curl -X POST "https://api.kanutus.com/v1/webhook-endpoints/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10/rotate-secret" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

POST /v1/webhook-endpoints/{id}/rotate-secret

Responses by status

200 New secret, shown once
200
{
  "id": "string",
  "secret": "string"
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

404 Not found
404 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 404,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

POST/v1/webhook-endpoints/{id}/test

Send a signed test event now

Permission: webhooks:write

Parameters

NameTypeDescription
id requiredpath · string

Request body

NameTypeDescription
type"room.started" | "room.ended" | "room.participant_joined" | "room.participant_left" | "session.started" | "session.ended" | "call.ringing" | "call.answered" | "call.voicemail" | "call.completed" | "call.failed" | "call.blocked" | "call.ended" | "meeting.created" | "meeting.updated" | "meeting.canceled" | "booking.created" | "booking.rescheduled" | "booking.canceled" | "transcript.ready" | "summary.ready" | "voice.consent_completed" | "voice.ready" | "voice.failed" | "usage.threshold" | "credential.expiring"default "meeting.created"

Response 200

NameTypeDescription
ok requiredboolean
status requirednumber | null
latency_ms requirednumber
delivery_id requiredstring
error requiredstring | null

Example

curl
curl -X POST "https://api.kanutus.com/v1/webhook-endpoints/8f14e45f-ceea-4c8e-9b3a-2f1d5a7c3b10/test" \
  -H "Authorization: Bearer $KANUTUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"meeting.created"}'
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

POST /v1/webhook-endpoints/{id}/test

Responses by status

200 Delivery result
200
{
  "ok": true,
  "status": 0,
  "latency_ms": 0,
  "delivery_id": "string",
  "error": "string"
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

404 Not found
404 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 404,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

GET/v1/events

Recent events (to reconcile what a webhook missed; 30 days)

Permission: events:read

Parameters

NameTypeDescription
typequery · string
sincequery · string
limitquery · integer

Response 200

NameTypeDescription
data requiredobject[]
data[].id requiredstring
data[].type requiredstring
data[].created requiredinteger
data[].livemode requiredboolean
data[].data requiredobject
data[].data.object requiredobject

Example

curl
curl "https://api.kanutus.com/v1/events" \
  -H "Authorization: Bearer $KANUTUS_API_KEY"
Try it

Runs from your browser against the real API. Use a kt_test_ key: nothing is charged. The key stays in this tab only.

GET /v1/events

Responses by status

200 Events, newest first
200
{
  "data": [
    {
      "id": "string",
      "type": "string",
      "created": 0,
      "livemode": true,
      "data": {
        "object": {}
      }
    }
  ]
}
400 Invalid request
400 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 400,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

401 Missing, invalid, expired or revoked credential
401 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 401,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

403 Missing permission, blocked or not allowed
403 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 403,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes

429 Rate limit exceeded (see RateLimit-* and Retry-After headers)
429 application/problem+json
{
  "type": "https://docs.kanutus.com/errors",
  "title": "<code>",
  "status": 429,
  "code": "<code>",
  "message": "…",
  "request_id": "req_…"
}

See all error codes