Create and fund a cross-border transaction
Changed onInitiates a cross-border payout in a single call: resolves the merchant configuration, funds the transaction against the quote identified by rateId, reserves the float and dispatches the payout asynchronously. Returns synchronously with state pending. Replaying the same externalId returns the original transaction instead of creating a second payout. When duplicate protection is enforced for your account, the externalId is also your payout reference across every payout endpoint: a replay with the same payout details answers 200 with the X-Idempotent-Replay: true header and idempotentReplay: true in the body, and an externalId already used with different payout details, or held by a transfer, is refused with 409 duplicate_reference. An existing transaction with this externalId that does not itself hold your payout reference — one created before duplicate protection, for instance — is still returned whatever the details sent, even when a transfer holds the reference: 200 with the X-Idempotent-Replay: true header and idempotentReplay: true in the body when duplicate protection is enforced, 201 otherwise.
Request
- The document declares no server URL.
- Authnone declared. Required headers: ApiKey, MerchantId, Environment
Headers
Your api key. To create a key, please get into our dashboard. If you don't have access to it, please reach the Support team.
Your merchant ID. This information is available in our dashboard. If you don't have access to it, please reach the Support team.
Allow you to choose between the sandbox mode to perform some tests or the live mode for real world transactions.
Request body
Example request
{
"externalId": "MTO-TX-00123",
"rejectionId": "ndr_V1StGXR8_Z5jdHi6B-myT",
"senderId": "snd_V1StGXR8Z5jdHi6BmyT",
"rateId": "7e6c2c2e-2b1a-4f3c-9d7a-2c2e2b1a4f3c",
"amount": "200",
"currency": "EUR",
"recipient": {
"rail": "mobile_wallet",
"firstName": "Aminata",
"lastName": "Traoré",
"countryCode": "SN",
"provider": "orange",
"phone": "+221771234567",
"accountNumber": "SN0123456789",
"bankCode": "SN_ECOBANK",
"middleName": "Fatou",
"address1": "12 rue de la Corniche",
"city": "Dakar",
"email": "aminata@example.com",
"dateOfBirth": "1992-05-23",
"idType": "passport"
},
"description": "Family support August"
}Response
Idempotent replay. Duplicate protection is enforced for your account, and a payout with this reference and the same payout details already exists: it is returned as it is now, and nothing is created or charged. Only ever sent with the X-Idempotent-Replay: true header and the body field idempotentReplay: true, which is absent from a normal creation. The payout details compared are the destination type, country, beneficiary, operator, requested amount and currency; on IRT and cross-border routes, also the sender identity and, on cross-border, the rateId, unless the reference was recorded by an earlier version of this check, which compared neither; other names (recipient, bank, display name), descriptions and metadata are ignored. Also returned when duplicate protection is enforced, whatever the details sent and even when a transfer holds the reference, for an existing transaction with this externalId that does not itself hold your payout reference (one created before duplicate protection, for instance).
Example response
{
"id": "cbt_V1StGXR8Z5jdHi6BmyT",
"externalId": "MTO-TX-00123",
"status": "pending",
"senderId": "snd_V1StGXR8Z5jdHi6BmyT",
"corridor": "XOF_MOBILE_SENEGAL",
"rail": "mobile_wallet",
"inputCurrency": "EUR",
"inputAmount": "200",
"outputCurrency": "XOF",
"outputAmount": "129223",
"hub2Fee": "10.00",
"fees": [
{
"id": "fee_V1StGXR8Z5jdHi6BmyT",
"rate": "5.00",
"type": "percent",
"amount": "10.00",
"currency": "EUR",
"taxes": [
{
"id": "tax_V1StGXR8Z5jdHi6BmyT",
"taxType": "tva",
"type": "percent",
"value": "18.00"
}
]
}
],
"hub2Rate": "646.1176450000",
"failureCause": {
"code": "insufficient_funds"
},
"duplicateConfirmation": {
"rejectionId": "ndr_V1StGXR8_Z5jdHi6B-myT"
},
"idempotentReplay": true
}Changes
- info
endpoint added
- info