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

# Create an exchange

> How to make an exchange

## Initiate Exchange

Before creating an exchange, you must first fetch a rate from the utility endpoint `/utility/exchange-rate`. The `_id` from that response is required as the `offerId` parameter when creating the exchange. See the [Get Rate](/guides/get-rate) guide for more details.

When making an exchange, the initiating currency — the one the user is giving or has — is represented by `buyerDebit`, while the target currency — the one the user is receiving or wants — is represented by `buyerCredit`.

The request body requires the following fields:

| Field                       | Required    | Description                                                                                                                                           |
| --------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `amount`                    | Yes         | The amount in the initiating (debit) currency. Conversion into the credit currency is calculated based on current exchange rates and applicable fees. |
| `buyerDebitPaymentMethod`   | Yes         | How the user will send funds.                                                                                                                         |
| `buyerCreditPaymentMethod`  | Yes         | How the user will receive funds.                                                                                                                      |
| `buyerDebitPaymentDetails`  | Conditional | Required unless `buyerDebitPaymentMethod` is `WALLET`.                                                                                                |
| `buyerCreditPaymentDetails` | Conditional | Required unless `buyerCreditPaymentMethod` is `WALLET`.                                                                                               |
| `narration`                 | No          | A custom note or description attached to the transaction.                                                                                             |

The shape of `buyerDebitPaymentDetails` and `buyerCreditPaymentDetails` depends on the payment method specified in their corresponding buyerCredit or buyerDebit `PaymentMethod` fields.

***

## Supported Payment Methods

### 1. BANK\_TRANSFER

Typically used for currencies such as `NGN`, `USD`, `GBP`, `EUR`, `CAD`, etc.

**Required fields:** `accountName`, `accountNumber`, `bankCode`, `providerName`, `currency`, `iso2`, `paymentMethod`

**Additional required fields (GBP & EUR only):** `holderPostalCode`, `holderCity`, `holderStreet`

**Notes:**

* The `bankCode` field is required. The `network` field must be omitted.
* For `NGN`, `providerName` should be the name of the bank (e.g., Access Bank, GTBank).
* For currencies that use routing or sort codes (e.g., `USD`, `GBP`, `EUR`), `bankCode` should contain the appropriate routing/sort code, and `providerName` should be the same as `bankCode`.
* For `GBP` and `EUR`, the additional address fields (`holderPostalCode`, `holderCity`, `holderStreet`) are mandatory.
* For `NGN` and `CNY`, fetch supported banks and their `bankCode` values from the utility endpoint: `/transaction/{method}/providers` (replace `{method}` with `BANK_TRANSFER`).
* To perform account name verification for `NGN` bank transfers, call: `/transaction/verify-bank-account`.

***

### 2. MOBILE\_MONEY

Typically used for currencies such as `GHS`, `MWK`, `KES`, `XOF`, `UGX`, etc.

**Required fields:** `accountName`, `accountNumber`, `network`, `providerName`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* The `bankCode` field must be omitted. The `network` field is required and must match `providerName` (e.g., MTN, Airtel, Vodafone).
* To fetch supported mobile money providers for a specific country, call: `/transaction/{method}/providers` (replace `{method}` with `MOBILE_MONEY`).
* The response lists all supported provider networks that can be used for both `buyerDebitPaymentDetails` and `buyerCreditPaymentDetails`.

***

### 3. ZELLE

Used for U.S.-based bank transfers via Zelle.

**Required fields:** `accountName`, `email`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* This is an email-based payment method. The email address must belong to a valid Zelle-enabled U.S. bank account.
* `bankCode` and `network` fields should be omitted.

***

### 4. INTERAC

Used for Canadian email-based transfers via Interac e-Transfer.

**Required fields:** `accountName`, `email`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* This is also an email-based payment method. Only supported for `CAD` currency.
* `bankCode` and `network` fields should be omitted.

***

### 5. STABLE\_CURRENCY

Used for blockchain-based stablecoin transfers such as `USDT`, `USDC`, or `BUSD`.

**Required fields:** `walletAddress`, `network`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* Valid networks are: `TRC20`, `ERC20`, `BEP20`, `SOL`, and `TON`.
* The `currency` field must be one of: `USDT`, `USDC`, or `BUSD`. The `iso2` field should match the `currency` field.
* `bankCode`, `accountName`, and `email` should not be included.
* For `buyerDebitPaymentDetails`, the `walletAddress` is the wallet address you are sending funds from.
* For the `network` field: when you initiate the exchange by calling `/utility/exchange-rate`, the response body contains a `paymentDetails` object — the `network` value in that object is the network you should send from.

***

### 6. ALIPAY

Used for Chinese Yuan (`CNY`) payments via Alipay.

**Required fields:** `accountName`, `phoneNumber`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* Supported only for `CNY` currency.
* `phoneNumber` represents the user's Alipay account identifier.
* `bankCode`, `network`, and `email` fields must be omitted.

***

### 7. WECHAT\_PAY

Used for Chinese Yuan (`CNY`) payments via WeChat Pay.

**Required fields:** `accountName`, `phoneNumber`, `currency`, `iso2`, `paymentMethod`

**Notes:**

* Supported only for `CNY` currency.
* `phoneNumber` represents the user's WeChat Pay account identifier.
* `bankCode`, `network`, and `email` fields must be omitted.

***

## Additional Notes

* These field requirements apply to both `buyerDebitPaymentDetails` and `buyerCreditPaymentDetails`.
* Ensure that payment details align with the selected payment method and currency to enable accurate routing and settlement.
* Some payment methods and required fields are currency-dependent. Always verify that the selected payment method is valid for the chosen currency.
* For `BANK_TRANSFER` and `MOBILE_MONEY`, always fetch provider data from `/transaction/{method}/providers` to ensure valid and up-to-date options.
* Invalid or mismatched field combinations (e.g., providing `bankCode` for `MOBILE_MONEY`) will result in validation errors.

***

## Request Body

```json theme={null}
{
  "amount": 500,
  "buyerDebitPaymentMethod": "MOBILE_MONEY",
  "buyerCreditPaymentMethod": "BANK_TRANSFER",
  "buyerCreditPaymentDetails": {
    "accountName": "MONIRATES LIMITED",
    "accountNumber": "0115847370",
    "providerName": "SAFE HAVEN SANDBOX BANK",
    "paymentMethod": "BANK_TRANSFER",
    "iso2": "NG",
    "currency": "NGN",
    "bankCode": "999240"
  },
  "buyerDebitPaymentDetails": {
    "accountName": "MONIRATES LIMITED",
    "accountNumber": "0115847370",
    "providerName": "MTN",
    "paymentMethod": "MOBILE_MONEY",
    "iso2": "GH",
    "currency": "GHS",
    "network": "MTN"
  }
}
```

***

## Response

A successful request returns a `PENDING` exchange order. The `sellerCreditPaymentDetails` object contains Monirates' receiving account — this is where the buyer should send funds.

```json theme={null}
{
  "success": true,
  "message": "Processing order",
  "data": {
    "_id": "6a1d57c328131baac7e08d35",
    "globalId": "6f7dec30-5da0-11f1-87a3-c535699deb59",
    "offerId": "68f76957fba0bdb680779e54",
    "buyerGlobalId": "9f39f210-ba45-11f0-b11b-e53d26da86ed",
    "fromCurrency": "NGN",
    "toCurrency": "KES",
    "rate": 0.0870385650474012,
    "fee": 0,
    "amount": 1220,
    "status": "PENDING",
    "buyerDebitPaymentMethod": "BANK_TRANSFER",
    "buyerCreditPaymentMethod": "MOBILE_MONEY",
    "buyerCreditPaymentDetails": {
      "accountName": "Kwame Asamoah",
      "accountNumber": "024555555555555",
      "providerName": "MPESA",
      "network": "MPESA",
      "paymentMethod": "MOBILE_MONEY",
      "iso2": "KE",
      "currency": "KES",
      "isUssdCode": false,
      "_id": "6a1d57c328131baac7e08d36"
    },
    "buyerDebitPaymentDetails": {
      "accountName": "Kwame Asamoah",
      "accountNumber": "024555555555",
      "providerName": "FIRST BANK",
      "bankCode": "999024",
      "paymentMethod": "BANK_TRANSFER",
      "iso2": "NG",
      "currency": "NGN",
      "_id": "6a1d57c328131baac7e08d37"
    },
    "sellerCreditPaymentDetails": {
      "accountName": "MONIRATESLIMITE / JOHN DOE",
      "accountNumber": "8029869754",
      "providerName": "SAFE HAVEN SANDBOX BANK",
      "bankCode": "999240",
      "paymentMethod": "BANK_TRANSFER",
      "iso2": "NG",
      "currency": "NGN",
      "_id": "6a01913a7a6ab126310a083b"
    },
    "source": "BUSINESS",
    "buyerMadePayment": false,
    "hasBuyerPaymentProof": false,
    "buyerPaymentProofUrl": null,
    "paymentReferenceCode": 139683,
    "createdAt": "2026-06-01T09:58:27.249Z",
    "updatedAt": "2026-06-01T09:58:27.249Z"
  }
}
```

### Key Response Fields

| Field                        | Description                                                                         |
| ---------------------------- | ----------------------------------------------------------------------------------- |
| `_id`                        | The unique ID of the created exchange order.                                        |
| `status`                     | Will be `PENDING` on creation.                                                      |
| `sellerCreditPaymentDetails` | Monirates' receiving account. The buyer must send funds to this account to proceed. |
| `paymentReferenceCode`       | A reference code for this transaction.                                              |
| `buyerMadePayment`           | Indicates whether the buyer has confirmed payment. Starts as `false`.               |

<Note>
  proceed to the [Payment Made](/guides/payment-made) guide.
</Note>
