Developers

Built for developers
who move fast.

REST API, HMAC-signed webhooks, and a full sandbox that covers every payment channel. Go from keys to a working integration in an afternoon.

api.uveruspayments.com/v1/checkout/sessions cURL
curl -X POST https://api.uveruspayments.com/v1/checkout/sessions \ -H "Authorization: Bearer sk_test_xxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d { "amount": 50000, "currency": "NGN", "customer_email": "customer@example.com", "reference": "order_20260523_001", "callback_url": "https://myapp.com/payment/done", "metadata": { "user_id": "usr_8821" } } # Response { "status": "success", "checkout_url": "https://checkout.uveruspayments.com/c/sess_xK9mN3", "reference": "order_20260523_001", "expires_at": "2026-05-23T14:30:00Z" }
REST API · /api/v1/
HMAC-signed webhooks
Full sandbox mode
Test + Live key pairs
Idempotent delivery
Quick start

Three steps to your first payment.

01 · Get keys
Create your account and grab API keys

Every account gets a test key pair instantly. No KYC required to start building in sandbox mode.

sk_test_xK9mN3pQrT8vY... test
02 · Create session
POST a checkout session to get a hosted URL

Pass the amount, currency, reference, and callback URL. Redirect your customer to the returned checkout_url.

03 · Handle webhook
Listen for the payment.successful event

Uverus delivers a signed webhook to your endpoint when payment completes. Verify the HMAC signature and fulfil the order.

REST API

Predictable.
Versioned. Fast.

All endpoints live under /api/v1/. JSON in, JSON out. Consistent error shapes across every resource.

  • Versioned base path — no breaking changes to existing integrations
  • Consistent error objects with machine-readable codes
  • API key authentication — public key for client, secret key for server
  • Reference prefix customisation per merchant
  • Metadata passthrough on checkout sessions
Full API reference →
Verify a payment Node.js
import Uverus from '@uverus/node'; const client = new Uverus({ secretKey: process.env.UVERUS_SECRET_KEY, }); // Verify payment on callback const payment = await client.payments.verify( req.query.reference ); if (payment.status === 'successful') { // Fulfil order await fulfillOrder(payment.reference); res.redirect('/thank-you'); }
Webhooks

Signed payloads.
Reliable delivery.

Every webhook is signed with HMAC-SHA256 using your merchant secret. Automatic retry on failure, with a full delivery log in your dashboard.

  • HMAC-SHA256 signature on every payload
  • Automatic retry with failure counter and last-delivery tracking
  • Full webhook log viewer in the dashboard
  • Per-event endpoint configuration
  • Idempotent delivery — safe to process multiple times
Verify webhook signature Node.js
import crypto from 'crypto'; function verifyWebhook(payload, sig, secret) { const hash = crypto .createHmac('sha256', secret) .update(payload) .digest('hex'); return hash === sig; }
Event Triggered when
payment.successful Payment completes successfully
payment.failed Payment attempt fails
transfer.completed Payout transfer settles
transfer.failed Payout transfer is rejected
Sandbox mode

Test every payment
flow before going live.

Card
Card payments

Use test card numbers to simulate success, failure, OTP, PIN challenges, and 3DS redirects.

4084 0840 8408 4084 success
4084 0840 8408 4085 declined
5078 5010 3408 4113 3DS redirect
Bank Transfer
Virtual account

A virtual account number is generated. Trigger a mock transfer completion via the dashboard or a test endpoint — no real bank involved.

# Simulate transfer receipt POST /v1/sandbox/trigger-transfer { "reference": "order_001", "amount": 50000 }
USSD
USSD payments

The sandbox returns a mock USSD string and allows you to simulate completion, expiry, and abandon states — no network required.

*737*000*123# success
*737*000*456# timeout
Start building
Get API keys.
Build today.