> ## Documentation Index
> Fetch the complete documentation index at: https://docs.repixa.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook

# Webhook Events

When a subscribed event fires, Repixa sends a `POST` request to your registered webhook URL with a JSON payload.

## Registering a webhook

```bash theme={null}
POST https://api.repixa.io/v1/webhooks
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{
  "url": "https://yourapp.com/webhooks/repixa",
  "events": ["demo.completed", "lead.hot", "meeting.booked"]
}
```

## Available events

| Event             | Trigger                                  |
| ----------------- | ---------------------------------------- |
| `demo.completed`  | A prospect finished a full demo session  |
| `demo.abandoned`  | A prospect dropped off before completing |
| `lead.hot`        | Laura detected strong buying signals     |
| `meeting.booked`  | A follow-up meeting was scheduled        |
| `contact.created` | A new prospect contact was captured      |

## Payload structure

All events share this base structure:

```json theme={null}
{
  "event": "demo.completed",
  "timestamp": "2026-05-20T14:32:00Z",
  "data": { ... }
}
```

### `demo.completed`

```json theme={null}
{
  "event": "demo.completed",
  "timestamp": "2026-05-20T14:32:00Z",
  "data": {
    "session_id": "ses_01hx...",
    "agent_id": "agt_01hx...",
    "contact": {
      "name": "Jane Smith",
      "email": "jane@startup.io",
      "company": "Startup Inc."
    },
    "duration_seconds": 742,
    "intent_score": 82,
    "meeting_booked": true,
    "replay_url": "https://app.repixa.io/sessions/ses_01hx..."
  }
}
```

### `lead.hot`

```json theme={null}
{
  "event": "lead.hot",
  "timestamp": "2026-05-20T14:28:00Z",
  "data": {
    "session_id": "ses_01hx...",
    "agent_id": "agt_01hx...",
    "contact": {
      "name": "Jane Smith",
      "email": "jane@startup.io",
      "company": "Startup Inc."
    },
    "signals": {
      "interest": 90,
      "buying_signals": 5,
      "objections": 1
    }
  }
}
```

### `meeting.booked`

```json theme={null}
{
  "event": "meeting.booked",
  "timestamp": "2026-05-20T14:33:00Z",
  "data": {
    "session_id": "ses_01hx...",
    "contact": {
      "name": "Jane Smith",
      "email": "jane@startup.io"
    },
    "meeting": {
      "scheduled_at": "2026-05-22T14:00:00Z",
      "calendar_link": "https://cal.com/your-team/demo"
    }
  }
}
```

## Verifying webhook signatures

Repixa signs every webhook payload with an `X-Repixa-Signature` header. Verify it to ensure the request came from Repixa:

```js theme={null}
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return `sha256=${expected}` === signature;
}
```

Your webhook secret is shown once when you register the webhook. Store it securely.

## Responding to webhooks

Return a `2xx` status within **5 seconds** to acknowledge receipt. Repixa retries up to **3 times** with exponential backoff if your endpoint fails or times out.
