NIBSS / NIP API
Integrate NIBSS / NIP through the KeyBS Pay unified /v1/payouts REST endpoint. Authentication, request/response, sandbox, webhooks, errors and rate limits.
NIBSS / NIP integrates through the same POST /v1/payouts endpoint used for every KeyBS Pay corridor — you set "method": "nibss" and the router selects the NIBSS / NIP rail. If NIBSS / NIP is unavailable for the beneficiary bank at the moment of payment, the router falls back to the next eligible rail unless "strict": true is specified.
Authentication is via a Bearer API key issued from the KeyBS Pay dashboard. Every request MUST include an Idempotency-Key so retries after transient errors are safe. Webhook payloads carry an HMAC-SHA256 signature you must verify with your webhook secret before acting on the event.
Sandbox mode is available end-to-end: keys prefixed sk_test_ hit the sandbox environment, produce deterministic responses for testing, and never move real money. Production sk_live_ keys unlock the NIBSS / NIP rail once your KYB is approved.
Corridor mechanics at a glance
Every KeyBS Pay payout follows the same operational contract; only the rail changes.
TL;DR — key takeaways
- POST /v1/payouts with method="nibss" routes through the NIBSS / NIP rail.
- Settlement: Real-time in NGN · countries: NG.
- Bearer-token auth · Idempotency-Key required · HMAC-signed webhooks.
- Rate limit: 600 req/min per API key · burst 60/s.
- Sandbox available via sk_test_ keys; production sk_live_ keys unlock the rail after KYB.
Request
POST https://api.keybs.io/v1/payouts
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Content-Type: application/json
{
"amount": { "value": "1000.00", "currency": "USD" },
"beneficiary": {
"name": "Acme Trading Ltd",
"account_number": "0123456789",
"country": "NG",
"currency": "NGN"
},
"method": "nibss",
"reference": "INV-2026-0001",
"purpose_code": "supplier_settlement",
"metadata": { "invoice_id": "INV-2026-0001" }
}Response
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "po_01HZY8V7BQXP5F3AR2E9N4S6K1",
"status": "approved",
"amount": { "value": "1000.00", "currency": "USD" },
"beneficiary_amount": { "value": "..." /* rail-specific FX */ },
"rail": "nibss",
"estimated_settlement": "seconds",
"reference": "INV-2026-0001",
"created_at": "2026-02-14T09:12:00Z"
}Webhook event
POST https://your-app.example/webhooks/keybs
X-KeyBS-Signature: t=1707902000,v1=<HMAC-SHA256(webhookSecret, timestamp + '.' + rawBody)>
Content-Type: application/json
{
"id": "evt_01HZY8V7BQXP5F3AR2E9N4S6K1",
"type": "payout.settled",
"data": {
"id": "po_01HZY8V7BQXP5F3AR2E9N4S6K1",
"rail": "nibss",
"status": "settled",
"settled_at": "2026-02-14T09:12:07Z"
}
}Error format
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
"error": {
"code": "beneficiary_verification_failed",
"message": "Beneficiary account not found on NIBSS / NIP",
"rail": "nibss",
"retryable": false
}
}Ask AI about the NIBSS / NIP API
Tap any question to open a KeyBS AI conversation prefilled with your query.
Ship your first NIBSS / NIP payout
Request sandbox access and test the /v1/payouts endpoint end-to-end.