Skip to main content
OpenFX delivers a signed webhook event when a withdrawal transitions to a notable state. Three event types cover the withdrawal lifecycle:
  • withdrawal.processing — the withdrawal has been accepted and is moving through the payment rail.
  • withdrawal.completed — the withdrawal has settled successfully.
  • withdrawal.failed — the withdrawal has reached a terminal failure state.
All three event types carry a single Withdrawal object in data that follows the same field conventions as v3 REST API responses — camelCase fields, string amounts, RFC 3339 timestamps. The data object matches what GET /v3/fx/withdrawals/{id} returns for the same record.

Event envelope

This routing-only example collapses data to an empty object. It deliberately omits the required Withdrawal fields shown in the complete, schema-checked examples below.

Payload

status is an unconstrained string reflecting the current lifecycle state (no closed enum is documented) — observed values include PENDING, PROCESSING, COMPLETED, FAILED, RETURNED, and CANCELED. The webhook catalog ships withdrawal.processing, withdrawal.completed, and withdrawal.failed events; the v3 API surfaces the same record with a matching status via GET /v3/fx/withdrawals/{id}.

Withdrawal resource fields

Idempotency on your side

Same pattern as deposit webhooks — use the event id for dedup. See Deposit webhooks: idempotency on your side.

Failed withdrawals

When a withdrawal terminates as FAILED, the withdrawal.failed event is delivered with data.status: "FAILED". If you need the latest state — for example to confirm a subsequent RETURNED, or after a missed delivery — re-fetch with GET /v3/fx/withdrawals/{id} using the id from data.id. See Withdrawal lifecycle: when a withdrawal is stuck for the triage runbook.

Verification

Every event is signed in the X-OpenFX-Signature header using HMAC-SHA256 over the signed payload timestamp + "." + raw_body. Always verify with a constant-time comparator before reading any payload field. See Webhook authentication.

What’s next

Webhook authentication

Signature verification with constant-time comparators.

Deposit webhooks

The other side of the deposit/withdrawal lifecycle.

Withdrawal lifecycle

State machine + stuck-withdrawal runbook.

Errors

Stable error codes and the retry triage matrix.