Payout webhook events
A payout fires a webhook when it reaches a terminal state. Subscribe to these instead of polling so your ledger updates the moment a transfer settles.
| Event | What it means |
|---|---|
payout.confirmed | The transaction landed on-chain |
payout.failed | Broadcast could not complete |
payout.expired | The payout expired, or was rejected while pending |
All three share the standard Stridge webhook envelope — id, type, time, version, signed with HMAC SHA-256. The payloads below are the inner payload object.
Subscribing
Register an endpoint in the dashboard and opt into the payout event types. Always verify the webhook-signature before trusting the body — see Verify signature for example code in Node.js, Go, and Python.
payout.confirmed
Fires when the payout's transaction confirms on-chain. The payload is the full payout record, with status: "confirmed", the on-chain tx_id, and confirmed_at populated.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"vault_id": "550e8400-e29b-41d4-a716-446655440001",
"asset": "USDT",
"network_symbol": "ethereum",
"amount": "100.50",
"usd_amount": "100.50",
"rate": "1.0001",
"to_address": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"reference_id": "order-12345",
"remark": "Payment for order #12345",
"status": "confirmed",
"tx_id": "0xabc123def456789",
"error": "",
"created_at": "2026-01-01T00:00:00Z",
"confirmed_at": "2026-01-01T00:05:00Z",
"expired_at": "2026-12-31T23:59:59Z"
}| Field | Type | Notes |
|---|---|---|
id | string | Payout id |
vault_id | string | Vault the funds left from |
asset | string | Asset sent |
network_symbol | string | Network the transfer executed on |
amount | string | Crypto amount sent |
usd_amount | string | USD value at submit time |
rate | string | Conversion rate applied (when usd_amount was used) |
to_address | string | External destination |
reference_id | string | Your idempotency key, echoed back |
remark | string | The note you attached, if any |
status | enum | confirmed for this event |
tx_id | string | On-chain transaction hash |
confirmed_at | string | Confirmation timestamp |
payout.failed
Fires when the transfer can't be completed. Identical shape to payout.confirmed, but status is failed and error carries a human-readable reason. tx_id may be empty if nothing was broadcast.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"vault_id": "550e8400-e29b-41d4-a716-446655440001",
"asset": "USDT",
"network_symbol": "ethereum",
"amount": "100.50",
"to_address": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"reference_id": "order-12345",
"status": "failed",
"tx_id": "",
"error": "insufficient balance",
"created_at": "2026-01-01T00:00:00Z"
}| Field | Type | Notes |
|---|---|---|
status | enum | failed for this event |
error | string | Human-readable failure reason |
tx_id | string | Empty when nothing was broadcast |
payout.expired
Fires when a payout passes its expired_at without confirming, or when you reject a pending payout. status is expired.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"vault_id": "550e8400-e29b-41d4-a716-446655440001",
"asset": "USDT",
"network_symbol": "ethereum",
"amount": "100.50",
"to_address": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
"reference_id": "order-12345",
"status": "expired",
"tx_id": "",
"error": "",
"created_at": "2026-01-01T00:00:00Z",
"expired_at": "2026-12-31T23:59:59Z"
}Match webhooks to your records on reference_id — it's the id you sent on
create, so you never need to store Stridge's internal payout id to
reconcile.
Next
- Payouts — the payout model and lifecycle.
- Verify signature — validate the
webhook-signatureheader. - Server setup — the delivery envelope and retry behavior.