How Global routing works
Global Payments move money across countries through one endpoint:
POST /api/global/payments. The same request shape handles collections
(request_type: payment) and payouts (request_type: withdrawal).
Every global payment is discovery-driven. Before paying, you ask discovery what the country supports, then copy the network you choose into the request.
- Discover the rails, providers and networks for the country.
- Choose a rail, a provider on it, and a network in the right direction.
- Map that network onto
provider_config. - Create the payment and wait for the callback.
New to the API? The Integration guide walks the whole path in order.
1. Discover
Section titled “1. Discover”curl "$PH_BASE_URL/api/global/discovery/discover-rails?country=UG" \ -u "$PH_API_USERNAME:$PH_API_PASSWORD"<?php$ch = curl_init("$baseUrl/api/global/discovery/discover-rails?country=UG");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_USERPWD => "$username:$password",]);$discovery = json_decode(curl_exec($ch), true);curl_close($ch);import requests
discovery = requests.get( f"{base_url}/api/global/discovery/discover-rails", auth=(username, password), params={"country": "UG"},).json()const auth = Buffer.from(`${username}:${password}`).toString("base64");
const response = await fetch( `${baseUrl}/api/global/discovery/discover-rails?country=UG`, { headers: { Authorization: `Basic ${auth}` } },);
const discovery = await response.json();The response, trimmed to one provider’s networks:
{ "country": "UG", "currency": "UGX", "rails": { "bank": false, "card": true, "crypto": false, "momo": true }, "available_providers": { "card": ["vabupay"], "momo": ["yc"] }, "provider_networks": { "yc": [ { "network_id": "04a3083a-567c-4a2b-aa39-fa8f19e64341", "network_name": "Airtel Mobile Money", "network_code": "AIRTEL_UGANDA", "channel_id": "e167def0-c4f0-46e2-aaa9-50046f13b0a7", "channel_type": "momo", "account_type": "phone", "ramp_type": "deposit", "min_amount": 15000, "max_amount": 3000000, "provider": "yc", "status": "active" }, { "network_id": "04a3083a-567c-4a2b-aa39-fa8f19e64341", "network_name": "Airtel Mobile Money", "network_code": "AIRTEL_UGANDA", "channel_id": "e573694c-d9d2-4511-8dec-aa633baf19f3", "channel_type": "momo", "account_type": "phone", "ramp_type": "withdraw", "min_amount": 15000, "max_amount": 3000000, "provider": "yc", "status": "active" } ] }, "required_fields": { "yc": { "provider_config": { "channel_id": true, "network_code": true, "network_id": true, "network_name": true } }, "vabupay": { "customer": { "email": true, "first_name": true, "last_name": true, "phone": true }, "redirect_url": true } }, "provider_operations": { "yc": { "b2c": true, "c2b": true }, "vabupay": { "b2c": false, "c2b": true } }}Reading it
Section titled “Reading it”rails— only rails that aretruecan be used, and a rail istrueonly when a provider you are assigned actually offers it.available_providers— provider codes, keyed by rail.provider_networks— each provider’s networks. A network appears once per direction: the same Airtel network above has adepositentry and awithdrawentry, with differentchannel_ids.required_fields— what each provider rejects a payment without. Treat it as the checklist for that provider’sprovider_config,customerand URLs.provider_operations—c2bmeans the provider can collect,b2cthat it can pay out.
The answer only covers providers assigned to your account — an account with none discovers nothing. See the Integration guide.
2. Map the network onto the request
Section titled “2. Map the network onto the request”| Request field | Take it from | Example |
|---|---|---|
transaction_channel |
The rail you chose | momo |
provider |
A code from available_providers[rail] |
yc |
provider_config.network_id |
The network’s network_id |
04a3083a-567c-4a2b-aa39-fa8f19e64341 |
provider_config.network_name |
The network’s network_name |
Airtel Mobile Money |
provider_config.network_code |
The network’s network_code |
AIRTEL_UGANDA |
provider_config.channel_id |
The network’s channel_id, for the right ramp_type |
e167def0-c4f0-46e2-aaa9-50046f13b0a7 |
provider_config.account_type |
The network’s channel_type |
momo |
network_id and network_code are different values — send each exactly as
discovery gives it. Send only what is in the network and what required_fields
asks for; vendor_config.channel_id applies only to Kenya collections that settle
to a local bank, paybill or till.
3. Amounts and currencies
Section titled “3. Amounts and currencies”Send amount and currency in the country’s currency — the currency in the
discovery response — with at most two decimal places. Stay within the
network’s min_amount and max_amount.

