event_type, and open that event’s page for the shape of data.
Read the envelope
Every webhook request body is this envelope, and every WebSocket event frame carries the same envelope in itsevent field. Only data changes between event types. Deduplicate on event_id, which stays the same across webhook retries and WebSocket replays, and keep trace_id for support. This one carried a message.failed event:
captured-output
Choose an event type
Subscribe to the events your backend acts on and ignore the rest; a webhook subscription names them insubscribed_events, and a WebSocket consumer receives all of them. Most agents need message.received first and chat.created second.
List event types
Read the names the API accepts insubscribed_events. The list is the contract, so check a new name here before you add it to a subscription:
What you get back
Relay answers200 with every event name and the URL of this catalog. The order matches the table above, and the list changes only with a new API contract version:
captured-output
When it fails
A401 means the Agent Token is missing or revoked. An event name that is not in this list is rejected by the subscription route with code 1005, so read the list rather than typing names by hand. If an event you subscribed to never arrives, read delivery and retries before assuming it did not fire.

