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

# Corridors

> What you can settle in, where money can land, and the minimums on each pair.

A corridor is a supported `settlement_currency → destination_currency` pair. It
determines the rail you settle on, the fee schedule, and the minimum size of a
payout.

## Supported pairs

| You settle in | Beneficiary receives | Rail          | Minimum settlement |
| ------------- | -------------------- | ------------- | ------------------ |
| `USDT`        | `NGN`                | Crypto        | 1 USDT             |
| `USDT`        | `GHS`                | Crypto        | 1 USDT             |
| `USDT`        | `KES`                | Crypto        | 1 USDT             |
| `USDT`        | `ZAR`                | Crypto        | 1 USDT             |
| `NGN`         | `GHS`                | Bank transfer | 1,000 NGN          |
| `NGN`         | `KES`                | Bank transfer | 1,000 NGN          |
| `NGN`         | `ZAR`                | Bank transfer | 1,000 NGN          |

`settlement_currency` defaults to `USDT` when you omit it.

<Warning>
  The two lists are not interchangeable. **NGN is both** — you can settle in NGN
  and you can pay out in NGN, but only from USDT. There is no NGN → NGN corridor.
  Settling in ZAR, KES, or GHS is not supported at all.
</Warning>

An unsupported pair fails at payout creation, synchronously:

```json theme={null}
{
  "error": {
    "code": "UNSUPPORTED_CORRIDOR",
    "message": "No supported corridor for USDT \u2192 UGX.",
    "details": [
      {
        "field": "destination_currency",
        "issue": "UGX is not a supported destination. Settling in USDT can pay out to: ZAR, KES, GHS, NGN"
      }
    ],
    "request_id": "req_01HX..."
  }
}
```

The `details` entry names **which side** is wrong. An unsupported
`destination_currency` lists what your settlement currency can actually reach; an
unsupported `settlement_currency` lists the settlement currencies that exist. That
distinction matters — asking to pay out *in* NGN and asking to settle *in* NGN are
different requests with different fixes.

This is checked before the payout row is written, so a bad corridor never leaves a
payout stranded in `CREATED`.

## The two rails

The corridor picks the rail — you do not choose it directly.

<Tabs>
  <Tab title="Crypto (USDT)">
    You settle on-chain to an address that belongs to your account. Choose the
    chain with `settlement_network` on the payout: `TRON` or `BSC`, defaulting to
    `TRON`.

    The payment instruction returns `rail: "CRYPTO"`, the address as
    `account_unique`, and the chain as `network`. Settlements wait for network
    confirmations before the payout advances.

    Fees on this rail: a 1% spread, a 1% platform fee, and a flat network fee in
    USDT.
  </Tab>

  <Tab title="Bank transfer (NGN)">
    You settle by naira bank transfer to a virtual account number issued for the
    payout.

    The payment instruction returns `rail: "BANK_TRANSFER"`, the account number as
    `account_unique`, and `network: null`. Bank transfers confirm on arrival —
    there are no confirmations to wait for.

    Fees on this rail: a 1.25% spread, a 1% platform fee, and a flat processing
    fee in NGN. `settlement_network` is ignored.
  </Tab>
</Tabs>

## Destination types

What the beneficiary is paid into, set with `destination_type`:

| Type            | Notes                                                               |
| --------------- | ------------------------------------------------------------------- |
| `MOBILE_MONEY`  | Requires `destination_provider_code` and `destination_account_name` |
| `BANK_ACCOUNT`  | Requires `destination_provider_code` and `destination_account_name` |
| `CRYPTO_WALLET` | Neither code nor name applies — chains have no account names        |

Get valid codes from [`GET /v1/banks`](/guides/beneficiaries). The display name in
`destination_provider_name` is never used for routing.

## Minimums

The minimum applies to the **settlement** amount, not the destination amount. A
payout is rejected when the amount you would owe falls below the corridor floor:

```json theme={null}
{
  "error": {
    "code": "SETTLEMENT_BELOW_MINIMUM",
    "message": "The resulting settlement amount is below the corridor minimum.",
    "details": [
      {
        "field": "destination_amount",
        "issue": "Settlement 0.62 USDT is below the minimum 1 USDT"
      }
    ],
    "request_id": "req_01HX..."
  }
}
```

Note the `field` is `destination_amount` — that is the value you control, even
though the floor is measured on the settlement side. Because the floor is on the
settlement side, whether a given destination amount clears it moves with the rate.
Quote before you commit if you are working near the boundary.

## Checking a corridor at runtime

`GET /v1/rates?from=USDT&to=GHS` is the cheapest way to confirm a pair is live and
see the current rate. A supported corridor returns a rate; an unsupported one
returns `UNSUPPORTED_CORRIDOR`.

<Note>
  Rates are quoted live by our liquidity engine, and the fee percentages above are
  the current schedule rather than a contractual guarantee. Read
  `total_fee_amount` off a [quote](/guides/quotes) or the payout itself for the
  numbers that will actually be charged — never recompute them from percentages on
  this page.
</Note>
