Integrate with the Remita payment API for Nigerian billing, salary payments, collections, and transfers. Use this skill whenever the user wants to process bulk salary payments, handle billing payments, manage collections, initiate interbank transfers, generate payment reference numbers, or work with Remita's payment infrastructure. Also trigger when the user mentions 'Remita', 'Nigerian salary payments', 'bulk payroll', 'collections API', 'agency banking', 'bill payments Nigeria', or needs to process government or enterprise payments.
Remita is Nigeria's leading enterprise payment infrastructure, operated by SystemSpecs. It powers government salary payments (processing payroll for all Nigerian federal government employees), tax collections, and large-scale billing across the country. It serves as the backbone for Treasury Single Account (TSA) collections in Nigeria, making it the go-to platform for government and enterprise payments.
You're building a payroll system, a billing platform, an agency banking solution, or a collections management tool that needs to process payments at scale in Nigeria. Remita handles salary bulk disbursements, interbank transfers, payment collections, bill payments, airtime/data vending, and payment reference number generation — essential for HR platforms, government integrations, fintech apps, and enterprise payment systems.
Remita uses JWT and OAuth 2.0 for API authentication. All API requests require an access token in the Authorization header along with your API key:
Authorization: Bearer {access_token}
Content-Type: application/json
API-Key: {your_api_key}
Obtain credentials from your Remita merchant dashboard. Store them in environment variables like REMITA_API_KEY and REMITA_ACCESS_TOKEN. Never hardcode credentials.
Base URL: https://api.remita.net/api/v1
Sandbox URL: https://demo.remita.net/api/v1 (⚠️ Verify this before testing — Remita's sandbox URL has changed across API versions. The legacy sandbox was remitademo.net. If demo.remita.net returns errors, check the Remita developer portal for the current sandbox endpoint.)
Token Generation:
POST /auth/token
{
"username": "your_merchant_username",
"password": "your_merchant_password"
}
Response:
{
"status": "success",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
}
Create a payment transaction and receive a redirect URL or reference number. The payment initiation endpoint creates a transaction and returns a checkout URL.
POST /payments/initiate
Body:
{
"merchantId": "your_merchant_id",
"serviceTypeId": "your_service_type_id",
"orderId": "ORD-2025-0001",
"amount": 50000,
"payerName": "Amina Okafor",
"payerEmail": "[email protected]",
"payerPhone": "08012345678",
"description": "Invoice payment for consulting services",
"currency": "NGN",
"responseurl": "https://yoursite.com/payment/callback"
}
Important: Amount is in naira (whole units). ₦500 = 500. The orderId must be unique per transaction. The serviceTypeId identifies the specific service/product being paid for and is configured on your Remita dashboard.
Response:
{
"status": "success",
"data": {
"rrr": "310007769514",
"transactionId": "TXN_xxxxx",
"authorizationUrl": "https://remita.net/pay/310007769514",
"merchantId": "your_merchant_id",
"amount": 50000
}
}
The RRR (Remita Retrieval Reference) is Remita's unique transaction identifier. Redirect the customer to authorizationUrl or use the RRR for offline payment at any bank or Remita partner location.
Verify the status of a payment using the RRR.
GET /payments/status/{rrr}
Response (success):
{
"status": "success",
"data": {
"rrr": "310007769514",
"orderId": "ORD-2025-0001",
"paymentStatus": "00",
"paymentStatusDescription": "Successful",
"amount": 50000,
"currency": "NGN",
"paymentDate": "2025-02-15T14:30:00Z",
"transactionId": "TXN_xxxxx",
"payerName": "Amina Okafor",
"payerEmail": "[email protected]"
}
}
Always verify server-side after payment. paymentStatus === "00" means successful. Check amount matches your expected value.
Transfer funds from your Remita wallet to any Nigerian bank account.
POST /transfers/single
Body:
{
"amount": 100000,
"transactionRef": "TRF-2025-0001",
"destinationAccountNumber": "0123456789",
"destinationBankCode": "058",
"destinationAccountName": "Chinedu Adeyemi",
"sourceAccountNumber": "your_remita_account",
"narration": "Vendor payment for February"
}
Response:
{
"status": "success",
"data": {
"transactionRef": "TRF-2025-0001",
"transactionId": "TXN_xxxxx",
"status": "PROCESSING",
"amount": 100000,
"destinationBank": "GTBank"
}
}
Send bulk payments to multiple recipients in a single request — ideal for salary disbursements.
POST /transfers/bulk
Body:
{
"batchRef": "PAYROLL-2025-FEB",
"totalAmount": 5000000,
"sourceAccount": "your_remita_account",
"narration": "February 2025 Salary Disbursement",
"transactions": [
{
"amount": 500000,
"transactionRef": "SAL-EMP001-FEB",
"destinationAccountNumber": "0123456789",
"destinationBankCode": "033",
"destinationAccountName": "Amina Okafor",
"narration": "February 2025 Salary"
},
{
"amount": 500000,
"transactionRef": "SAL-EMP002-FEB",
"destinationAccountNumber": "9876543210",
"destinationBankCode": "044",
"destinationAccountName": "Chinedu Adeyemi",
"narration": "February 2025 Salary"
}
]
}
Response:
{
"status": "success",
"data": {
"batchRef": "PAYROLL-2025-FEB",
"batchId": "BATCH_xxxxx",
"totalRecords": 2,
"totalAmount": 5000000,
"status": "PROCESSING"
}
}
Processing is asynchronous. Use the batchRef to track status.
GET /transfers/bulk/{batchRef}
Response:
{
"status": "success",
"data": {
"batchRef": "PAYROLL-2025-FEB",
"status": "COMPLETED",
"totalRecords": 2,
"successful": 2,
"failed": 0,
"transactions": [
{
"transactionRef": "SAL-EMP001-FEB",
"amount": 500000,
"status": "SUCCESSFUL",
"destinationAccountName": "Amina Okafor"
}
]
}
}
Generate a reference number that customers can use to pay at any FawryPay-style retail location, bank branch, or POS terminal across Nigeria.
POST /payments/reference
Body:
{
"merchantId": "your_merchant_id",
"serviceTypeId": "your_service_type_id",
"orderId": "BILL-2025-0001",
"amount": 25000,
"payerName": "Fatima Ibrahim",
"payerEmail": "[email protected]",
"payerPhone": "08098765432",
"description": "Utility bill payment"
}
Response:
{
"status": "success",
"data": {
"rrr": "290007654321",
"orderId": "BILL-2025-0001",
"amount": 25000
}
}
The customer takes this RRR to any bank or Remita agent location to make payment. Status updates are sent via webhook.
Purchase airtime, data, electricity, and other utilities through Remita's vending API.
POST /vas/purchase
Body:
{
"serviceId": "AIRTIME_MTN",
"amount": 1000,
"recipientPhone": "08012345678",
"transactionRef": "VAS-2025-0001"
}
Response:
{
"status": "success",
"data": {
"transactionRef": "VAS-2025-0001",
"serviceId": "AIRTIME_MTN",
"amount": 1000,
"status": "DELIVERED",
"token": null
}
}
For electricity payments, the response includes a token field containing the meter recharge token.
GET /vas/services
Returns available bill payment categories and services: airtime, data, electricity, cable TV, internet, and more.
Remita sends webhook notifications for payment and transfer events. Configure your webhook URL on the Remita dashboard.
Webhook Payload:
{
"event": "payment.successful",
"data": {
"rrr": "310007769514",
"orderId": "ORD-2025-0001",
"amount": 50000,
"paymentDate": "2025-02-15T14:30:00Z",
"paymentStatus": "00"
}
}
Verify webhook signature:
const crypto = require('crypto');
const hash = crypto.createHmac('sha256', process.env.REMITA_WEBHOOK_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (hash === req.headers['x-remita-signature']) {
// Valid webhook — process the event
const { event, data } = req.body;
if (event === 'payment.successful' && data.paymentStatus === '00') {
// Fulfill order
}
}
Key events: payment.successful, payment.failed, payment.cancelled, transfer.successful, transfer.failed, bulk.completed, bulk.partial.
POST /payments/initiate with customer and service detailsGET /payments/status/{rrr} to verify, or listen for payment.successful webhookPOST /transfers/bulk with all employees and a unique batchRefGET /transfers/bulk/{batchRef} for completionbulk.completed webhookfailed transactions individually — retry or escalateGET /vas/services to list available servicesPOST /vas/purchase to execute the transactionPOST /payments/reference to generate RRRGET /payments/status/{rrr} for manual verificationRemita returns structured error responses:
{
"status": "error",
"message": "Invalid merchant ID",
"code": "AUTH_001"
}
Common errors:
orderId or transactionRefFor bulk operations, always check individual transaction statuses even if the batch succeeds. Some transactions in a batch may fail while others succeed.
orderId and transactionRef values. Duplicate submissions are rejected with a 409 error.demo.remita.net) before going live. Sandbox uses different credentials.