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

# Mobile money

> Collect fiat from a mobile money wallet, and pay out to one.

In many markets, people pay with mobile money instead of a bank. Bridge supports it both ways:

* **Onramp**: your customer pays fiat from their mobile money wallet.
* **Offramp**: your customer receives fiat in their mobile money wallet.

Mobile money is available for GHS, with more fiat currencies on the way. The examples on this page use GHS.

## Networks

For GHS:

| Network | Code |
| - | - |
| MTN | `0004` |
| Vodafone | `0006` |
| AirtelTigo (Airtel) | `0005` |
| AirtelTigo (Tigo) | `0009` |

You can get this list from [List mobile money networks](https://docs.bridge.linkio.world/api-reference/lookups/momo-networks.md).

## Collecting fiat (onramp)

With mobile money, your customer doesn't make a transfer. Instead, **we send a payment request to their phone** and they approve it.

**1. Get a quote**

Use `"source_currency": "GHS"` and `"payment_method": "momo"`.

**2. Create the onramp with a payer**

Add a `payer` with the wallet that will pay:

```json theme={null}
{
  "customer_id": "cus_4hT9pL2mQx8VnR3tY7wZ1cB5dE",
  "quote_id": "qte_2mQ9xLp3VnR7tY1wZ4cB6dE8fK",
  "payment_details": {
    "type": "stablecoin",
    "currency": "USDC",
    "details": {
      "address": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed",
      "network": "base"
    }
  },
  "payer": {
    "type": "momo",
    "currency": "GHS",
    "details": {
      "bank_code": "0004",
      "account_number": "0241234567",
      "account_name": "Kwame Mensah"
    }
  }
}
```

> [!WARNING]
>
> `account_name` must be the name the mobile money wallet is registered to. A different name is refused.

**3. Read the next step**

The response's `deposit.details` tells you what happens next:

```json theme={null}
"deposit": {
  "type": "momo",
  "currency": "GHS",
  "details": {
    "phone_number": "0241234567",
    "network": "MTN",
    "next_step": "OTP",
    "instruction": "Enter the code sent to the customer's phone"
  },
  "amount": "1500"
}
```

Show `instruction` to your customer. `next_step` can be:

* `OTP`: your customer gets a one-time code by text message or WhatsApp. Collect it and send it to us (next step).
* Another value or `null`: your customer approves the payment on their phone. There's nothing else for you to send.

**4. Send the code (if asked)**

```bash theme={null}
curl -X POST https://sandbox.core.linkio.world/api/payments/pay_8fK2mQ9xLp3VnR7tY1wZ4cB6dE/otp \
  -H "X-BRIDGE-API-Key: $BRIDGE_API_KEY" \
  -H "API-Version: 2026-10-29-atlas" \
  -H "Content-Type: application/json" \
  -d '{ "otp": "123456" }'
```

```json theme={null}
{
  "status": "success",
  "message": "Code submitted; approve on the phone if asked"
}
```

**5. Your customer approves**

They may be asked to approve on their phone. Once they do, the payment moves to `fiat_received` and then `completed`.

### Code errors

| Status | Message | Why |
| - | - | - |
| `422` | `otp must be the 4 to 8 digit code from the phone` | The code isn't 4 to 8 digits. |
| `422` | `This payment is not waiting for a code` | It's not an onramp, or it's already finished. |
| `422` | `This payment does not take a code` | This payment doesn't use codes. |
| `404` | `Payment pay_… not found` | Wrong payment ID. |

> [!TIP]
>
> If your customer declines the request on their phone, or doesn't approve it in time, the payment moves to `failed`. Create a new quote and payment to try again.

## Paying out fiat (offramp)

Create an offramp with `"payout_method": "momo"` in the quote, and the wallet in `payment_details`:

```json theme={null}
"payment_details": {
  "type": "momo",
  "currency": "GHS",
  "details": {
    "bank_code": "0004",
    "account_number": "0241234567",
    "account_name": "Kwame Mensah"
  }
}
```

| Field | Rule |
| - | - |
| `bank_code` | The network code, for example `0004` for MTN |
| `account_number` | The mobile money number, 10 to 12 digits |
| `account_name` | The wallet holder's name, 2 to 100 characters |

The rest works like any [offramp](https://docs.bridge.linkio.world/flows/offramp.md).


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