# Payment options by country

Ask Payd which networks and banks work in a country, and the limits for each. Use it to build your payment picker and to get the ids a payin or payout needs.

<div class="endpoint"><span class="method get">GET</span><code>https://api.payd.money/api/v2/payments/discovery/{country}</code></div>

`country` is a two-letter code, such as `UG`.

::: code-group

```bash [cURL]
curl https://api.payd.money/api/v2/payments/discovery/UG \
  -u "$PAYD_API_USERNAME:$PAYD_API_PASSWORD"
```

```js [Node.js]
const auth = Buffer.from(
  `${process.env.PAYD_API_USERNAME}:${process.env.PAYD_API_PASSWORD}`,
).toString('base64')

const options = await fetch('https://api.payd.money/api/v2/payments/discovery/UG', {
  headers: { Authorization: `Basic ${auth}` },
}).then((r) => r.json())

const networks = Object.values(options.provider_networks ?? {}).flatMap((group) => group.networks)
const collect = networks.filter((n) => n.channel_type === 'momo' && n.ramp_type === 'deposit' && n.status === 'active')
const payOut = networks.filter((n) => n.ramp_type === 'withdraw' && n.status === 'active')
```

```python [Python]
import os
import requests

options = requests.get(
    "https://api.payd.money/api/v2/payments/discovery/UG",
    auth=(os.environ["PAYD_API_USERNAME"], os.environ["PAYD_API_PASSWORD"]),
    timeout=15,
).json()

networks = [n for group in (options.get("provider_networks") or {}).values() for n in group["networks"]]
collect = [n for n in networks if n["channel_type"] == "momo" and n["ramp_type"] == "deposit" and n["status"] == "active"]
pay_out = [n for n in networks if n["ramp_type"] == "withdraw" and n["status"] == "active"]
```

:::

## Response

The response is long. This example keeps two networks:

```json
{
  "country": "UG",
  "currency": "UGX",
  "has_networks": true,
  "rails": { "bank": false, "card": false, "momo": true },
  "provider_networks": {
    "alpha": {
      "networks": [
        {
          "id": "04a3083a-567c-4a2b-aa39-fa8f19e64341-deposit",
          "network_id": "04a3083a-567c-4a2b-aa39-fa8f19e64341",
          "network_name": "Airtel Mobile Money",
          "network_code": "AIRTEL_UGANDA",
          "channel_type": "momo",
          "channel_id": "e167def0-c4f0-46e2-aaa9-50046f13b0a7",
          "ramp_type": "deposit",
          "min_amount": 15001,
          "max_amount": 3000000,
          "settlement_type": "instant",
          "settlement_seconds": 60,
          "country": "UG",
          "status": "active",
          "provider": "alpha"
        },
        {
          "id": "04a3083a-567c-4a2b-aa39-fa8f19e64341-withdraw",
          "network_id": "04a3083a-567c-4a2b-aa39-fa8f19e64341",
          "network_name": "Airtel Mobile Money",
          "network_code": "AIRTEL_UGANDA",
          "channel_type": "momo",
          "channel_id": "e573694c-d9d2-4511-8dec-aa633baf19f3",
          "ramp_type": "withdraw",
          "min_amount": 15001,
          "max_amount": 3000000,
          "settlement_type": "instant",
          "settlement_seconds": 60,
          "country": "UG",
          "status": "active",
          "provider": "alpha"
        }
      ]
    }
  },
  "metadata": { "version": "1.0.0", "last_updated": "2026-10-16T12:42:21Z", "cache_ttl_seconds": 300 }
}
```

### Top-level fields

| Field | Meaning |
| --- | --- |
| `country`, `currency` | The country and its local currency. Send this `currency` in payins and payouts. |
| `has_networks` | `false` when Payd has nothing in this country yet. |
| `rails` | Which kinds of payment work here: `momo` (mobile money), `bank` and `card`. |
| `provider_networks` | Networks, grouped by route. |
| `metadata.cache_ttl_seconds` | How long you can keep this response before you fetch it again. |

Each group in `provider_networks` is keyed by a route id, such as `alpha`. Route ids are names Payd gives its routes. They can change, so do not hard-code them or show them to users: loop over every group, as the examples do.

Other top-level fields are for the Payd Money App. Ignore them.

### Network fields

| Field | Meaning |
| --- | --- |
| `network_name` | The name to show your user, such as `Airtel Mobile Money` or a bank name. |
| `network_id` | Send as `provider_config.network_id`. The same for collections and payouts on one network. |
| `channel_id` | Send as `provider_config.channel_id`. It differs between `deposit` and `withdraw`, so take it from the entry you use. |
| `network_code` | A readable code for the network. Handy in logs. |
| `channel_type` | `momo`, `bank`, `eft` (a bank in South Africa) or `card`. |
| `ramp_type` | `deposit` for collections, `withdraw` for payouts. |
| `min_amount`, `max_amount` | Limits in the local currency. `0` means Payd has no limit on file, and the network's own limits apply. |
| `settlement_type` | How the network finishes a payment: `instant`, `same_day`, `next_business_day`, `manual` (a bank processes it by hand) or `delayed`. Empty when Payd has no estimate. Treat a value you do not know as slow. |
| `settlement_seconds` | About how long a payment takes to finish, in seconds. `0` when Payd has no estimate. |
| `status` | Use only `active` entries. |
| `provider` | The route id of the group. You never need to send it. |

These fields are the source of truth for which networks you can use, their limits and how long they take. Other pages in these docs show snapshots of them.

The same network appears once for each direction. To list the mobile money networks a customer can pay with, keep `deposit` entries where `channel_type` is `momo`. To list where you can send money, keep `withdraw` entries.

## Countries

| Country | Code | Currency | Collect with mobile money | Collect by bank transfer | Pay out to mobile money | Pay out to banks |
| --- | --- | --- | --- | --- | --- | --- |
| Kenya | `KE` | `KES` | M-Pesa | Yes | M-Pesa | Yes |
| Uganda | `UG` | `UGX` | Yes | | Yes | |
| Tanzania | `TZ` | `TZS` | Yes | Yes | Yes | Yes |
| Rwanda | `RW` | `RWF` | Yes | | Yes | |
| Zambia | `ZM` | `ZMW` | Yes | | Yes | |
| Nigeria | `NG` | `NGN` | | Yes | | Yes |
| South Africa | `ZA` | `ZAR` | | | | Yes |
| Botswana | `BW` | `BWP` | Yes | Yes | Yes | Yes |
| Ethiopia | `ET` | `ETB` | | | | Yes |
| Côte d'Ivoire | `CI` | `XOF` | Yes | | Yes | |
| Senegal | `SN` | `XOF` | Yes | | Yes | |
| Cameroon | `CM` | `XAF` | Yes | | Yes | |
| Benin | `BJ` | `XOF` | Yes | | Yes | |
| Togo | `TG` | `XOF` | Yes | | Yes | |

Card payments are not tied to a country. See [card payments](./card-payments.md).

## Kenya

Kenya works without discovery. For M-Pesa, send `provider_config` as `{}` and Payd picks the route. See [collect with M-Pesa](./kenya-payins.md) and [pay out with M-Pesa](./kenya-payouts.md). Use discovery in Kenya to list banks for payouts.

## Tips

- Cache the response for `cache_ttl_seconds`, then fetch it again. Networks and limits change.
- Check the amount against `min_amount` and `max_amount` before you send it, so your user sees a clear message.
- Use `settlement_seconds` to tell your user how long to expect. See [limits and settlement](./limits-and-settlement.md).
- Banks are listed one per bank, and Nigeria has hundreds. Offer a search box.
