Skip to main content
Webhooks deliver firm-wide events to an HTTPS endpoint you control. Use them to keep your CRM, risk system, or operator dashboard in sync without polling.
The event_types accepted here are the same type strings emitted on the Firm Realtime WebSocket. Pick webhooks for durable HTTP delivery; pick the WebSocket for low-latency dashboards. Trader-facing apps consume the per-user /v1/ws stream instead.

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:
Compute:
Rules:
  • 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| > 300 seconds (replay window).
  • Compare the v1 digest in constant time.

Delivery semantics

  • At-least-once. Deduplicate on event_id (stable across JetStream redeliveries).
  • Endpoints must respond within 5 seconds with 2xx to 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 signed webhook.test event.