Webhooks
Security & delivery
The signing and delivery contract for available webhook event families.
Signing & verification
The frozen v1 contract: the signed input is the exact ASCII bytes v1:<unix-seconds>.<raw request body>, the MAC is HMAC-SHA256 encoded as lowercase hex, and it is sent in the versioned X-DStack-Signature header as t=<unix-seconds>,v1=<sig>. During a 24-hour secret-rotation overlap, two v1 signatures are sent (new + previous); accept the delivery if either verifies.
POST <your endpoint URL>
Content-Type: application/json
X-DStack-Signature: t=<unix-seconds>,v1=<lowercase-hex-hmac>
X-DStack-Event: time_entry.created
X-DStack-Delivery: evt_abc123
# Signed input (exact bytes): v1:<unix-seconds>.<raw request body>
# During a secret-rotation overlap, two v1 signatures are sent:
# X-DStack-Signature: t=<unix-seconds>,v1=<new-sig>,v1=<previous-sig>
# Accept the delivery if ANY v1 verifies.The header names, exact signed bytes, and signature encoding are frozen and covered by deterministic cross-language test vectors.
Verification & secret details
Signed timestampsecurityoptionalt= field of the signature header. Reject deliveries whose timestamp falls outside your own freshness tolerance.Replay protectionsecurityoptionalX-DStack-Delivery / envelopeevent_id): enforce a freshness window and dedupe on the id.Endpoint validationsecurityoptionalSecret rotationsecurityoptionalSecret at restsecurityoptionalIP allowlistingsecurityoptionalDelivery behavior
Retry policydesignedoptionalTimeoutdesignedoptionalDelivery orderingdesignedoptionalDuplicate deliverydesignedoptionalFailure handlingdesignedoptionalReplay / redeliverydesignedoptionalDelivery log retentionavailableoptionalAuthorization
webhooks:manage is now enforced
webhooks:manageAPI key scope — enforcedoptionalSubscription management
Enforced, but no in-product UI yet
- Register an endpoint URL (HTTPS, not a private/loopback address).
- Select which event types to receive, or subscribe to all events.
- Receive a one-time signing secret, generated at registration.
- Inspect delivery status and disable or delete the subscription when no longer needed.
Troubleshooting
Endpoint unreachable
Delivery is attempted with a 10-second timeout per try, then retried with backoff. An unreachable endpoint appears as a failed delivery attempt in the log.
Non-2xx response
Any status outside the 2xx range is treated as a failed attempt and retried (up to the max attempt count) before the delivery is marked failed.
Timeout
A request that does not complete within 10 seconds is aborted and counted as a failed attempt.
Invalid signature
Read the raw request body BEFORE parsing, reconstruct the exact signed input v1:<unix-seconds>.<raw body>, compute HMAC-SHA256 with your webhook secret, encode as lowercase hex, and constant-time compare against each v1 value in X-DStack-Signature (accept any match during a rotation overlap). Reject timestamps outside your tolerance and dedupe on the delivery id.
Duplicate event
At-least-once delivery means duplicates are possible. Use the delivery id (X-DStack-Delivery) and immutable event_id to de-duplicate on your end.
Unsupported event
A subscription can select specific event types, or subscribe to all events (empty selection). Requesting an event type outside the documented catalog is rejected by the subscription API's validation.
Disabled subscription
A subscription has an active/inactive flag; an inactive subscription receives no deliveries. There is no public UI to toggle this today (see Subscription management below).
No events received
Confirm your subscription includes the event type, is active, and the event family is available. Time Management, Work Items, and Work Item Enhance events are available; document/workflow events are still planned.
Back to the webhooks overview or the event catalog.