Collect M-Pesa payments into any till, paybill or bank account.
Link your Buy Goods till, paybill or bank account, get your API keys, and send STK push requests with one call. Every payment is tracked on your dashboard and pushed to your server in real time.
POST https://norvionsolution.com/v1/stkpush
{
"account_id": "NRVJZ4D3TJZS8",
"secret_key": "sk_••••••••",
"phone": "0712345678",
"amount": 1500,
"reference": "INV-1001"
}
→ 200 OK
{
"success": true,
"data": {
"transaction_request_id": "TRX260924LH9GZ2DQFR",
"status": "pending"
}
}
Works with any collection account
One API, three kinds of destinations. Mix and match across as many linked accounts as you need.
Buy Goods till
The customer enters their PIN and the money lands straight in your till - no account number to key in.
Paybill
Each linked paybill gets its own account reference, so every payment is traceable back to your system.
Bank account
Collect straight into a bank account via its paybill, using the account number as the reference.
Everything you need to get paid
One integration for every kind of M-Pesa collection account.
Tills, paybills and banks
Link as many accounts as you need. Payments go straight to the number you link.
Instant STK push
The customer gets the M-Pesa PIN prompt on their phone. No paybill numbers to type.
Real-time webhooks
Results are sent to your server as soon as Safaricom confirms, signed and retried automatically.
Status checks
Missed a callback? Check any payment with its transaction request ID at any time.
Dashboard and reports
See every transaction, filter by account, status or date, and export to CSV.
Secure by default
Per-account secret keys, signed webhooks and key rotation from the dashboard.
Payment rotation
Split incoming payments across several destinations automatically, weighted however you choose.
Full audit trail
Every login, key rotation and account change is logged, so you always know what happened and when.
Clear documentation
A single, readable reference for every endpoint - no SDK required to get started.
Integrate in minutes
One HTTP call, from whatever you're already building with.
curl -X POST https://norvionsolution.com/v1/stkpush \
-H "Content-Type: application/json" \
-d '{
"account_id": "NRVJZ4D3TJZS8",
"secret_key": "sk_YOUR_SECRET_KEY",
"phone": "0712345678",
"amount": 1500,
"reference": "INV-1001"
}'$ch = curl_init('https://norvionsolution.com/v1/stkpush');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'account_id' => 'NRVJZ4D3TJZS8',
'secret_key' => 'sk_YOUR_SECRET_KEY',
'phone' => '0712345678',
'amount' => 1500,
'reference' => 'INV-1001',
]),
]);
$response = json_decode(curl_exec($ch), true);const res = await fetch('https://norvionsolution.com/v1/stkpush', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
account_id: 'NRVJZ4D3TJZS8',
secret_key: 'sk_YOUR_SECRET_KEY',
phone: '0712345678',
amount: 1500,
reference: 'INV-1001',
}),
});
const data = await res.json();import requests
response = requests.post('https://norvionsolution.com/v1/stkpush', json={
'account_id': 'NRVJZ4D3TJZS8',
'secret_key': 'sk_YOUR_SECRET_KEY',
'phone': '0712345678',
'amount': 1500,
'reference': 'INV-1001',
})
data = response.json()Why not just share your paybill number?
A manual paybill works, but STK push removes the guesswork - for you and the customer.
Manual paybill
- ✕ Customer types the paybill, account number and amount by hand
- ✕ Typos land money on the wrong reference
- ✕ You reconcile payments by checking your phone or bank SMS
- ✕ No automatic way to tell your app a payment succeeded
STK push with Norvion
- ✓ One API call sends the exact amount and reference straight to the prompt
- ✓ The customer only ever enters their M-Pesa PIN
- ✓ Every transaction is logged on your dashboard automatically
- ✓ A signed webhook tells your app the moment it's paid
Built for how Kenyan businesses get paid
Whatever you're collecting money for, it's one integration.
Online shops
Trigger a push the moment an order is placed and release it once the webhook confirms payment.
Subscriptions & billing
Collect recurring dues without asking customers to remember a paybill number every time.
Schools & institutions
Fee payments land on the right account reference every time, with a record for the bursar.
Delivery & logistics
Charge for a delivery on handover and confirm it instantly through the webhook.
Service providers
Send a payment request from the dashboard for one-off jobs - no code required.
Platforms & marketplaces
Link a different destination per seller or branch, and split collections with rotation.
Security you can trust
Built so a payment result can't be faked and your keys can't leak by accident.
HMAC-signed webhooks
Every callback to your server is signed with your account's own secret, so you can verify it's genuine.
Independently confirmed
Payment results are checked directly against Safaricom before your dashboard or webhook ever calls them successful.
Key rotation
Roll your secret key or webhook secret any time from the dashboard - the old one stops working immediately.
Full activity log
Logins, key changes and payment destination changes are all recorded and reviewable.
How it works
From sign-up to your first payment in three steps.
Create an account
Register with your email and log in to your dashboard.
Link your till, paybill or bank
You get an account ID and secret key for each one you link.
Send STK pushes
Call /v1/stkpush from your app, or request payments from the dashboard.
Ready to start collecting?
Create a free account and link your first till, paybill or bank account.