Share anywhere
Send a link by SMS, WhatsApp or email, or print its QR code at the till. The checkout page works on any phone and asks only for what the payment needs.
Payment links
Create a link, share it or print its QR code. Customers pay on a hosted checkout page by M-Pesa or card, and the money lands in your own account.
Send a link by SMS, WhatsApp or email, or print its QR code at the till. The checkout page works on any phone and asks only for what the payment needs.
Set a fixed price, or let customers enter an amount between a minimum and maximum you choose. Pick the channels each link accepts and where customers go after paying.
Checkout keeps the customer's attempt and its idempotency key when a connection fails, so pressing pay again recovers the first payment instead of starting a second one.
Every payment through a link is recorded against it. The dashboard shows the paid count, total collected and recent activity for each link, and link payments send the same signed webhooks as API payments.
In code
The response carries the hosted checkout URL to share or print as a QR code.
Full API referencecurl https://pay.noria.co.ke/v1/payment-links \
-H "Authorization: Bearer $NORIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Kahawa water, November",
"currency": "KES",
"amount_minor": 150000,
"channels": ["mpesa", "card"],
"reference": "KAHAWA-NOV"
}' const response = await fetch("https://pay.noria.co.ke/v1/payment-links", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NORIA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"title": "Kahawa water, November",
"currency": "KES",
"amount_minor": 150000,
"channels": ["mpesa", "card"],
"reference": "KAHAWA-NOV"
}),
});
const result = await response.json(); import os
import requests
result = requests.post(
"https://pay.noria.co.ke/v1/payment-links",
headers={
"Authorization": f"Bearer {os.environ['NORIA_API_KEY']}",
},
json={
"title": "Kahawa water, November",
"currency": "KES",
"amount_minor": 150000,
"channels": ["mpesa", "card"],
"reference": "KAHAWA-NOV",
},
timeout=30,
).json() <?php
$ch = curl_init('https://pay.noria.co.ke/v1/payment-links');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('NORIA_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Kahawa water, November',
'currency' => 'KES',
'amount_minor' => 150000,
'channels' => ['mpesa', 'card'],
'reference' => 'KAHAWA-NOV',
]),
]);
$result = json_decode(curl_exec($ch), true); body, _ := json.Marshal(map[string]any{
"title": "Kahawa water, November",
"currency": "KES",
"amount_minor": 150000,
"channels": []any{"mpesa", "card"},
"reference": "KAHAWA-NOV",
})
req, _ := http.NewRequest("POST", "https://pay.noria.co.ke/v1/payment-links", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("NORIA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req) The response carries the hosted checkout URL to share or print as a QR code.
Something else? Ask us.
No. They open the link, enter their phone number or card details and pay.
Yes. Deactivate it from the dashboard or the API and it stops accepting payments immediately.
Yes. Anonymous checkout is limited per IP address, link and phone number before any payment is requested, which keeps a shared link from being used to spam prompts.
Tell us what you are building and which providers you use. We set up your workspace and help you go live.