Skip to content

How Global routing works

Global Payments cover the rest of the world (outside the Kenya V1 flow) through a single unified endpoint: POST /api/global/payments. The same request shape handles both collections (request_type: payment) and payouts (request_type: withdrawal) across countries — KE, TZ, ZM, BW, NG, and more.

Global payments are discovery-driven. Before creating a payment, you call the Discovery API to learn how to route it for the customer’s country. The discovery response tells you which provider, network, and channel to use, and you copy those values into your payment request.

  1. Discover available rails, providers, and networks for the country.
  2. Pick a provider and the matching network/channel details.
  3. Create the payment, passing those details in provider, provider_config, and vendor_config.
  4. Receive the final result on your callback URL.
Terminal window
curl "$PH_BASE_URL/api/global/discovery/payment-world/country?country=KE" \
-u "$PH_API_USERNAME:$PH_API_PASSWORD"

The response describes the routing options:

{
"rails": { "bank": true, "card": false, "momo": true },
"country": "KE",
"currency": "KES",
"available_providers": {
"bank": ["i&m", "absa", "equity", "dtb", "standard_chartered", "stanbic", "kcb"],
"momo": ["bitlipa", "yellowcard", "m-pesa", "mpesa_dc", "sasapay"]
},
"provider_networks": {
"m-pesa": [
{ "network_id": "m-pesa", "channel_id": "m-pesa", "network_code": "MPESA", "min_amount": 1, "max_amount": 150000 }
]
}
}
Discovery field Payment request field
available_providers.* provider
rails key (momo/bank/card) transaction_channel
provider_networks[provider].network_id provider_config.network_id
provider_networks[provider].channel_id provider_config.channel_id