> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapyd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cross-border payments

> Move fiat between countries through stablecoins: an onramp in one market, an offramp in another.

Zapyd moves money across borders with a stablecoin sandwich. Fiat in one country becomes USDC, and that USDC becomes fiat in another. USD to MXN, for example, is two orders:

<Steps>
  <Step title="Leg 1: onramp" icon="arrow-down-to-line">
    USD to USDC with a [payin](/guides/payments/payins). Skip this leg if you already hold stablecoins.
  </Step>

  <Step title="Leg 2: offramp" icon="arrow-up-from-line">
    USDC to MXN with a [payout](/guides/payments/payouts) or a [prefunded payout](/guides/payments/prefunded-payouts) to the beneficiary's bank account.
  </Step>
</Steps>

There is no separate cross-border API. You run the two legs with the payin and payout APIs, and each leg has its own quotation, status and webhook. The [Flow Builder](/flow-builder) shows every call for any pair of currencies.

## Leg 1: onramp

Payins run in the United States (USD) and India (INR). Follow the [payins guide](/guides/payments/payins), then use the USDC you receive to fund leg 2, per order or by topping up your prefunded balance.

## Leg 2: offramp

The destination decides which API pays out.

| Destination | API | What it adds |
| - | - | - |
| India | [Standard payout](#standard-payouts) to a fully KYC-verified customer, or the [remittance payout API](/guides/country-guides/india/overview#4-remittance-rda), settled through a Rupee Drawing Arrangement (RDA) | `IMPS` or `UPI`, the same as any India payout. With RDA, a remitter living outside India is the sender |
| Any other payout market | [Standard payout](#standard-payouts) to a beneficiary onboarded with payout-only onboarding | `transfer_purpose` and `is_self_transfer` on the bank account |

Each supports the [prefunded model](/guides/payments/prefunded-payouts) (top up once, each payout debits the balance) and the per-order model (send each quotation's `sending_amount` to its `wallet_address`, then initiate with the `transaction_hash`).

### Purpose of the transfer

On payout-only bank accounts, the bank account carries the reason for the payment:

| Case | `transfer_purpose` | `is_self_transfer` |
| - | - | - |
| Remittance: money sent home to someone else | `FAMILY_MAINTENANCE`, `EDUCATION`, `MEDICAL_TREATMENT` | `false` |
| Moving money to your own account | `TRANSFER_TO_OWN_ACCOUNT` (the default) | `true` (the default) |

The full list of purposes is in [payout-only onboarding](/guides/customers/payout-only-onboarding#requirements-by-country-and-method).

## Standard payouts

The offramp leg is a standard payout. Onboard the beneficiary, add their bank account, then run the [payout flow](/guides/payments/payouts) or the [prefunded payout flow](/guides/payments/prefunded-payouts).

* **India:** onboard the beneficiary with [standard KYC](/guides/customers/overview#standard-kyc), add the account with [`POST /bank/create`](/api-reference-exchange/endpoint/bank/create), then follow the [India payout steps](/guides/country-guides/india/overview#3-payouts-stablecoins-to-inr). India can also settle through [RDA](/guides/country-guides/india/overview#4-remittance-rda).
* **Every other market:** onboard the beneficiary with [payout-only onboarding](/guides/customers/payout-only-onboarding), as below.

<Steps>
  <Step title="Onboard the beneficiary" icon="user-check">
    Create the customer with [`POST /customer/payout/create`](/api-reference-exchange/endpoint/customer/payout-create) and their country's `alpha_3_country_code`. Then call [`POST /kyc/payout/add-kyc-data`](/api-reference-exchange/endpoint/kyc/payout-add-kyc-data) and [`POST /kyc/payout/add-sender-kyc-data`](/api-reference-exchange/endpoint/kyc/payout-add-sender-kyc-data) with the address fields and identifiers that country needs.
  </Step>

  <Step title="Add the bank account with a purpose" icon="building-columns">
    Call [`POST /bank/payout/create`](/api-reference-exchange/endpoint/bank/payout-create). Set `transfer_purpose` to the reason for the transfer, and `is_self_transfer` to `false` because the sender and the beneficiary are different people. This example is a beneficiary in the Philippines:

    ```json theme={"theme":{"light":"css-variables","dark":"css-variables"}}
    {
      "customer_id": "84737c7d-7b62-4204-80d6-80f6ecb3ceb4",
      "bank_account_type": "PESONET",
      "identifiers": {
        "account_holder_name": "Maria Santos",
        "bank_name": "BDO Unibank",
        "account_number": "001234567890"
      },
      "transfer_purpose": "FAMILY_MAINTENANCE",
      "is_self_transfer": false
    }
    ```

    Common purposes for remittances are `FAMILY_MAINTENANCE`, `EDUCATION` and `MEDICAL_TREATMENT`. Without these fields, the account defaults to `TRANSFER_TO_OWN_ACCOUNT` and `is_self_transfer: true`.
  </Step>

  <Step title="Quote and pay out" icon="paper-plane">
    Create a payout quotation with `customer_id` and `bank_id`, fund it, and initiate. Tracking and webhooks are the same as any [payout](/guides/payments/payouts#6-track-the-result).
  </Step>
</Steps>

<Note>
  Each country has its own methods and required fields. See the [country table](/guides/customers/payout-only-onboarding) before you build the onboarding screens.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.