Use cases

What you can build

Every payment is one origin leg and one destination leg. Pick where the money comes from and where it goes — this page lists every rail available on each side, and the exact fields each one needs. Whether a specific origin → destination pair is enabled for your workspace is a separate question: ask GET /v1/pairs.

14 currencies you can hold 31 currencies you can collect 32 payout rails

Start here: the four combinations below are the whole API surface. Once you know which one you need, jump to its section — then use the reference tables at the bottom for the exact fields of your currency and rail.

How this fits together

Every payment is one origin leg and one destination leg. Each leg is either a rail (money moving in the real world) or a balance (funds already sitting in your workspace). Those two choices decide everything — which endpoints you call, and which fields you send.

OriginDestinationWhat it isEndpoints
railbalanceCollect — a pay-in that credits your balancePOST /v1/depositsCollect →
railrailCross-border payment — collect in one currency, pay out in another. Fiat → crypto is an on-ramp; crypto → fiat an off-rampPOST /v1/quotes then POST /v1/ordersPay across borders →
balancebalanceExchange — convert between two currencies you holdPOST /v1/quotes then POST /v1/ordersExchange →
balancerailWithdraw — a stand-alone payout from your balancePOST /v1/withdrawalsWithdraw →

Settlement between the two legs is handled internally and never appears in your request. You describe the two ends; the platform routes the middle.

The one rule that catches people out

A balance only exists for currencies the platform can hold. That is 14 of them — AVAX BNB BTC CUSD ETH EUR GBP POL SOL TRX USD USDC USDT XRP.

The other 17 collection currencies — ARS BOB BRL BWP CLP COP KES MWK MXN NGN RWF TWD TZS UGX XAF XOF ZMW — are collect-and-convert only. There is no ARS balance to credit, so POST /v1/deposits does not apply to them. You collect them as the origin leg of an order, which converts in the same operation.

Rule of thumb: can you hold it? Yes → a deposit is available. No → use an order and convert it on the way in.

1 · Collect into a balance

rail → balance. A deposit hands the payer instructions, waits for the money, and credits your balance in the same currency. Available for the 14 currencies you can hold — pick yours below for the request, the response to expect, and the sandbox simulation.

userData identifies the payer. For an individual, firstName, userEmail and country are required; add businessName for a business and the type is inferred. Corridors that verify identity need more — discover a corridor’s intake with GET /v1/currencies/{currency}/identity-schema?direction=payin&entityType=individual.

AVAX crypto · no payer identity

1 · Ask for instructions. rail: Required. One of AVALANCHE — it selects the network the payer sends on.

POST /v1/deposits — collect AVAX
{
  "currency": "AVAX",
  "rail": "AVALANCHE",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "AVAX",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "AVALANCHE"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the AVAX balance is credited, and deposit_completed fires.

BNB crypto · no payer identity

1 · Ask for instructions. rail: Required. One of BSC — it selects the network the payer sends on.

POST /v1/deposits — collect BNB
{
  "currency": "BNB",
  "rail": "BSC",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "BNB",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "BSC"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the BNB balance is credited, and deposit_completed fires.

BTC crypto · no payer identity

1 · Ask for instructions. rail: Required. One of BTC — it selects the network the payer sends on.

POST /v1/deposits — collect BTC
{
  "currency": "BTC",
  "rail": "BTC",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "BTC",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "BTC"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the BTC balance is credited, and deposit_completed fires.

CUSD crypto · no payer identity

1 · Ask for instructions. rail: Required. One of CELO — it selects the network the payer sends on.

POST /v1/deposits — collect CUSD
{
  "currency": "CUSD",
  "rail": "CELO",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "CUSD",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "CELO"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the CUSD balance is credited, and deposit_completed fires.

ETH crypto · no payer identity

1 · Ask for instructions. rail: Required. One of ETH — it selects the network the payer sends on.

POST /v1/deposits — collect ETH
{
  "currency": "ETH",
  "rail": "ETH",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "ETH",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "ETH"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the ETH balance is credited, and deposit_completed fires.

EUR fiat · payer identity required

1 · Ask for instructions. rail: Optional. Omit it and the platform selects this currency’s collection rail. Discover the available payin methods with GET /v1/currencies/EUR/payin-schema. This is the one currency where omitting amount is allowed (an open-amount collection); every other currency requires it.

POST /v1/deposits — collect EUR
{
  "currency": "EUR",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo carries the pay-in instructions in the shape this currency’s rail uses. Give the payer both the account details and the referenceCode — the reference is how the inbound transfer is matched back to this deposit.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "EUR",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "SEPA",
    "accountHolder": "VirtuaBroker",
    "iban": "ES9121000418450200051332",
    "bic": "CAIXESBBXXX",
    "bankName": "Example Bank",
    "amount": 1000,
    "referenceCode": "VB-8F3K2P"
  }
}

3 · Simulate the payer in sandbox. Fiat uses counterparty; sending fromAddress is rejected. EUR requires iban alongside name.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "counterparty": {
    "name": "Payer Name",
    "iban": "ES9121000418450200051332"
  }
}

The deposit moves PendingReceived, the EUR balance is credited, and deposit_completed fires.

GBP fiat · payer identity required

1 · Ask for instructions. rail: Optional. Omit it and the platform selects this currency’s collection rail. Discover the available payin methods with GET /v1/currencies/GBP/payin-schema.

POST /v1/deposits — collect GBP
{
  "currency": "GBP",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo carries the pay-in instructions in the shape this currency’s rail uses. Give the payer both the account details and the referenceCode — the reference is how the inbound transfer is matched back to this deposit.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "GBP",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "GBP_BANK_TRANSFER",
    "accountHolder": "VirtuaBroker",
    "accountNumber": "12345678",
    "sortCode": "040075",
    "bankName": "Example Bank",
    "amount": 1000,
    "referenceCode": "VB-8F3K2P"
  }
}

3 · Simulate the payer in sandbox. Fiat uses counterparty; sending fromAddress is rejected. GBP requires accountNumber alongside name.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "counterparty": {
    "name": "Payer Name",
    "accountNumber": "12345678"
  }
}

The deposit moves PendingReceived, the GBP balance is credited, and deposit_completed fires.

POL crypto · no payer identity

1 · Ask for instructions. rail: Required. One of MATIC — it selects the network the payer sends on.

POST /v1/deposits — collect POL
{
  "currency": "POL",
  "rail": "MATIC",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "POL",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "MATIC"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the POL balance is credited, and deposit_completed fires.

SOL crypto · no payer identity

1 · Ask for instructions. rail: Required. One of — it selects the network the payer sends on.

POST /v1/deposits — collect SOL
{
  "currency": "SOL",
  "rail": "",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "SOL",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": ""
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the SOL balance is credited, and deposit_completed fires.

TRX crypto · no payer identity

1 · Ask for instructions. rail: Required. One of TRON — it selects the network the payer sends on.

POST /v1/deposits — collect TRX
{
  "currency": "TRX",
  "rail": "TRON",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "TRX",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "TRON"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the TRX balance is credited, and deposit_completed fires.

USD fiat · payer identity required

1 · Ask for instructions. rail: Optional. Omit it and the platform selects this currency’s collection rail. Discover the available payin methods with GET /v1/currencies/USD/payin-schema.

POST /v1/deposits — collect USD
{
  "currency": "USD",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo carries the pay-in instructions in the shape this currency’s rail uses. Give the payer both the account details and the referenceCode — the reference is how the inbound transfer is matched back to this deposit.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "USD",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "ACH_US",
    "beneficiaryName": "VirtuaBroker",
    "routingNumber": "021000021",
    "accountNumber": "1234567890",
    "bankName": "Example Bank",
    "amount": 1000,
    "referenceCode": "VB-8F3K2P"
  }
}

3 · Simulate the payer in sandbox. Fiat uses counterparty; sending fromAddress is rejected. USD requires accountNumber alongside name.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "counterparty": {
    "name": "Payer Name",
    "accountNumber": "12345678"
  }
}

The deposit moves PendingReceived, the USD balance is credited, and deposit_completed fires.

USDC crypto · no payer identity

1 · Ask for instructions. rail: Required. One of ARBITRUM BASE BSC ETH MATIC — it selects the network the payer sends on.

POST /v1/deposits — collect USDC
{
  "currency": "USDC",
  "rail": "ARBITRUM",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "USDC",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "ARBITRUM"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the USDC balance is credited, and deposit_completed fires.

USDT crypto · no payer identity

1 · Ask for instructions. rail: Required. One of BSC ETH MATIC TRON — it selects the network the payer sends on.

POST /v1/deposits — collect USDT
{
  "currency": "USDT",
  "rail": "BSC",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "USDT",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "BSC"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the USDT balance is credited, and deposit_completed fires.

XRP crypto · no payer identity

1 · Ask for instructions. rail: Required. One of XRP — it selects the network the payer sends on.

POST /v1/deposits — collect XRP
{
  "currency": "XRP",
  "rail": "XRP",
  "amount": 1000,
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES"
  }
}

2 · What comes back. depositInfo.depositType is CRYPTO — an address on the network you chose. Send the payer there.

201 · response
{
  "depositId": "dep_8f0c1b2a3d4e",
  "status": "Pending",
  "currency": "XRP",
  "expectedAmount": 1000,
  "amount": 0,
  "depositInfoPending": false,
  "depositInfo": {
    "depositType": "CRYPTO",
    "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "network": "XRP"
  }
}

3 · Simulate the payer in sandbox. Crypto uses fromAddress; sending counterparty is rejected.

POST /v1/simulate/incoming-transfer/deposit
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "scenario": "success",
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

The deposit moves PendingReceived, the XRP balance is credited, and deposit_completed fires.

When depositInfoPending is true the instructions are still being provisioned. Poll the deposit or wait for deposit_method_activated before showing anything to the payer. Each card’s step 3 simulates the payer in sandbox — the full contract is in Sandbox & simulation.

2 · Pay across borders

rail → rail. One order collects in the origin currency, converts at a locked rate, and pays the beneficiary in the destination currency. This is the flow for all 17 collect-only currencies, and the one to use whenever origin and destination differ.

1 · Lock a rate. A quote fixes the rate and fees for a short window.

POST /v1/quotes
{
  "originCurrency": "EUR",
  "destinationCurrency": "BRL",
  "originAmount": 5000
}

2 · Create the order. An order carries three objects — who pays, who receives, and where the money lands:

FieldWho / whatWhen you need it
userDataThe payer — whoever sends the origin fundsWhenever the origin is a rail. Not needed when the origin rail is BALANCE, since you are the payer.
destinationUserDataThe beneficiary — whoever receives the payoutWhenever the payout corridor requires beneficiary identity. Distinct from destinationTransferData: this is who they are, not where the money goes.
destinationTransferDataThe payout instrument — account, wallet or phone numberAlways. Its type is the rail; see the rail reference for its fields.

Both identity objects use the same shape. For an individual, firstName, userEmail and country are required. For a business, add businessName — supply it and the type is inferred, so you never send userType yourself. Everything else (lastName, address, city, postalCode, state, taxId, dob, phoneNumber) is optional to the schema, but individual corridors require more — a SEPA payout wants the beneficiary’s city and postalCode, and Brazilian payouts want a taxId. Send the fullest identity you hold.

POST /v1/orders
{
  "quoteId": "d290f1ee-6c54-4b01-90e6-d701748f0851",
  "userData": {
    "firstName": "Lucía",
    "lastName": "García",
    "userEmail": "payer@example.com",
    "country": "ES",
    "address": "Calle Gran Via 12",
    "city": "Madrid",
    "postalCode": "28013",
    "taxId": "12345678Z"
  },
  "destinationUserData": {
    "firstName": "Maria",
    "lastName": "Perez",
    "userEmail": "beneficiary@example.com",
    "country": "BR",
    "city": "São Paulo",
    "postalCode": "01310-100",
    "taxId": "123.456.789-00"
  },
  "destinationTransferData": {
    "type": "PIX_BR",
    "destinationName": "Maria Perez",
    "destinationPixCode": "supplier@example.com",
    "destinationTaxId": "123.456.789-00"
  },
  "externalReference": "invoice-8842"
}

A business payer looks the same with businessName added: { "businessName": "Acme SL", "firstName": "Lucía", "userEmail": "…", "country": "ES" }. firstName stays required — it identifies the representative.

3 · What comes back. The order embeds a deposit for its origin leg — the same depositInfo shape as a stand-alone collection. That is what the payer pays.

201 · response
{
  "orderId": "A7K9DP2X4Q1M",
  "status": "Pending",
  "deposit": {
    "depositId": "dep_11223344",
    "currency": "EUR",
    "expectedAmount": 5000,
    "depositInfo": {
      "depositType": "SEPA",
      "iban": "ES9121000418450200051332",
      "referenceCode": "VB-8F3K2P"
    }
  }
}

4 · Simulate the payer in sandbox. Keyed by orderId. The payer field follows the origin currency — per-currency values are in the origin reference, and the scenarios in Sandbox & simulation.

POST /v1/simulate/incoming-transfer/order
{
  "orderId": "A7K9DP2X4Q1M",
  "amount": 5000,
  "scenario": "success",
  "counterparty": {
    "name": "Payer Name",
    "iban": "ES9121000418450200051332"
  }
}

The order advances PendingProcessingSuccess as the funds arrive, convert and pay out. Track it with order_status_updated.

3 · Exchange

balance → balance. Convert between two currencies you already hold. Same quote-then-order pair as a cross-border payment, but both legs are BALANCE, so there is no payer and no beneficiary — and nothing to simulate.

POST /v1/quotes
{
  "originCurrency": "EUR",
  "originRail": "BALANCE",
  "destinationCurrency": "USDC",
  "destinationRail": "BALANCE",
  "originAmount": 1000
}
POST /v1/orders
{
  "quoteId": "d290f1ee-6c54-4b01-90e6-d701748f0851",
  "destinationTransferData": { "type": "BALANCE" }
}

Because the funds are already held, the order settles without waiting for an inbound transfer. userData is not required when the origin rail is BALANCE.

4 · Withdraw

balance → rail. Pay out from a balance with no conversion. Use this instead of an order when the currency you hold is the currency you are sending. destinationTransferData takes the same rails and fields as an order’s payout leg — see the rail reference.

POST /v1/withdrawals
{
  "currency": "EUR",
  "amount": 1000,
  "destinationTransferData": {
    "type": "SEPA",
    "destinationName": "Maria Perez",
    "iban": "ES9121000418450200051332",
    "country": "ES"
  }
}

Reference · Sandbox & simulation

On non-production environments you never wire real money. You tell the platform the payment arrived, and the flow advances exactly as it would in production. Every collect card in section 1 carries the exact body for its currency, and section 2 shows the order variant — this is the contract behind them.

Which endpoint

Pick by what you are funding. You never declare the rail: it is derived from the resource’s own currency.

FundingEndpointKeyed by
A stand-alone depositPOST /v1/simulate/incoming-transfer/depositdepositId
An order’s origin legPOST /v1/simulate/incoming-transfer/orderorderId

Which payer field

The origin currency decides this, and sending the wrong one is rejected rather than ignored:

POST /v1/simulate/incoming-transfer/order — fiat origin
{
  "orderId": "A7K9DP2X4Q1M",
  "amount": 5000,
  "scenario": "success",
  "counterparty": {
    "name": "Payer Name",
    "iban": "ES9121000418450200051332"
  }
}
POST /v1/simulate/incoming-transfer/deposit — crypto origin
{
  "depositId": "dep_8f0c1b2a3d4e",
  "amount": 1000,
  "fromAddress": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}

Scenarios

scenario drives what happens after the funds land. It applies to fiat origins; crypto origins always settle as received.

scenarioEffect
success defaultFull amount received; the deposit or order runs through to completion.
failedThe inbound transfer fails and the resource terminalizes.
compliance_reviewFunds are held for review — the deposit stays under review with amount 0 until cleared.
processingThe inbound is accepted but stays in flight, so you can exercise your pending-state handling.

Send amount equal to the expected amount for a clean success. A smaller value exercises partial-payment handling and fires deposit_partially_completed instead. These endpoints exist only on non-production environments and must be enabled for your workspace.

Reference · Origin currencies

Everything you can collect, and how. Balance decides whether a stand-alone deposit is possible; the last column is the payer field the sandbox simulation requires alongside name.

CurrencyKindBalanceStand-alone collectSimulate payer field
ARSfiatnonot availableaccountNumber
AVAXcryptoyesPOST /v1/depositsfromAddress
BNBcryptoyesPOST /v1/depositsfromAddress
BOBfiatnonot availablenone
BRLfiatnonot availablepixKey or taxId
BTCcryptoyesPOST /v1/depositsfromAddress
BWPfiatnonot availablemobileMoneyNumber
CLPfiatnonot availablenone
COPfiatnonot availableaccountNumber
CUSDcryptoyesPOST /v1/depositsfromAddress
ETHcryptoyesPOST /v1/depositsfromAddress
EURfiatyesPOST /v1/depositsiban
GBPfiatyesPOST /v1/depositsaccountNumber
KESfiatnonot availablemobileMoneyNumber
MWKfiatnonot availablemobileMoneyNumber
MXNfiatnonot availableclabe
NGNfiatnonot availablemobileMoneyNumber
POLcryptoyesPOST /v1/depositsfromAddress
RWFfiatnonot availablemobileMoneyNumber
SOLcryptoyesPOST /v1/depositsfromAddress
TRXcryptoyesPOST /v1/depositsfromAddress
TWDfiatnonot availablenone
TZSfiatnonot availablemobileMoneyNumber
UGXfiatnonot availablemobileMoneyNumber
USDfiatyesPOST /v1/depositsaccountNumber
USDCcryptoyesPOST /v1/depositsfromAddress
USDTcryptoyesPOST /v1/depositsfromAddress
XAFfiatnonot availablemobileMoneyNumber
XOFfiatnonot availablemobileMoneyNumber
XRPcryptoyesPOST /v1/depositsfromAddress
ZMWfiatnonot availablemobileMoneyNumber

Reference · Payout rails

Each rail is a value for destinationTransferData.type, used identically by an order and a withdrawal. The type alone decides the field set — it never depends on where the money came from. Expand one for its copy-paste snippet and accepted formats.

ACH_US origin & destination · USD

Payout method achUS. Discover these fields at runtime with GET /v1/currencies/USD/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "ACH_US",
  "destinationName": "Maria Perez",
  "accountNumber": "12345678",
  "routingNumber": "021000021",
  "country": "ES",
  "city": "Madrid",
  "postalCode": "28013",
  "address": "Calle Gran Via 12",
  "accountType": "PERSONAL"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
accountNumberREQUIRED^\d{4,17}$
routingNumberREQUIRED^\d{9}$
countryREQUIRED^[A-Z]{2}$
cityREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
postalCodeREQUIRED^[A-Za-z0-9-\s]{3,10}$
addressREQUIRED^[A-Za-z0-9À-ÿ\s,.\-/#°]{3,100}$
accountTypeREQUIREDOne of: PERSONAL BUSINESS
^(PERSONAL|BUSINESS)$
BANK_DEPOSIT_AR origin & destination · ARS

Payout method bankDepositAR. Discover these fields at runtime with GET /v1/currencies/ARS/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_AR",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/ARS/networks?rail=BANK_DEPOSIT_AR — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
destinationTaxIdoptional^$|^\d{2}-?\d{8}-?\d$
BANK_DEPOSIT_BO destination only · BOB

Payout method bankDepositBO. Discover these fields at runtime with GET /v1/currencies/BOB/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_BO",
  "destinationName": "Maria Perez",
  "destinationBankAccount": "00012345678",
  "destinationTaxId": "123.456.789-00"
}
FieldAccepted format
destinationNameREQUIRED^.{2,30}$
destinationBankAccountREQUIRED^.{1,11}$
destinationTaxIdREQUIRED^.{1,15}$
destinationBankNameoptional^.{0,20}$
BANK_DEPOSIT_BR destination only · BRL

Payout method bankDepositBR. Discover these fields at runtime with GET /v1/currencies/BRL/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_BR",
  "destinationName": "Maria Perez",
  "destinationBankCode": "001",
  "destinationBankBranch": "0001",
  "destinationBankAccount": "00012345678",
  "destinationTaxId": "123.456.789-00"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankCodeREQUIRED^\d{1,4}$
destinationBankBranchREQUIRED^\d{1,5}$
destinationBankAccountREQUIRED^\d{5,12}(-\d{1})?$
destinationTaxIdREQUIRED^(\d{3}.?\d{3}.?\d{3}-?\d{2})$
BANK_DEPOSIT_BW origin & destination · BWP

Payout method bankDepositBW. Discover these fields at runtime with GET /v1/currencies/BWP/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_BW",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/BWP/networks?rail=BANK_DEPOSIT_BW — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_CL origin & destination · CLP

Payout method bankDepositCL. Discover these fields at runtime with GET /v1/currencies/CLP/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_CL",
  "destinationName": "Maria Perez",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_CN destination only · CNY

Payout method bankDepositCN. Discover these fields at runtime with GET /v1/currencies/CNY/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_CN",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "destinationBankCode": "001",
  "destinationBankAccount": "00012345678",
  "destinationCity": "Shanghai",
  "destinationState": "Shanghai",
  "destinationPostcode": "200000",
  "destinationAddress": "1 Example Street",
  "destinationTaxId": "123.456.789-00",
  "destinationPhone": "+8613800138000"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankNameREQUIRED^.{2,}$
destinationBankCodeREQUIRED^.+$
destinationBankAccountREQUIRED^.+$
destinationCityREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationStateREQUIRED^.{2,}$
destinationPostcodeREQUIRED^[0-9]{6}$
destinationAddressREQUIRED^[A-Za-z0-9À-ÿ\s,.\-/#°]{3,100}$
destinationTaxIdREQUIRED^[0-9A-Za-z]{18}$
destinationPhoneREQUIRED^\+?[0-9]{6,15}$
BANK_DEPOSIT_COL origin & destination · COP

Payout method bankDepositCOL. Discover these fields at runtime with GET /v1/currencies/COP/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_COL",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/COP/networks?rail=BANK_DEPOSIT_COL — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
destinationTaxIdoptional^$|^\d{5,15}$
BANK_DEPOSIT_HK destination only · HKD

Payout method bankDepositHK. Discover these fields at runtime with GET /v1/currencies/HKD/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_HK",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "bic": "CAIXESBBXXX",
  "destinationBankAccount": "00012345678",
  "destinationAddress": "1 Example Street"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankNameREQUIRED^.{2,}$
bicREQUIRED^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$
destinationBankAccountREQUIRED^.+$
destinationAddressREQUIRED^[A-Za-z0-9À-ÿ\s,.\-/#°]{3,100}$
BANK_DEPOSIT_KE origin & destination · KES

Payout method bankDepositKE. Discover these fields at runtime with GET /v1/currencies/KES/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_KE",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/KES/networks?rail=BANK_DEPOSIT_KE — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_MW origin & destination · MWK

Payout method bankDepositMW. Discover these fields at runtime with GET /v1/currencies/MWK/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_MW",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationBankNameREQUIRED^.{2,}$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_MX destination only · MXN

Payout method bankDepositMX. Discover these fields at runtime with GET /v1/currencies/MXN/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_MX",
  "destinationName": "Maria Perez",
  "destinationBankCode": "001",
  "destinationBankAccountNumber": "012180001234567890",
  "numericReference": "1234567",
  "notesReference": "invoice 8842"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankCodeREQUIRED^\d{3}$
destinationBankAccountNumberREQUIRED^\d{18}$
numericReferenceREQUIRED^\d{1,7}$
notesReferenceREQUIRED^[a-zA-Z0-9 ]{1,40}$
destinationTaxIdoptional^$|^[A-Za-z0-9&Ñ]{10,13}$
BANK_DEPOSIT_NG origin & destination · NGN

Payout method bankDepositNG. Discover these fields at runtime with GET /v1/currencies/NGN/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_NG",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/NGN/networks?rail=BANK_DEPOSIT_NG — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_RW origin & destination · RWF

Payout method bankDepositRW. Discover these fields at runtime with GET /v1/currencies/RWF/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_RW",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationBankNameREQUIRED^.{2,}$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_TW destination only · TWD

Payout method bankDepositTW. Discover these fields at runtime with GET /v1/currencies/TWD/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_TW",
  "destinationName": "Maria Perez",
  "destinationBankAccount": "00012345678",
  "destinationBankName": "Example Bank",
  "destinationBankBranch": "0001",
  "bic": "CAIXESBBXXX"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationBankAccountREQUIRED^.+$
destinationBankNameREQUIRED^.{2,}$
destinationBankBranchREQUIRED^.{2,}$
bicREQUIRED^[A-Za-z]{4}[A-Za-z]{2}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$
BANK_DEPOSIT_TZ origin & destination · TZS

Payout method bankDepositTZ. Discover these fields at runtime with GET /v1/currencies/TZS/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_TZ",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/TZS/networks?rail=BANK_DEPOSIT_TZ — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_UG origin & destination · UGX

Payout method bankDepositUG. Discover these fields at runtime with GET /v1/currencies/UGX/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_UG",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationBankNameREQUIRED^.{2,}$
destinationBankAccountREQUIRED^.+$
BANK_DEPOSIT_VEN destination only · VES

Payout method bankDepositVEN. Discover these fields at runtime with GET /v1/currencies/VES/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_VEN",
  "destinationName": "Maria Perez",
  "destinationBankName": "Example Bank",
  "destinationBankAccountType": "CORRIENTE",
  "destinationBankAccountNumber": "012180001234567890",
  "destinationTaxId": "123.456.789-00"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankNameREQUIREDOne of: Banco de Venezuela Banco Venezolano de Crédito Banco Mercantil Banco Provincial Banco del Caribe Banco Exterior Banco Caroní Banesco Banco Sofitasa Banco Plaza Banco de la Gente Emprendedora Banco Fondo Común 100% Banco DelSur Banco del Tesoro Banco Agrícola de Venezuela Bancrecer Mi Banco Banco Activo Bancamiga Banco Internacional de Desarrollo Banplus Banco Bicentenario Banco de la Fuerza Armada Nacional Bolivariana N58 Banco Digital Banco Nacional de Crédito
^(100% Banco|Bancamiga|Bancrecer|Banesco|Banplus|DelSur|Mi Banco|Banco Activo|Banco Bicentenario|Banco Caroní|Banco Exterior|Banco Fondo Común|Banco Mercantil|Banco Plaza|Banco Provincial|Banco Sofitasa|Banco del Caribe|Banco del Tesoro|Banco de Venezuela|Banco de la Fuerza Armada Nacional Bolivariana|Banco de la Gente Emprendedora|Banco Internacional de Desarrollo|Banco Nacional de Crédito|Banco Venezolano de Crédito|Banco Agrícola de Venezuela|N58 Banco Digital)$
destinationBankAccountTypeREQUIREDOne of: CORRIENTE AHORRO
^(CORRIENTE|AHORRO)$
destinationBankAccountNumberREQUIRED^(0102|0104|0105|0108|0114|0115|0128|0134|0137|0138|0146|0151|0156|0157|0163|0166|0168|0169|0171|0172|0173|0174|0175|0177|0178|0191)-?\d{4}-?\d{2}-?\d{10}$
destinationTaxIdREQUIRED^[VvEeJj]-?[\d.,\/-]{0,10}\d$
BANK_DEPOSIT_ZA origin & destination · ZAR

Payout method bankDepositZA. Discover these fields at runtime with GET /v1/currencies/ZAR/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "BANK_DEPOSIT_ZA",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationBankAccount": "00012345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/ZAR/networks?rail=BANK_DEPOSIT_ZA — not free text.
^.+$
destinationBankAccountREQUIRED^.+$
GBP_BANK_TRANSFER origin & destination · GBP

Payout method bankDepositGB. Discover these fields at runtime with GET /v1/currencies/GBP/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "GBP_BANK_TRANSFER",
  "destinationName": "Maria Perez",
  "accountNumber": "12345678",
  "sortCode": "040075",
  "country": "ES",
  "city": "Madrid",
  "postalCode": "28013",
  "address": "Calle Gran Via 12",
  "accountType": "PERSONAL"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
accountNumberREQUIRED^\d{6,8}$
sortCodeREQUIRED^\d{2}-?\s?\d{2}-?\s?\d{2}$
countryREQUIRED^[A-Z]{2}$
cityREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
postalCodeREQUIRED^[A-Za-z0-9-\s]{3,10}$
addressREQUIRED^[A-Za-z0-9À-ÿ\s,.\-/#°]{3,100}$
accountTypeREQUIREDOne of: PERSONAL BUSINESS
^(PERSONAL|BUSINESS)$
MOBILE_MONEY_BW origin & destination · BWP

Payout method mobileMoneyBW. Discover these fields at runtime with GET /v1/currencies/BWP/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_BW",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/BWP/networks?rail=MOBILE_MONEY_BW — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_KE origin & destination · KES

Payout method mobileMoneyKE. Discover these fields at runtime with GET /v1/currencies/KES/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_KE",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/KES/networks?rail=MOBILE_MONEY_KE — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_MW origin & destination · MWK

Payout method mobileMoneyMW. Discover these fields at runtime with GET /v1/currencies/MWK/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_MW",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/MWK/networks?rail=MOBILE_MONEY_MW — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_RW origin & destination · RWF

Payout method mobileMoneyRW. Discover these fields at runtime with GET /v1/currencies/RWF/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_RW",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/RWF/networks?rail=MOBILE_MONEY_RW — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_TZ origin & destination · TZS

Payout method mobileMoneyTZ. Discover these fields at runtime with GET /v1/currencies/TZS/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_TZ",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/TZS/networks?rail=MOBILE_MONEY_TZ — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_UG origin & destination · UGX

Payout method mobileMoneyUG. Discover these fields at runtime with GET /v1/currencies/UGX/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_UG",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/UGX/networks?rail=MOBILE_MONEY_UG — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_XAF origin & destination · XAF

Payout method mobileMoneyXAF. Discover these fields at runtime with GET /v1/currencies/XAF/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_XAF",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/XAF/networks?rail=MOBILE_MONEY_XAF — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_XOF origin & destination · XOF

Payout method mobileMoneyXOF. Discover these fields at runtime with GET /v1/currencies/XOF/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_XOF",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/XOF/networks?rail=MOBILE_MONEY_XOF — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
MOBILE_MONEY_ZM origin & destination · ZMW

Payout method mobileMoneyZM. Discover these fields at runtime with GET /v1/currencies/ZMW/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "MOBILE_MONEY_ZM",
  "destinationName": "Maria Perez",
  "destinationNetworkId": "id from GET /v1/currencies/{currency}/networks",
  "destinationPhoneNumber": "+254712345678"
}
FieldAccepted format
destinationNameREQUIRED^.{2,}$
destinationNetworkIdREQUIREDOne of the ids returned by GET /v1/currencies/ZMW/networks?rail=MOBILE_MONEY_ZM — not free text.
^.+$
destinationPhoneNumberREQUIRED^\+?[0-9]{6,15}$
PHONE_DEPOSIT_VEN destination only · VES

Payout method phonePaymentVEN. Discover these fields at runtime with GET /v1/currencies/VES/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "PHONE_DEPOSIT_VEN",
  "destinationName": "Maria Perez",
  "destinationBankCode": "001",
  "destinationBankAccountType": "CORRIENTE",
  "destinationPhoneNumber": "+254712345678",
  "destinationTaxId": "123.456.789-00"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationBankCodeREQUIREDOne of: 0102 0104 0105 0108 0114 0115 0128 0134 0137 0138 0146 0151 0156 0157 0163 0166 0168 0169 0171 0172 0173 0174 0175 0177 0178 0191
^(0102|0104|0105|0108|0114|0115|0128|0134|0137|0138|0146|0151|0156|0157|0163|0166|0168|0169|0171|0172|0173|0174|0175|0177|0178|0191)$
destinationBankAccountTypeREQUIREDOne of: CORRIENTE AHORRO
^(CORRIENTE|AHORRO)$
destinationPhoneNumberREQUIRED^(\+?58\s?)?(0?4(12|14|16|22|24|26))\s?\d{7}$
destinationTaxIdREQUIRED^[VvEeJj]-?[\d.,\/-]{0,10}\d$
PIX_BR origin & destination · BRL

Payout method pixDepositBR. Discover these fields at runtime with GET /v1/currencies/BRL/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "PIX_BR",
  "destinationPixCode": "supplier@example.com",
  "destinationName": "Maria Perez",
  "destinationTaxId": "123.456.789-00"
}
FieldAccepted format
destinationPixCodeREQUIREDAny one of 5 formats:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$
^(?:\+55)?(?:[1-9]{2})9[1-9][0-9]{3}[0-9]{4}$
^(\d{3}.?\d{3}.?\d{3}-?\d{2})$
^(\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2})$
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
destinationTaxIdREQUIRED^(\d{3}.?\d{3}.?\d{3}-?\d{2})$
SEPA origin & destination · EUR

Payout method bankDepositEU. Discover these fields at runtime with GET /v1/currencies/EUR/destination-schema.

destinationTransferData — required fields
"destinationTransferData": {
  "type": "SEPA",
  "destinationName": "Maria Perez",
  "iban": "ES9121000418450200051332",
  "bic": "CAIXESBBXXX",
  "country": "ES",
  "city": "Madrid",
  "postalCode": "28013",
  "address": "Calle Gran Via 12",
  "accountType": "PERSONAL"
}
FieldAccepted format
destinationNameREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
ibanREQUIRED^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$
bicREQUIRED^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$
countryREQUIRED^[A-Z]{2}$
cityREQUIRED^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s[a-zA-ZÀ-ÿ\u00f1\u00d1]+)*$
postalCodeREQUIRED^[A-Za-z0-9-\s]{3,10}$
addressREQUIRED^[A-Za-z0-9À-ÿ\s,.\-/#°]{3,100}$
accountTypeREQUIREDOne of: PERSONAL BUSINESS
^(PERSONAL|BUSINESS)$

Field lists here are generated from the same manifest the API validates against, so they cannot drift from the contract. Fetch them at runtime with GET /v1/currencies/{currency}/destination-schema rather than hard-coding, since a rail can gain fields.

← Prev
Testing & sandbox