Skip to main content

Available Events

EventDescription
note.createdA new note has been created (recording synced)
note.processedProcessing complete — transcript, summary, and action items are ready
recording.readyA raw recording has been uploaded and is available
action_item.createdA new action item was extracted from a recording

Create Webhook

POST /v1/webhooks
Register a new webhook endpoint.
url
string
required
HTTPS endpoint to receive events
events
string[]
required
Event types to subscribe to
secret
string
Signing secret for payload verification
Request
curl -X POST https://api.ruune.ai/v1/webhooks \
  -H "Authorization: Bearer ruune_sk_live_xxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/hooks/ruune",
    "events": ["note.processed", "action_item.created"],
    "secret": "whsec_my_signing_secret"
  }'
Response
{
  "id": "wh_abc",
  "url": "https://example.com/hooks/ruune",
  "events": ["note.processed", "action_item.created"],
  "active": true,
  "created_at": "2026-06-01T00:00:00Z"
}

List Webhooks

GET /v1/webhooks
List all registered webhooks.
Response
{
  "data": [
    {
      "id": "wh_abc",
      "url": "https://example.com/hooks/ruune",
      "events": ["note.processed", "action_item.created"],
      "active": true
    }
  ]
}

Delete Webhook

DELETE /v1/webhooks/:id
Delete a webhook subscription.
Response
{ "deleted": true }

Payload Verification

If you provide a secret when creating a webhook, every delivery includes a X-Ruune-Signature header containing an HMAC-SHA256 signature of the raw request body.
Verify Signature (Node.js)
import crypto from "crypto";

function verifyWebhook(body, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}
Webhook deliveries timeout after 10 seconds. If your endpoint returns a non-2xx status, we retry up to 3 times with exponential backoff.