Sending Cross-Border Payments
How do I send cross-border payments?
This guide walks you through the process of sending funds from a Cybrid trading account to a foreign bank account using the remittance product. This enables cross-border payments with automatic currency conversion and competitive exchange rates.
Please contact Cybrid support if you want the remittance feature enable on your bank
Prerequisites
Before you begin, ensure you have:
- Customer and Counterparty entities already created and verified
- A trading Account with sufficient funds
- The foreign bank account routing details (CLABE, etc.)
Overview
The remittance process involves five main steps:
- Create an external bank account with routing details
- Create a remittance plan
- Wait for remittance planning completion
- Execute the plan
- Monitor execution completion
Important: The remittance process involves currency conversions to facilitate the cross-border payment. If the final withdrawal to the destination bank account fails after conversions have occurred, any reversals may incur fees.
Important: It is HIGHLY recommended that you perform test deposits for new bank accounts and that your customers double-check all external bank account routing details before execution
Common issues that cause withdrawal failures include:
- Incorrect CLABE numbers or routing codes
- Mismatched account holder names
- Invalid or closed bank accounts
- Incorrect bank identifiers
Step 1: Create External Bank Account
First, create an external bank account record with the raw routing details for your destination bank account, see Foreign Fiat External Bank Accounts
Step 2: Create Remittance Plan
Create a plan that calculates estimated amounts, fees, and exchange rates.
Request
POST /api/plans
Authorization: Bearer <token>
Content-Type: application/json{
"type": "remittance",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"source_account": {
"guid": "866469e21559eb3d453e4d5f5c4a9be4"
},
"destination_account": {
"guid": "b17ebd247e34a507b6c80ea15d90fc66",
"amount": 10000
},
"travel_rule_info": {
"ultimate_originating_party_guid": "917b94bf859e625387da03aca58e8a43",
"ultimate_receiving_party_guid": "bf7562ab734cc61d8ea7e5e0180bd74f"
}
}Key Data:
- Source account (required): The cryptocurrency trading account from where the remittance is being paid from. If the amount is specified, the plan will ensure that will be the deliver amount.
- Destination account(required): The destination currency external account where the remittance is being paid to. If the amount is specified, the plan will ensure the specified amount will be deposited in the recipient bank account.
- Travel rule info (optional): This information is required only when the originator is not the holder of the trading account or when the receiver is not the holder of the external bank account.
Response
Initially, the plan will return in "storing" state while rates and fees are calculated.
Step 3: Wait for Planning to Complete
Poll the plan endpoint until the state changes to "completed", indicating it's ready for execution.
Request
GET /api/plans/4384639658a5970ca442030d4d1eae98
Authorization: Bearer <token>Response (when completed)
{
"created_at": "2025-10-04T12:59:15.732645Z",
"updated_at": "2025-10-04T12:59:17.249897Z",
"guid": "4384639658a5970ca442030d4d1eae98",
"state": "completed",
"type": "remittance",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"failure_code": null,
"stages": [
{
"created_at": "2025-10-04T12:59:17.132720Z",
"updated_at": "2025-10-04T12:59:17.132720Z",
"guid": "05a518360c38ea017eb8fb539665fdc6",
"type": "payout",
"failure_code": null,
"state": "planned",
"source_account": {
"guid": "866469e21559eb3d453e4d5f5c4a9be4",
"asset": "USDC",
"type": "trading",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": null,
"requested_amount": null,
"quoted_amount": 5531070,
"executed_amount": null
},
"destination_account": {
"guid": "b17ebd247e34a507b6c80ea15d90fc66",
"asset": "MXN",
"type": "external_bank_account",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"requested_amount": 10000,
"quoted_amount": 10000,
"executed_amount": null
},
"fees": [
{
"type": "bank",
"asset": "USDC",
"quoted_amount": 27518,
"executed_amount": null
},
{
"type": "platform",
"asset": "USDC",
"quoted_amount": 27518,
"executed_amount": null
},
{
"type": "network",
"asset": "ETH",
"quoted_amount": 100000000000,
"executed_amount": null
}
]
}
],
"source_account": {
"guid": "866469e21559eb3d453e4d5f5c4a9be4",
"asset": "USDC",
"type": "trading",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": null,
"requested_amount": null,
"quoted_amount": 5531070,
"executed_amount": null
},
"destination_account": {
"guid": "b17ebd247e34a507b6c80ea15d90fc66",
"asset": "MXN",
"type": "external_bank_account",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"requested_amount": 10000,
"quoted_amount": 10000,
"executed_amount": null
},
"fees": [
{
"type": "bank",
"asset": "USDC",
"quoted_amount": 27518,
"executed_amount": null
},
{
"type": "platform",
"asset": "USDC",
"quoted_amount": 27518,
"executed_amount": null
},
{
"type": "network",
"asset": "ETH",
"quoted_amount": 100000000000,
"executed_amount": null
}
],
"travel_rule_info": {
"originating_party": {
"participant_guid": "b3a9d531c26892954661735e1b7482b7",
"type": "customer"
},
"receiving_party": {
"participant_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"type": "counterparty"
},
"ultimate_originating_party": {
"participant_guid": "917b94bf859e625387da03aca58e8a43",
"type": "bank"
},
"ultimate_receiving_party": {
"participant_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"type": "counterparty"
}
}
}Key Data:
- Source account: The quoted amount will represent the cryptocurrency amount that will be used from the trading account to perform the remittance. If the source account requested amount was specified, the quoted amount will match the requested amount.
- Destination account: The quoted amount will represent the destination currency amount that will be deposited in the external bank account. If the destination account requested amount was specified, the quoted amount will match the requested amount.
- Fees: A collection of fees will be associated with the remittance. Some of the fees' quoted amounts represent an estimate and the value may change when the remittance will be executed.
- Stages: Stages will provide a view into the lifecycle of a plan. For the remittance product, at this time, there will be only one stage
payoutwhere the funds are being transferred from the trading account to the external bank account.
Step 4: Execute the Remittance Plan
Once the remittance is planned, execute it by creating an execution.
Request
POST /api/executions
Authorization: Bearer <token>
Content-Type: application/json{
"plan_guid": "4384639658a5970ca442030d4d1eae98"
}Response
Returns a "storing" state while the Platform executes the remittance.
Step 5: Monitor Execution Completion
Poll the execution endpoint until the state changes to "completed".
Request
GET /api/executions/078ee1657c260ccec6a28979af794731
Authorization: Bearer <token>Response (When Completed)
{
"created_at": "2025-10-04T14:25:22.816775Z",
"updated_at": "2025-10-04T14:28:48.663787Z",
"guid": "36f9be52550467d7e30836d7134c63f7",
"state": "completed",
"type": "remittance",
"plan_guid": "4384639658a5970ca442030d4d1eae98",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"failure_code": null,
"stages": [
{
"created_at": "2025-10-04T14:24:55.865059Z",
"updated_at": "2025-10-04T14:28:48.562584Z",
"guid": "70417e8d025492383679cb6247d5d683",
"type": "payout",
"failure_code": null,
"state": "completed",
"source_account": {
"guid": "866469e21559eb3d453e4d5f5c4a9be4",
"asset": "USDC",
"type": "trading",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": null,
"requested_amount": null,
"quoted_amount": 5532205,
"executed_amount": 5532205
},
"destination_account": {
"guid": "b17ebd247e34a507b6c80ea15d90fc66",
"asset": "MXN",
"type": "external_bank_account",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"requested_amount": 10000,
"quoted_amount": 10000,
"executed_amount": 10000
},
"fees": [
{
"type": "bank",
"asset": "USDC",
"quoted_amount": 27524,
"executed_amount": 27524
},
{
"type": "platform",
"asset": "USDC",
"quoted_amount": 27524,
"executed_amount": 27524
},
{
"type": "network",
"asset": "ETH",
"quoted_amount": 100000000000,
"executed_amount": 100000000000
}
]
}
],
"source_account": {
"guid": "866469e21559eb3d453e4d5f5c4a9be4",
"asset": "USDC",
"type": "trading",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": null,
"requested_amount": null,
"quoted_amount": 5532205,
"executed_amount": null
},
"destination_account": {
"guid": "b17ebd247e34a507b6c80ea15d90fc66",
"asset": "MXN",
"type": "external_bank_account",
"bank_guid": "917b94bf859e625387da03aca58e8a43",
"customer_guid": "b3a9d531c26892954661735e1b7482b7",
"counterparty_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"requested_amount": 10000,
"quoted_amount": 10000,
"executed_amount": 10000
},
"fees": [
{
"type": "bank",
"asset": "USDC",
"quoted_amount": 27524,
"executed_amount": 27524
},
{
"type": "platform",
"asset": "USDC",
"quoted_amount": 27524,
"executed_amount": 27524
},
{
"type": "network",
"asset": "ETH",
"quoted_amount": 100000000000,
"executed_amount": 100000000000
}
],
"travel_rule_info": {
"originating_party": {
"participant_guid": "b3a9d531c26892954661735e1b7482b7",
"type": "customer"
},
"receiving_party": {
"participant_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"type": "counterparty"
},
"ultimate_originating_party": {
"participant_guid": "917b94bf859e625387da03aca58e8a43",
"type": "bank"
},
"ultimate_receiving_party": {
"participant_guid": "bf7562ab734cc61d8ea7e5e0180bd74f",
"type": "counterparty"
}
}
}Key Data:
- Source account: The executed amount will represent the cryptocurrency withdrawn from the trading account to perform the remittance. For the remittance product, the executed amount will match the quoted amount.
- Destination account: The executed amount will represent the destination currency amount deposited in the external bank account. For the remittance product, the executed amount will match the quoted amount.
- Fees: The executed amount will represent the fees collected to perform the remittance.
Updated about 4 hours ago
