Unique event id — STABLE ACROSS RETRIES. Deduplicate on it: seeing the same id twice means a redelivery, not a new event.
Event name, e.g. async_consult.assigned.
When the event occurred.
Your partner id (useful when one endpoint serves several keys).
Event-specific payload — see the WebhookEvent union.
The delivery envelope every webhook body conforms to, before narrowing by
type. Prefer consuming WebhookEvent (the discriminated union); this generic shape exists for logging/storage layers that don't care which event they hold.