M-Pesa Daraja
STK push collections on a paybill or till, STK push status queries, B2C payouts and reversals, with Safaricom's security credential built for you.
Integrations
Connect the providers you already have accounts with. Pay normalises their requests, callbacks and statuses into one API, one webhook format and one ledger.
curl https://pay.noria.co.ke/v1/charges \
-H "Authorization: Bearer $NORIA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: invoice-1043" \
-d '{
"amount_minor": 120000,
"currency": "KES",
"channel": "airtel",
"provider": "sasapay",
"payer_phone": "254733123456",
"reference": "INV-1043",
"description": "BillGrid invoice INV-1043"
}' const response = await fetch("https://pay.noria.co.ke/v1/charges", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NORIA_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "invoice-1043",
},
body: JSON.stringify({
"amount_minor": 120000,
"currency": "KES",
"channel": "airtel",
"provider": "sasapay",
"payer_phone": "254733123456",
"reference": "INV-1043",
"description": "BillGrid invoice INV-1043"
}),
});
const result = await response.json(); import os
import requests
result = requests.post(
"https://pay.noria.co.ke/v1/charges",
headers={
"Authorization": f"Bearer {os.environ['NORIA_API_KEY']}",
"Idempotency-Key": "invoice-1043",
},
json={
"amount_minor": 120000,
"currency": "KES",
"channel": "airtel",
"provider": "sasapay",
"payer_phone": "254733123456",
"reference": "INV-1043",
"description": "BillGrid invoice INV-1043",
},
timeout=30,
).json() <?php
$ch = curl_init('https://pay.noria.co.ke/v1/charges');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('NORIA_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: invoice-1043',
],
CURLOPT_POSTFIELDS => json_encode([
'amount_minor' => 120000,
'currency' => 'KES',
'channel' => 'airtel',
'provider' => 'sasapay',
'payer_phone' => '254733123456',
'reference' => 'INV-1043',
'description' => 'BillGrid invoice INV-1043',
]),
]);
$result = json_decode(curl_exec($ch), true); body, _ := json.Marshal(map[string]any{
"amount_minor": 120000,
"currency": "KES",
"channel": "airtel",
"provider": "sasapay",
"payer_phone": "254733123456",
"reference": "INV-1043",
"description": "BillGrid invoice INV-1043",
})
req, _ := http.NewRequest("POST", "https://pay.noria.co.ke/v1/charges", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("NORIA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "invoice-1043")
res, err := http.DefaultClient.Do(req) Name the provider and channel, or leave the provider out and let routing pick an enabled method.
STK push collections on a paybill or till, STK push status queries, B2C payouts and reversals, with Safaricom's security credential built for you.
M-Pesa, Airtel Money and wallet collections; payouts to M-Pesa, Airtel Money, banks and wallets; balances, refunds and confirmed payment notifications.
M-Pesa collections and payouts to M-Pesa and bank accounts, with signed callbacks and payment notifications.
Card and M-Pesa collections, verified transactions, refunds and balances.
Something else? Ask us.
Yes. Pay uses your own credentials with each provider. Noria has no platform account that your money passes through.
Routing picks an enabled method in the right mode that supports the channel and currency, in the priority order you set. You can also name the provider on a request.
Yes. Providers are adapters behind one interface, and a new one appears in the dashboard without dashboard changes. Request access and tell us which provider you need.
Tell us what you are building and which providers you use. We set up your workspace and help you go live.