> For the complete documentation index, see [llms.txt](https://docs.fonbnk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.fonbnk.com/fiat-payment-channels.md).

# Fiat payment channels

The ways a user can pay, or be paid, in local currency.

A payment channel is how the local currency moves. Which channels exist depends on the country, and several work in only one direction.

| Channel          | On-ramp | Off-ramp | Where                                                  |
| ---------------- | ------- | -------- | ------------------------------------------------------ |
| `bank`           | yes     | yes      | NG, ZA, BR, PH — and KE for off-ramp only              |
| `mobile_money`   | yes     | yes      | KE, GH, TZ, UG, ZM and most of West and Central Africa |
| `digital_wallet` | yes     | yes      | CI, SN, GM                                             |
| `airtime`        | no      | yes      | most countries                                         |
| `paybill`        | no      | yes      | KE                                                     |
| `buy_goods`      | no      | yes      | KE                                                     |

Which are live per country is on [Supported countries and cryptocurrencies](/supported-countries-and-cryptocurrencies.md); the live answer is [Get available currencies](/server-to-server/api-endpoints/get-available-currencies.md).

{% hint style="info" %}
**Do not hard-code the fields a channel needs.** Every quote returns `fieldsToCreateOrder` for both legs, and that is the contract — it changes with the country and with which provider routes the order. The lists below are what you will typically see, not a promise.

The same goes for the transfer type. A channel is not tied to one — which one you get depends on the provider routing that country, so read `transferInstructions.type` and branch on it rather than on the channel.
{% endhint %}

### Bank

**Flows:** on-ramp and off-ramp

[**Transfer types**](/fiat-transfer-types.md)**:** `manual`, `redirect`

Typical fields: `bankCode` (an enum of banks — its `options` may carry `iconUrl` and `featured`), `bankAccountNumber`, `phoneNumber`, and depending on the provider `fullName` or `bankAccountHolderName`. A `redirect` bank offer also asks for `redirectUrl` — the page to send the user back to once they finish on the provider's site.

Both types are live: Nigeria, Brazil and the Philippines are `manual` today, South Africa is `redirect`.

For a `manual` on-ramp we return the bank account to pay into and a **transfer narration**. The narration is how we recognise the payment: a transfer without it, or from a different account than the one the user gave, will not be matched.

![](https://1912462442-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPgl1t8uCisy0T57qHG35%2Fuploads%2FowbXDRdDNStZ6xV1RJuR%2Fimage.png?alt=media\&token=ff94e11a-2afb-44d0-b185-24b0a0b1a446)

Nigeria bank on-ramp:

{% embed url="<https://gumlet.tv/watch/696784c6b25141dfa4cca3f0/>" %}

Nigeria bank off-ramp:

{% embed url="<https://gumlet.tv/watch/696a226a828f3379e540a522/>" %}

### Mobile money

**Flows:** on-ramp and off-ramp

[**Transfer types**](/fiat-transfer-types.md)**:** `stk_push`, `redirect`, `otp_stk_push`

Mobile money is digital cash held against a phone number. It is regulated like a bank account: you can pay in, send, and withdraw as physical cash. It is not the same as airtime, which is prepaid credit for calls, SMS and data.

Typical fields: `phoneNumber`, `carrierCode`, and often `fullName`.

Most mobile money on-ramps are an **STK push** — a prompt from the user's carrier asking them to approve the transfer with their PIN, which you drive through [Trigger order intermediate action](/server-to-server/api-endpoints/trigger-order-intermediate-action.md). But not all: Ivorian mobile money is a `redirect` channel today, where the user finishes on the provider's page and there is no prompt to re-send. `otp_stk_push`, where the user confirms a code by SMS or WhatsApp before the prompt arrives, sits on one held-back offer — see [Fiat transfer types](/fiat-transfer-types.md).

![](https://1912462442-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPgl1t8uCisy0T57qHG35%2Fuploads%2F0YZgO0XxwCIroA4MF4Ef%2Fimage.png?alt=media\&token=edc84093-14f0-4249-ad52-f2230a4dfe47)

Kenya mobile money on-ramp:

{% embed url="<https://gumlet.tv/watch/696a2327828f3379e540b699/>" %}

Kenya mobile money off-ramp:

{% embed url="<https://gumlet.tv/watch/69678576b25141dfa4ccb1ef/>" %}

### Digital wallet

**Flows:** on-ramp and off-ramp

[**Transfer types**](/fiat-transfer-types.md)**:** `redirect`

Wallets like Wave that are not carrier mobile money. Live in Ivory Coast, Senegal and Gambia.

Typical fields: `phoneNumber` and `fullName`, plus `redirectUrl` on some on-ramp offers. Some digital wallet offers carry no `carriers` list at all, so do not build a wallet picker that requires one — take the field list from the quote.

On-ramp always goes through the provider's own page, so the transfer type is `redirect`: send the user to `transferInstructions.paymentUrl` and they come back when they are done.

### Airtime

**Flows:** off-ramp only

Typical fields: `phoneNumber`, `carrierCode`.

Once the user's crypto arrives, the equivalent value is topped up to their mobile line automatically. There is no confirmation step for them.

Nigeria airtime off-ramp:

{% embed url="<https://gumlet.tv/watch/696a229805ff587e8df6fc6e/>" %}

### Paybill and Buy goods

**Flows:** off-ramp only, Kenya only

These pay a Kenyan M-PESA merchant instead of a personal wallet, so a user can settle a bill or pay a till directly from crypto.

* `paybill` takes `payBillNumber` and `bankAccountNumber` (the account reference at that paybill).
* `buy_goods` takes `buyGoodsNumber` (the till number).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.fonbnk.com/fiat-payment-channels.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
