messages:read; a conversation subscription requires conversations:read. Expiry, revocation, or disabling the application stops delivery.message.created and message.updated events are available through both the API and settings UI. An attachment added after the initial message produces message.updated. Private notes, deleted messages, and internal activity messages are excluded. Events are captured transactionally with model writes after the subscription is created. Writes that bypass Rails callbacks do not emit events. Poll the API to reconcile state when necessary.123456789{ "id": "evt_example", "type": "message.received", "api_version": "v2", "account_id": "acct_example", "occurred_at": "2026-10-21T12:00:00.000000Z", "created_at": "2026-10-21T12:00:00.000000Z", "data": { "id": "msg_example", "conversation_id": "con_example", "connection_id": "conn_example" } }
data contains the corresponding v2 resource representation; the example above abbreviates it. Events are snapshots, may arrive out of order, and may be repeated. Use the event id for deduplication and GET the resource for current state. Legacy account and bot webhooks continue using their existing payloads.Ruut-Webhook-Id: stable delivery identifier.Ruut-Webhook-Timestamp: Unix timestamp in seconds for this attempt.Ruut-Webhook-Signature: v1= followed by a hex HMAC-SHA256 digest.timestamp + "." + raw_request_body using the signing secret. Compare it in constant time before parsing or processing the payload. Reject timestamps outside a short tolerance such as five minutes, synchronize your server clock, and deduplicate the event ID. Never recreate the signed bytes by serializing parsed JSON.2xx response promptly after durably accepting the event. Process domain work asynchronously.429, and 5xx responses up to five attempts with exponential delays. Other HTTP failures are terminal. Redirects are not followed. Local, private, and mixed public/private DNS destinations are blocked; delivery pins the validated address and verifies TLS for the original hostname.unknown) deliveries can be replayed manually; replay preserves the event and delivery IDs. Receivers must deduplicate even if the earlier outcome was uncertain.unknown for manual review. Delivery records and payloads are retained for 30 days; replay uses the original snapshot and targets the endpoint's current URL and signing secret.webhook.test and contain no customer data./api/v2/webhook-endpoints with webhooks:manage to create, list, read, update, or disable endpoints. Supply url, events, and optional connection_ids. Subscriptions remain inside the key's inbox and read permissions. The create response returns the signing secret; list and get responses do not./api/v2/webhook-deliveries for delivery records and attempts. POST to /api/v2/webhook-deliveries/{delivery_id}/replays to replay exhausted work with the same event and delivery IDs. Every mutation requires Idempotency-Key./api/v2/webhook-endpoints/{endpoint_id}/secret-rotations to rotate with a 24-hour verification overlap. API-managed deliveries also include X-Ruut-Signature containing t=TIMESTAMP,v1=DIGEST; during overlap it includes signatures for both secrets. The legacy Ruut-Webhook-* signature headers remain available.