Cancel a Transfer

How do I cancel a funding transfer?

Overview

Cancel an in-progress funding transfer with DELETE /api/transfers/{transfer_guid}. Cancellation
is best-effort: the platform attempts to stop the transfer before it settles, but the outcome
depends on how far the transfer has already progressed at the payment provider.

A cancellation request moves an eligible transfer to the cancelling state. The transfer then
resolves to one of two terminal states — failed (cancelled successfully) or completed (the
transfer settled before the cancellation took effect).

ℹ️

API version required

This operation is available from API version 2026-04-01. Send the Accept-Version: 2026-04-01
header (or a later version) on the request. Earlier versions do not expose this operation and
return 404. See API Versioning.

Which transfers can be cancelled

Only funding transfers can be cancelled, and only while they are in an early state. The platform
accepts a cancellation request when both of these conditions are met:

ConditionCancellable values
Transfer typefunding
Transfer statestoring, pending, reviewing

This operation supports funding transfers only. Other transfer types — such as instant_funding,
book, and crypto — are not supported by this endpoint; where those types support cancellation,
they use a different flow (for example, see
Instant funding). An eligible funding transfer
must also be in storing, pending, or reviewing; one already in holding, completed, or
failed cannot be cancelled. A request against a transfer that does not meet both conditions
returns 422 transfer_not_cancellable.

Request a cancellation

Send a DELETE request with the transfer's GUID. No request body is required, and the token must
carry the transfers:execute scope:

DELETE /api/transfers/{transfer_guid}
Accept-Version: 2026-04-01
Authorization: Bearer YOUR_TOKEN
{
  "guid": "transfer_guid",
  "transfer_type": "funding",
  "customer_guid": "customer_guid",
  "quote_guid": "quote_guid",
  "asset": "USD",
  "side": "deposit",
  "state": "cancelling",
  "failure_code": null,
  "amount": 10000,
  "fee": 0
}

The 200 response returns the transfer in the cancelling state. This confirms the request was
accepted — not that the transfer was cancelled.

Best-effort cancellation and the race

cancelling is a transient state. When you request a cancellation, the platform records the
request and asks the running transfer workflow to stop. Whether the transfer can actually be
stopped depends on the payment provider, which is the final authority on the outcome.

Two outcomes are possible:

  • Cancellation succeeds — the transfer transitions from cancelling to failed with
    failure_code: cancelled.
  • Cancellation loses the race — the transfer settled at the provider before the cancellation
    took effect, so it transitions from cancelling to completed, as if it had not been
    cancelled.
⚠️

There is no cancelled transfer state

A successfully cancelled transfer ends in state: failed with failure_code: cancelled, not in
a cancelled state. Do not wait for a cancelled state — check for the terminal failed or
completed state instead.

Confirm the outcome

Because cancellation is asynchronous, confirm the terminal state after requesting it. Poll
GET /api/transfers/{transfer_guid} until the transfer leaves cancelling:

{
  "guid": "transfer_guid",
  "transfer_type": "funding",
  "state": "failed",
  "failure_code": "cancelled"
}

Alternatively, subscribe to webhooks. The platform emits a
transfer.cancelling event when the transfer enters cancelling, followed by a terminal
transfer.failed event (with failure_code: cancelled) or a transfer.completed event. There is
no transfer.cancelled event.

Errors

Statusmessage_codeMeaning
422transfer_not_cancellableThe transfer cannot be cancelled in its current state or is not an eligible funding transfer.
404not_foundNo transfer matches the supplied GUID.
403invalid_scopesThe access token is missing the required transfers:execute scope.
{
  "status": 422,
  "error_message": "Transfer cannot be cancelled in its current state",
  "message_code": "transfer_not_cancellable"
}

A 404 can also mean the request targeted an API version earlier than 2026-04-01, which does not
expose this operation. Confirm the Accept-Version header before treating a 404 as a missing
transfer.

Next steps