When to use webhooks
Use webhooks when your system needs to react to events without polling Byzantine repeatedly:- update a customer onboarding status when KYC changes;
- mark a transaction as funded, processing, completed, reverted, or failed;
- trigger internal support or compliance workflows when more information is required.
Create a subscription
Create a subscription with a public HTTPS URL and the event types you want to receive.eventTypes is omitted or empty, Byzantine subscribes the endpoint to all subscribable event types.
The create response includes the subscription and its active signing public key:
publicKey by subscription. Use it to verify delivery signatures.
Callback URL requirements
Webhook URLs must be safe for server-to-server delivery:- HTTPS only;
- DNS hostname required;
- no IP literals;
- no localhost or internal hostnames;
- no username/password in the URL;
- no URL fragments;
- DNS must resolve to public/global IP addresses.
Event types
Subscribable customer events:customer.createdcustomer.updatedcustomer.under_reviewcustomer.awaiting_informationcustomer.awaiting_associated_person_informationcustomer.resubmission_requestedcustomer.activecustomer.rejected
transaction.createdtransaction.waiting_for_fundstransaction.payment_in_reviewtransaction.funds_in_transfertransaction.funds_receivedtransaction.processingtransaction.completedtransaction.simulation_failedtransaction.reverted
webhook.test is used for test deliveries and is not directly subscribable.
Delivery payload
Each delivery body is JSON. The exactdata object depends on the event type.
Delivery signatures
Byzantine signs every delivery using ECDSA P-256 with SHA-256. Each request includes these headers:| Header | Description |
|---|---|
X-Byzantine-Webhook-Delivery-Id | Unique delivery attempt target id. Use for idempotency and debugging. |
X-Byzantine-Webhook-Event-Id | Event id for the underlying lifecycle event. |
X-Byzantine-Webhook-Timestamp | Unix timestamp in seconds. |
X-Byzantine-Webhook-Key-Id | Signing key id associated with the subscription. |
X-Byzantine-Webhook-Algorithm | Always ECDSA_P256_SHA256. |
X-Byzantine-Webhook-Signature | Hex-encoded ECDSA signature. |
- verify the exact raw request bytes; do not parse and re-serialize JSON before verification;
- reject timestamps outside your replay tolerance window; Byzantine’s receiver helper uses 300 seconds;
- verify
X-Byzantine-Webhook-AlgorithmisECDSA_P256_SHA256; - decode
publicKeyas a hex-encoded compressed SEC1 P-256 public key; - decode
X-Byzantine-Webhook-Signatureas hex. Byzantine emits a 64-byte ECDSA signature inr || sform.
Retries
A delivery succeeds when your endpoint returns any2xx HTTP status. Non-2xx responses and transport failures are retried automatically.
Automatic retry schedule:
| Attempt after first failure | Delay |
|---|---|
| 1 | 30 seconds |
| 2 | 60 seconds |
| 3 | 5 minutes |
| 4 | 30 minutes |
| 5 | 2 hours |
| 6 | 6 hours |
Test deliveries
Use the test endpoint to send awebhook.test event to a subscription before relying on production lifecycle events.
Endpoint reference
See API endpoints > Webhooks for request and response schemas for:POST /v1/webhooks/subscriptionsGET /v1/webhooks/subscriptionsPATCH /v1/webhooks/subscriptions/{subscription_id}DELETE /v1/webhooks/subscriptions/{subscription_id}POST /v1/webhooks/subscriptions/{subscription_id}/testGET /v1/webhooks/deliveriesPOST /v1/webhooks/deliveries/{delivery_id}/retry

