webhook.test
Fires only when someone sends a test event to this endpoint, from Send test event on the Webhooks tab or POST /api/webhooks/{webhook_id}/test. It reaches the endpoint whatever its subscription, signed and retried like every other event. Answer 2xx and drop it; the SDK receivers do.
Headers
Signature over the exact request body: t=<seconds since the Unix epoch>,v1=<lowercase hex HMAC-SHA256 of "{t}.{body}" keyed with your endpoint's signing secret>. Verify it before trusting the body, and reject a t more than five minutes from your own clock. During a secret rotation both the new and the previous secret verify for 24 hours; each delivery is signed with exactly one.
The event id, identical to the body’s id. Stable across retries and replays, and shared by every endpoint one event fans out to. Delivery is at-least-once, so dedupe on it.
Payload
Event id: evt_ plus 24 lowercase hex characters. Also sent as the SpreadSpace-Event-Id header. Stable across retries and replays, so dedupe on it.
Server-side wall-clock time the event was created, RFC 3339. Deliveries are not ordered; reconcile on this.
true for live activity, false for test mode (an ss_test_ key or the sandbox simulator). Branch on it to route test deliveries to a staging handler.
The data object on a webhook.test delivery, sent once to ONE
endpoint when someone sends it a test event, from Send test event on the
Webhooks tab or POST /api/webhooks/{webhook_id}/test.
A pointer, not a payload: the endpoint id, the time and a fixed sentence, never an id that resolves to a loan or a document, never an actor and never a url.