Endpoints
Event types
Canonical{entity}.{event} strings (same as firm-ws FirmEventType):
Empty
event_types on create means all events.
Payload shape
created_at is unix time in milliseconds. data is the publisher payload from the firm stream.
Signature
Every webhook request includes:- Use the signing secret shown once at webhook creation (
whsec_…). - Verify against the raw request body bytes — do not parse and reserialize JSON, and do not append a trailing newline.
- Reject if
|now - t| > 300seconds (replay window). - Compare the
v1digest in constant time.
Delivery semantics
- At-least-once. Deduplicate on
event_id(stable across JetStream redeliveries). - Endpoints must respond within 5 seconds with
2xxto ack. - Failed deliveries are retried via JetStream redelivery up to
MaxDeliver(~10). A longer 24h exponential outbox is planned later. - Use Send test in Firm Admin → Developers → Webhooks (or
POST /v1/firm-control/webhooks/test) to verify your receiver with a signedwebhook.testevent.

