Register a webhook
201 Created):
secret is a 64-character hex string. It is only returned on creation. Store it immediately in an environment variable or secret manager — you cannot retrieve it later.
List webhook registrations
secret is not included in list responses.
Delete a webhook registration
Portfolio Wallet events
| Event | Fires when |
|---|---|
portfolio_wallet.balance.updated | Wallet balance changes (deposits settling, yield accruing, rebalances) |
portfolio_wallet.deposit.status_changed | A deposit transitions status (confirmed → processing → completed) |
portfolio_wallet.withdrawal.status_changed | A withdrawal transitions status |
portfolio_wallet.withdrawal.payout.status_changed | A payout leg transitions status (useful for approval automation) |
portfolio_wallet.position.updated | A position’s value, weight, or rate changes |
portfolio_wallet.strategy.status_changed | A strategy update progresses or completes |
Event payloads
portfolio_wallet.balance.updated
portfolio_wallet.deposit.status_changed
portfolio_wallet.withdrawal.status_changed
portfolio_wallet.withdrawal.payout.status_changed
status is pending_customer_approval, the payload includes turnkeyActivityId — the Turnkey activity ID to approve. See Transaction Approvals for the approval flow.
portfolio_wallet.position.updated
portfolio_wallet.strategy.status_changed
Delivery and retries
- Success (
2xx): delivery complete. - Server error (
5xx) or network failure: retried with exponential backoff for up to 24 hours. - Client error (
4xx): permanent failure, not retried. Fix your endpoint and subsequent events will deliver normally. - Timeout: your endpoint must respond within 30 seconds or the delivery is treated as a failure and retried.
observedAt timestamps and resource status fields to reconcile state rather than relying on delivery order.
Delivery headers
Braid POSTs to yourcallbackUrl with these headers:
| Header | Description |
|---|---|
Content-Type | application/json |
Braid-Event-Id | Unique event identifier (use for deduplication) |
Braid-Event-Type | Event type (e.g. portfolio_wallet.balance.updated) |
Braid-Signature | HMAC signature for verification |
Signature verification
Braid uses a Stripe-style HMAC scheme:- Header format:
Braid-Signature: t=<unix_timestamp>,v1=<hex_hmac> - HMAC:
v1 = HMAC_SHA256(key = signingSecret, message = t + "." + rawBody) rawBodyis the exact request body string (beforeJSON.parse).
Node / Express example
Integration checklist
- Register a webhook and store
secretsecurely. - Verify every request with HMAC and enforce a timestamp window.
- Respond with
200quickly — process events asynchronously. - Deduplicate using
Braid-Event-Id— your endpoint may receive the same event more than once. - Log
Braid-Event-IdandBraid-Event-Typefor debugging. - Use HTTPS — Braid only delivers to HTTPS endpoints.
Next steps
- Transaction Approvals — automate Turnkey approvals from payout webhooks
- Withdraw Funds — withdrawal lifecycle and statuses
- Deposits — deposit lifecycle and statuses