How webhooks work
Instead of polling the API for changes, you can register a webhook endpoint to receive HTTP POST notifications in real time when events occur — such as when a meeting completes, a transcript is ready, or an action item is created.Setting up a webhook
Create a webhook subscription
Response
Your webhook URL must be publicly accessible and support HTTPS. HTTP endpoints are rejected in production.
Manage webhook subscriptions
| Action | Method | Endpoint |
|---|---|---|
| List all webhooks | GET | /v1/webhooks |
| Get a webhook | GET | /v1/webhooks/:id |
| Create a webhook | POST | /v1/webhooks |
| Update a webhook | PATCH | /v1/webhooks/:id |
| Delete a webhook | DELETE | /v1/webhooks/:id |
Webhook payload format
Every webhook delivery sends a JSON payload with the following structure:| Field | Type | Description |
|---|---|---|
id | string | Unique event ID. Use this for idempotency. |
type | string | The event type. |
created_at | string | ISO 8601 timestamp of when the event occurred. |
data | object | Event-specific payload. Contents vary by event type. |
Signature verification
Every webhook request includes a signature in theX-Mavio-Signature header. Always verify this signature to confirm the request came from Mavio and was not tampered with.
The signature is an HMAC-SHA256 hash of the raw request body, computed using the webhook secret you provided when creating the subscription.
Verification steps
- Read the raw request body (before any JSON parsing).
- Read the
X-Mavio-Signatureheader. - Compute the HMAC-SHA256 of the body using your webhook secret.
- Compare the computed signature with the header value using a constant-time comparison.
Retry policy
If your endpoint does not respond with a2xx status code within 10 seconds, Mavio will retry the delivery with exponential backoff:
| Attempt | Delay after failure |
|---|---|
| 1st retry | 30 seconds |
| 2nd retry | 2 minutes |
| 3rd retry | 10 minutes |
| 4th retry | 1 hour |
| 5th retry | 6 hours |
Automatic disabling
If your endpoint fails to respond successfully for 72 consecutive hours, the webhook subscription is automatically disabled and you are notified by email. Re-enable it from the dashboard once the issue is resolved.Best practices
Respond quickly
Respond quickly
Return a
200 OK immediately after receiving the webhook and process the event asynchronously. Long-running processing should happen in a background job.Handle duplicates
Handle duplicates
Use the
id field for idempotency. In rare cases (network issues, retries), you may receive the same event more than once. Track processed event IDs to avoid duplicate handling.Verify signatures
Verify signatures
Always validate the
X-Mavio-Signature header. Reject any requests with invalid or missing signatures.Use a dedicated endpoint
Use a dedicated endpoint
Create a dedicated URL path for Mavio webhooks (e.g.,
/webhooks/mavio). This makes it easier to apply authentication, logging, and rate limiting specific to webhook traffic.