1. Transfers
CrossFX Payment APIs
  • Guides
    • CrossFX API Documentation
    • Support & Contact
    • API Basics
    • Authentication Guide
    • FX Rates
      • FX Rates Guide
    • Corridors
      • Supported Corridors Guide
    • Banks
      • Fetching Banks List Guide
      • Fetching Bank Branches Guide
    • Sanctions
      • Sanctions Screening Guide
    • Beneficiaries
      • Create Beneficiary Guide
      • Get Beneficiary Guide
    • Transfers
      • Generate Quote Guide
      • Confirm Transfer Guide
      • Get Transfer Status Guide
    • Crypto Deposit Address
      • Crypto Deposit Address Guide
    • Payments
      • Initiate Deposit Guide
      • Initiate Payout Guide
    • Webhooks
      • Webhooks Guide
      • Webhook Subscriptions Guide
      • Webhook Events Guide
      • Webhook Delivery Attempts Guide
    • Sandbox
      • Sandbox Data & Testing Guide
  1. Transfers

Confirm Transfer Guide

CROSSFX API · TRANSFER CONFIRMATION
Turn an approved quote into a transfer.
Confirm the quoted terms, submit the sender's identity for screening, and create the transfer ready for funding.
The quote's cbtx_tracking_id remains the transfer identifier. A successful confirmation creates the transfer in pending_deposit.
Redeem quoteSender screeningCreate transferpending_deposit

How confirmation works#

Confirmation is the point at which the sender commits to the quoted terms and CrossFX creates the transfer record.
01
Use quote
cbtx_tracking_id
→
02
Submit sender
Identity details
→
03
Screen sender
Sanctions screening
→
04
Create transfer
pending_deposit
Redeems the quote
Lock the quoted terms
Confirmation turns the priced quote into a transfer at the rate that was quoted.
Screens the sender
Before funds move
Sanctions screening runs on the sender before the transfer is created.
Creates the transfer
Starts in pending_deposit
A successful response is the created transfer, ready to be funded.
Duplicate protection
Tracking ID controls creation
A confirmed quote cannot be used to create a second transfer with the same tracking ID.

Before you start#

Authentication
Use a valid bearer token
See the Authentication Guide.
Unexpired quote
Use the quote tracking ID
You need an unexpired `cbtx_tracking_id` from [Generate Quote](/36246950e0).
Sender identity
Collect the required fields
Provide the sender's `first_name`, `last_name`, and `entity_type`.

Confirm the transfer#

Confirm Transfer
Create the transfer from the quote
`POST /api/v1/transfers/confirm`

Open the API Reference for the full request and response schemas and an interactive console.
REQUEST & RESPONSE
Send the quote's cbtx_tracking_id, the beneficiary and the sender's details.

A successful response returns the created transfer with status set to pending_deposit.

Quote lifecycle#

A quote must still be valid and unused when you confirm it.
VALID + UNUSED
Confirm the quote
The priced terms are converted into a transfer and the quote is consumed.
EXPIRED
Generate a new quote
If expires_at has passed, confirmation is rejected with 400 BAD_REQUEST.
ALREADY CONFIRMED
409 CONFLICT
A transfer with the tracking ID already exists. Treat the existing transfer as authoritative rather than attempting to create another.
SINGLE USE
Confirmation consumes the quote.
Do not treat a quote as a reusable transfer template. Once it has been confirmed, use the resulting transfer record as the authoritative transaction.

Sender screening#

Sanctions screening runs as part of Confirm Transfer, before the transfer is created.
SCREENING PASSES
Transfer is created
The transfer is returned in pending_deposit and can proceed to funding.
SANCTIONS HIT
No transfer is created
A high-confidence match returns 422 SANCTIONS_HIT. No funds move and there is no transfer record to continue.
Sanctions Screening Guide
Understand screening behaviour
See the identity fields used for screening, the sanctions-hit response and how to test screening outcomes in Sandbox.

Initial transfer state#

A successful confirmation creates the transfer in pending_deposit.
TRANSFER CREATED→pending_deposit→Fund the transfer
The transfer does not advance automatically from this state. Funding must happen before the transaction can move toward payout.

Transaction legs at confirmation#

The associated settlement legs do not exist yet.
deposit_id
null
Filled when the deposit leg is created.
payout_id
null
Filled when the payout leg is created.
refund_id
null
Filled only if a refund leg is created.

Your transaction metadata#

reference, purpose, and note are fields for your own transaction context.
reference
Your correlation ID
Use your own transaction or order identifier so your team and CrossFX support can match records more easily.
purpose
Transaction context
Use the field for the transaction purpose relevant to your own workflow.
note
Additional context
Store any transaction note your integration needs to carry with the record.
Put your own correlation ID in reference. This gives support a direct way to match your transaction records to the corresponding CrossFX transfer.

Business rules#

QUOTE
Single-use
Once confirmed, the quote is consumed. A repeated confirmation does not create another transfer.
EXPIRY
Confirm before expires_at
An expired quote cannot be confirmed. Generate a new quote instead.
STATE
pending_deposit
A new transfer waits for funding and does not advance on its own.
SCREENING
Before creation
A high-confidence sender match means no transfer record is created and no funds move.

Errors#

Every error below returns the CrossFX platform error envelope, with error first and error_id last.
SUPPORT IDENTIFIER
Keep the error_id
Quote the returned error_id when contacting CrossFX support. Include the cbtx_tracking_id so the transfer attempt can be identified quickly.
HTTPcodeTriggerWhat you do
422VALIDATION_FAILEDA required field is missing, null, or the wrong typeRead error.json for the field. entity_type must be individual or entity.
422VALIDATION_FAILEDThe body carries a field the endpoint does not acceptRead error.json for the field name and remove it.
422VALIDATION_FAILEDdate_of_birth is not YYYY-MM-DDReformat the date.
404NOT_FOUNDThe quote is unknown, already consumed, or belongs to another clientGenerate a new quote.
400BAD_REQUESTThe quote has expiredGenerate a new quote.
409CONFLICTA transfer with this tracking ID already existsTreat the existing transfer as authoritative. The body names the clashing field.
422SANCTIONS_HITSender screening returned a high-confidence matchSend to compliance review. Do not retry the same identity.
503SCREENING_UNAVAILABLEScreening could not be reachedRetry with backoff.
401—The Authorization header is missing, malformed, or the token has expiredRequest a new token and retry. The body is { "message": "Unauthorized" }.

Related#

Initiate Deposit Guide
Fund the transfer
Create the funding leg once the confirmed transfer is in `pending_deposit`.
Sanctions Screening Guide
Understand sender screening
See what a sanctions match returns and how screening failures should be handled.
Modified at 2026-09-11 12:48:13
Previous
Generate Quote Guide
Next
Get Transfer Status Guide
Built with