# Limits and settlement times

Each payment channel has a smallest and a largest amount per payment, and takes its own time to finish.

::: warning The API is the source of truth
Read limits and settlement times from [payment options by country](./network-discovery.md) before each payment, and build your checkout from what it returns. The tables on this page are a snapshot from 16 October 2026 to help you plan. They go out of date, so do not hard-code them. When the API and this page disagree, the API is right.
:::

## Read them from the API

Every network in [payment options by country](./network-discovery.md) carries its own limits and timing:

| Field | Meaning |
| --- | --- |
| `min_amount`, `max_amount` | The limits for that network, in the local currency. `0` means Payd has no limit on file, and the network's own limits apply. |
| `settlement_seconds` | About how long a payment takes to finish, in seconds. `0` when Payd has no estimate. |
| `settlement_type` | How it finishes: `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. |

::: code-group

```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)
  .filter((n) => n.ramp_type === 'deposit' && n.status === 'active')

for (const n of networks) {
  const limit = n.max_amount ? `${n.min_amount} to ${n.max_amount}` : `from ${n.min_amount}`
  const time = n.settlement_seconds ? `about ${Math.ceil(n.settlement_seconds / 60)} min` : 'no estimate'
  console.log(`${n.network_name}: ${options.currency} ${limit}, ${time}`)
}
```

```python [Python]
import math
import os
import requests

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

for group in (options.get("provider_networks") or {}).values():
    for n in group["networks"]:
        if n["ramp_type"] != "deposit" or n["status"] != "active":
            continue
        seconds = n.get("settlement_seconds") or 0
        limit = f"{n['min_amount']} to {n['max_amount']}" if n.get("max_amount") else f"from {n['min_amount']}"
        time = f"about {math.ceil(seconds / 60)} min" if seconds else "no estimate"
        print(f"{n['network_name']}: {options['currency']} {limit}, {time}")
```

:::

The API also checks every amount when you send a payin or payout, and refuses one outside the limits. Cache the response for `metadata.cache_ttl_seconds`, then fetch it again.

"Finish" means Payd knows the result and sends the [webhook](./webhooks.md). For a collection, the money is in your Payd balance at that point, except for cards.

## Snapshot: 16 October 2026

The tables below are what the API returned on 16 October 2026. Use them to plan, then read the live values as shown above. Where a time says "Read `settlement_seconds`", Payd had no estimate for that country on that date.

### M-Pesa in Kenya

| | Per payment | Typical time |
| --- | --- | --- |
| Collect | KES 1 to 250,000 | Under a minute after the customer enters their PIN |
| Pay out | KES 10 to 150,000 | Under a minute |

The customer has about a minute to approve a collection prompt before it fails. M-Pesa also caps how much a customer can send in a day, so a large payment can fail even inside these limits.

### Mobile money

| Country | Collect | Pay out | Typical time |
| --- | --- | --- | --- |
| Uganda | UGX 15,001 to 3,000,000 | UGX 15,001 to 3,000,000 | About a minute |
| Tanzania | TZS 2,501 to 10,000,000 | TZS 2,501 to 10,000,000 | Read `settlement_seconds` |
| Rwanda | RWF 1,501 to 10,000,000 | RWF 1,501 to 10,000,000 | Read `settlement_seconds` |
| Zambia | ZMW 101 to 20,000 | ZMW 101 to 20,000 | Read `settlement_seconds` |
| Côte d'Ivoire | Up to XOF 1,500,000 | Up to XOF 1,500,000 | About a minute |
| Senegal | XOF 1,001 to 200,000 | XOF 1,001 to 200,000 | Read `settlement_seconds` |
| Cameroon | Up to XAF 1,000,000 | Up to XAF 1,000,000 | Read `settlement_seconds` |
| Benin | Up to XOF 300,000 | Up to XOF 1,500,000 | Read `settlement_seconds` |
| Togo | Up to XOF 1,500,000 | Up to XOF 1,500,000 | Read `settlement_seconds` |
| Botswana | BWP 151 to 10,000 | BWP 151 to 10,000 | Read `settlement_seconds` |

Limits differ between networks in one country. In Côte d'Ivoire, for example, one network starts at XOF 1,001. Check the network the customer picked.

### Bank transfers

| Country | Collect | Pay out | Typical time |
| --- | --- | --- | --- |
| Kenya | KES 301 to 999,999 | KES 501 to 999,999 | Up to 2 days |
| Nigeria | NGN 501 to 30,000,000 | NGN 1,801 to 30,000,000 | About a minute |
| Tanzania | TZS 2,501 to 150,000,000 | TZS 2,501 to 150,000,000 | Read `settlement_seconds` |
| Botswana | From BWP 151 | BWP 151 to 1,000,000 | Read `settlement_seconds` |
| South Africa | | ZAR 101 to 500,000 | About a minute |
| Ethiopia | | The bank's own limits | Read `settlement_seconds` |

Some Nigerian banks start collections at NGN 2,501. Bank transfers marked "up to 2 days" are processed by hand, so they can finish the next business day. A collection by bank transfer also waits for the customer to send the money. See [collect by bank transfer](./bank-payins.md).

### Cards

| | Per payment | Typical time |
| --- | --- | --- |
| Collect | Set by the card issuer | Approved in seconds. The money reaches your balance 72 hours later. |

Payd sends `payin.succeeded` when the card payment is approved and `payin.settled` when the money is released to your balance. Ship on `payin.succeeded`. See [card payments](./card-payments.md).

### Stablecoins

| | Per payment | Typical time |
| --- | --- | --- |
| Collect | More than USD 0 and up to USD 1,000,000 | A few minutes, once the network confirms the transfer |

The customer has 30 minutes to send the payment. Your Payd balance is credited when the checkout completes. Stables Checkout checks the amount when you create a checkout. See [collect stablecoin payments](./stablecoin-payments.md).

## Your account limits

Your Payd account can also have limits of its own. If a payment inside the limits above is refused, the error message says why. Email [support@paydhq.com](mailto:support@paydhq.com) to change your account limits.
