Practice delivery semantics on one machine.
The sandbox signs credential-revocation events, retries bounded transient failures, supports replay, and suppresses receiver duplicates. Every part is development-only.
Durable production subscriptions, delivery, retry, replay, and audit history are unavailable. There is no deployed public webhook endpoint or production signing secret.
Implemented event
| Field | Current value | Meaning |
|---|---|---|
schema | casset.webhook-event.v1 | Exact event body schema. |
type | credential.revoked | The only emitted event type. |
apiVersion | 2026-07-19.sandbox | Local sandbox event version. |
| Body | Immutable JSON for one event ID | Replay preserves the same event and exact body. |
Delivery headers
x-casset-event-id— immutable event identifier.x-casset-delivery-id— new for each original delivery or replay.x-casset-webhook-id— identifies the local subscription inside the sandbox.x-casset-signature—t=<timestamp>,v1=<sha256-hmac>.
These identifiers may be used inside the local receiver's duplicate logic, but they are not a recommendation to log App IDs, credential prefixes, webhook secrets, exact bodies, or receiver query strings.
Verify before parsing
- Read at most 128 KiB of UTF-8 request data.
- Parse the signature header and reject timestamps outside the five-minute window.
- Compute HMAC-SHA256 over
timestamp + "." + exactBody. - Compare the signature in constant time.
- Only then parse the exact event schema and compare body/header identifiers.
Retry policy
| Outcome | Retry | Recorded outcome |
|---|---|---|
| 2xx | No | SUCCESS |
| 408, 425, 429, or 500+ | Yes | HTTP_TRANSIENT |
| Other non-2xx | No | HTTP_TERMINAL |
| Network failure | Yes | NETWORK |
| No response within 2 seconds | Yes | TIMEOUT |
- Maximum three total attempts.
- Two-second timeout per attempt.
- Deterministic waits of 25 ms and then 50 ms.
- No production-scale delivery guarantee is implied.
Replay and duplicate suppression
Replay keeps the event ID and exact body, then creates a new delivery ID. The receiver returns whether it has already seen that delivery or event. Concurrent replay requests with one idempotency key resolve to one local delivery result.
Read Retries to compare webhook behavior with SDK GET retries, or Sandbox for one-time credentials and revocation.