Skip to content

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.

  1. Discover the rails, providers and networks for the country.
  2. Choose a rail, a provider on it, and a network in the right direction.
  3. Map that network onto provider_config.
  4. Create the payment and wait for the callback.

New to the API? The Integration guide walks the whole path in order.

Terminal window
curl "$PH_BASE_URL/api/global/discovery/discover-rails?country=UG" \
-u "$PH_API_USERNAME:$PH_API_PASSWORD"

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 }
}
}
  • rails — only rails that are true can be used, and a rail is true only 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 a deposit entry and a withdraw entry, with different channel_ids.
  • required_fields — what each provider rejects a payment without. Treat it as the checklist for that provider’s provider_config, customer and URLs.
  • provider_operations — c2b means the provider can collect, b2c that it can pay out.

The answer only covers providers assigned to your account — an account with none discovers nothing. See the Integration guide.

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.

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.