One API. All bills
The API layer for modern payments
Ureh gives developers and businesses one API for airtime, data, cable TV, electricity, education, betting, and insurance payments with wallets, transactions, and webhooks built in, so you can ship bill payments without building the infrastructure yourself.
Already building with Ureh? Sign in to the Developer Console
Request
Authorization: Bearer sk_••••••••••••c93f
Content-Type: application/json
{
"client_id": "URH-8F2C91A4D6B0E37F1A",
"biller": "MTN",
"recipient": "08012345678",
"amount": 500,
"idempotency_key": "5c2f9e2a-6b7a-4b31-9d3a-df2b6c9a4e10"
}
Response 202 Accepted
{
"status": "pending",
"code": "PROCESSING",
"message": "Transaction accepted.",
"data": {
"reference": "20246063015832257676576215",
"recipient": "08012345678",
"biller": "MTN",
"amount": 500,
"channel": "API_GATEWAY",
"currency": "NGN",
"created_at": "2024-08-25 14:32:07"
}
}
Platform
Everything you need to build and ship
One account, one credential, and one integration path, the same eight steps behind every bill payment product Ureh supports.
Product platform
What you can build
Airtime, data, cable TV, electricity, education, betting and insurance payments.
/api/v1/airtime/purchase
- Airtime Programmatic airtime top-ups across major networks.
- Data Programmatic data bundle purchases.
- Cable TV Cable subscription payments and renewals.
- Electricity Prepaid and postpaid electricity bill payments.
- Education Education-related bill payments.
- Betting Funding for betting and gaming wallets.
- Insurance Insurance premium payments and renewals.
Wallet funding, balances and transaction processing.
- Wallet Funding, balances and ledger-backed debits/credits.
- Transactions Processing, status verification and history.
API credentials, authentication, webhooks and access controls.
- API Keys Issue, rotate and manage API credentials.
- Authentication Secure, bearer-token API authentication.
- Webhooks Receive, verify and track transaction events.
- Rate Limiting Control and monitor API request rates.
- IP Whitelisting Restrict API access to trusted addresses.
Developer journey
From API key to first transaction
-
01
Step 01
Create account
Register a developer account in the Ureh Developer Console.
POST /register -
02
Step 02
Generate API credentials
Issue your public/secret key pair from the API Keys page.
pk_ / sk_ key pair -
03
Step 03
Fund wallet
Fund your wallet before initiating any paid transaction.
wallet.credit -
04
Step 04
Authenticate API request
Every request carries your Secret Key as a bearer token.
Authorization: Bearer sk_… -
05
Step 05
Make API request
Call the product endpoint for the service you want to sell.
POST /api/v1/airtime/purchase -
06
Step 06
Receive transaction response
The request is accepted and queued for processing.
202 Accepted · PROCESSING -
07
Step 07
Track transaction
Poll the transaction by its reference at any time.
GET /api/v1/transactions/status -
08
Step 08
Receive webhook event
Get notified the moment the transaction reaches a final state.
X-Ureh-Signature verified
API & code
The same request, in your language
Plain HTTP over a bearer token credential no SDK to install. Every example below sends the exact same request to the exact same endpoint.
# Authenticate with your Secret Key
curl -X POST https://api.ureh.io/v1/airtime/purchase \
-H "Authorization: Bearer sk_••••••••••••c93f" \
-H "Content-Type: application/json" \
-d '{
"client_id": "URH-8F2C91A4D6B0E37F1A",
"biller": "MTN",
"recipient": "08012345678",
"amount": 500,
"idempotency_key": "5c2f9e2a-6b7a-4b31-9d3a-df2b6c9a4e10"
}'
<?php
// plain cURL — no client library required
$payload = [
'client_id' => 'URH-8F2C91A4D6B0E37F1A',
'biller' => 'MTN',
'recipient' => '08012345678',
'amount' => 500,
'idempotency_key' => '5c2f9e2a-6b7a-4b31-9d3a-df2b6c9a4e10',
];
$ch = curl_init('https://api.ureh.io/v1/airtime/purchase');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $UREH_SECRET_KEY,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// plain fetch — no client library required
const response = await fetch('https://api.ureh.io/v1/airtime/purchase', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.UREH_SECRET_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"client_id": "URH-8F2C91A4D6B0E37F1A",
"biller": "MTN",
"recipient": "08012345678",
"amount": 500,
"idempotency_key": "5c2f9e2a-6b7a-4b31-9d3a-df2b6c9a4e10"
}),
});
const data = await response.json();
Response 202 Accepted
{
"status": "pending",
"code": "PROCESSING",
"message": "Transaction accepted.",
"data": {
"reference": "20246063015832257676576215",
"recipient": "08012345678",
"biller": "MTN",
"amount": 500,
"channel": "API_GATEWAY",
"currency": "NGN",
"created_at": "2024-08-25 14:32:07"
}
}
Architecture
One API, one integration surface
Ureh sits between your application and every supported bill payment service you integrate once, against one contract.
Webhooks
Know the moment a transaction settles
Instead of polling /api/v1/transactions/status on a timer, register a
webhook endpoint and Ureh notifies your application the moment a transaction reaches
success or failed.
- Every webhook delivery includes an HMAC-SHA256 signature generated from the timestamp and request body.
- Failed deliveries retry automatically.
- Every delivery attempt is recorded and viewable in the Developer Console.
Headers
X-Ureh-Timestamp: 1785373930
X-Ureh-Signature: b254effa849fb3bf232dcaeaef5518da806a456f533982923c32ed7e31841ada
Content-Type: application/json
Body transaction.completed
{
"event": "transaction.completed",
"timestamp": "2024-08-25T14:32:10Z",
"signature_version": "v1",
"data": {
"reference": "20246063015832257676576215",
"status": "success",
"service_type": "VTU_AIRTIME",
"amount": 500,
"token": null,
"completed_at": "2024-08-25T14:32:10Z",
"metadata": {}
}
}
Shown formatted for readability — the signed raw body is compact JSON.
Security & API controls
Access controls that stay with the credential
Every control here is enforced by the API itself, not layered on top of it the same credential is authenticated, rate-limited and, optionally, IP-restricted on every call.
Account access is protected separately. Developer Console sign-in supports multi-factor authentication (MFA) and email OTP, configurable in your Security settings.
- Bearer-token authentication
- Every request authenticates with your Secret Key as a bearer token no session, no cookie.
- API credentials
- A public/secret key pair per account, rotatable from the Developer Console at any time.
- Rate limiting
- Requests are limited per IP and per API key by default, with a per-request Retry after on the response when exceeded.
- IP whitelisting
- Restrict your credentials to a set of trusted source IPs enforcement is opt-in per account.
- Webhook signing
- Every webhook delivery is signed HMAC-SHA256, so you can verify it originated from Ureh.
- Signature verification
- Test your own verification logic against a real signature from the Developer Console.
Developer Console
Manage every integration in one place
API credentials, wallet, transactions, webhooks, analytics, and your team, all from the same console your API calls use.
URH-9F2…C41A
Airtime · MTN
success
₦•••
URH-3B7…88E2
Data · Airtel
pending
₦•••
URH-6A1…52F0
Electricity · IKEDC
success
₦•••••
URH-4C8…17B9
JAMB · Profile
success
₦••••
URH-7D3…94E1
WAEC · Result Checker
success
₦••••
URH-2E6…63A7
Cable TV · DSTV
pending
₦••••
How it fits together
From this website to production
Developer experience
Integrate in minutes, not days
A simple, well documented API, official SDKs for the stacks you already use, and the tooling to test safely before you go live everything is built to get you from signup to your first live transaction fast.
Official SDKs
Native, idiomatic clients for the stacks you already build in. View SDK status →
- Node.js First-class support for modern JavaScript and TypeScript backends.
- PHP An idiomatic client for PHP applications and frameworks.
- Python An idiomatic client for Python services and data pipelines.
- Go A lightweight client for high-throughput Go services.
- Flutter Drop straight into your Flutter mobile app.
Also included
- Copy ready API examples — Real request/response examples in cURL, PHP and Node.js copy, paste, and make your first call.
-
Clear API documentation — Every endpoint, parameter and response shape, documented with real examples.
-
Sandbox testing — Test your full integration safely with sandbox credentials before you go live.
- Real-time webhooks — Signed, verifiable delivery the moment a transaction reaches a final state.
Build your payment experience on Ureh.
One credential, one API, every bill payment service your application needs.