Developer documentation
API Reference
The Insureflow REST API lets insurance companies and brokers integrate premium collection, policy management, and settlement reporting directly into their own systems. Every endpoint below reflects the live API.
Overview
The API is organized around REST: predictable resource-oriented URLs, JSON request and response bodies, and standard HTTP verbs and status codes.
Base URL
https://api.insureflow.tech/api/v1https://sandbox.api.insureflow.tech/api/v1 (sandbox)Authentication
Every request other than onboarding and login carries Authorization: Bearer <token>, obtained from POST /auth/login. Tokens expire after 60 minutes — there is no refresh endpoint; log in again to get a new one.
Roles & permissions
Every account belongs to exactly one insurance company or one broker, and holds one of four roles. An Insureflow Admin operates the platform itself and isn't a counterparty you'll integrate as.
| Role | Scope |
|---|---|
| Insurance Company Admin | Manages one insurance company: creates policyholders and policies, assigns servicing brokers, sets the settlement account, and reads everything under that company. |
| Broker Admin | Manages one brokerage: creates staff logins, provisions the virtual account, and has full transacting access — collecting premiums, viewing reports, sending reminders. |
| Broker Staff | Same transacting access as Broker Admin, minus the ability to manage staff or the broker's own KYB details. |
Money & rate conventions
Every monetary amount is an integer number of kobo (₦1 = 100 kobo) — never a float. Every commission rate is an integer number of basis points (1 bps = 0.01%).
Idempotency
POST /payments and POST /payments/bulk require an Idempotency-Key header — a UUIDv4 you generate. Retrying the identical request with the same key is safe and returns the original result instead of initiating a second payment; reusing the key with a different body is rejected with 409.
Rate limiting
60 requests/minute per broker, 120 requests/minute per IP. Exceeding either returns 429.
Error responses
Errors are a JSON body of the shape { "detail": "..." }.
| Status | Meaning |
|---|---|
| 400 | Bad request — malformed input. |
| 401 | Missing or invalid Bearer token. |
| 403 | Authenticated, but your role lacks the required permission. |
| 404 | The resource doesn't exist, or doesn't belong to your organization. |
| 409 | Conflict — e.g. the Idempotency-Key was already used with a different request body. |
| 422 | Validation error — see detail for the specific field. |
| 429 | Rate limit exceeded — back off and retry. |
| 502 | Upstream payment gateway error — transient, safe to retry with a new Idempotency-Key. |
Authentication
Every insurance company and broker account activates once with a one-time token, then authenticates with a short-lived Bearer token for every subsequent call.
/auth/activateActivate a new account
Called once, after your organization has been approved and a one-time activation token has been issued to your contact email. Sets the account's password and marks it active. The token is single-use.
Request body
| Field | Type | Description |
|---|---|---|
| token* | string | The one-time activation token. |
| password* | string | Chosen password. |
HTTP 204 No Content on success.
/auth/loginObtain a Bearer token
Standard OAuth2 password flow. Sends credentials as application/x-www-form-urlencoded form data, not JSON.
Request body
| Field | Type | Description |
|---|---|---|
| username* | string | Account email address. |
| password* | string | Account password. |
Response
| Field | Type | Description |
|---|---|---|
| access_token | string | JWT Bearer token, valid 60 minutes. |
| token_type | string | Always "bearer". |
- Login is blocked while your organization (insurance company or broker) is pending, rejected, or suspended.
/auth/change-passwordChange your own password
Changes the password of the currently authenticated account.
Request body
| Field | Type | Description |
|---|---|---|
| current_password* | string | Current password, for verification. |
| new_password* | string | New password. |
Response
| Field | Type | Description |
|---|---|---|
| access_token | string | A fresh Bearer token (the old one stays valid until it expires). |
| token_type | string | Always "bearer". |
Insurance Companies
Onboarding is unauthenticated; every other endpoint requires an Insurance Company Admin Bearer token, scoped to that one company.
/insurance-companiesSubmit onboarding application
Registers a new insurance company. It starts in pending status and must be approved by an Insureflow operator before the contact email receives an activation token.
Request body
| Field | Type | Description |
|---|---|---|
| name* | string | Legal company name. |
| contact_email* | string | Primary admin contact email. |
Response
| Field | Type | Description |
|---|---|---|
| company | InsuranceCompanyOut | The created company record (see GET below for its full shape). |
| otp | string | One-time activation token — only ever returned here. Store or relay it immediately. |
/insurance-companies/{company_id}Get company details
Returns the current state of the insurance company record.
Path parameters
| Field | Type | Description |
|---|---|---|
| company_id* | UUID | The company's UUID. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Company UUID. |
| name | string | Legal name. |
| contact_email | string | Admin contact email. |
| status | string | pending | approved | rejected | suspended. |
| rejection_reason | string | null | Populated if rejected. |
| settlement_bank_code | string | null | null until a settlement account is set. |
| settlement_account_number | string | null | null until a settlement account is set. |
| settlement_account_name | string | null | null until a settlement account is set. |
| parent_company_id | UUID | null | Set only for a subsidiary under a parent organization grouping. |
| created_at | datetime | ISO 8601 UTC. |
/insurance-companies/{company_id}/brokersList brokers assigned to this company
Every broker with an active assignment to this insurer — the many-to-many relationship, not a fixed 1:1 broker.
Path parameters
| Field | Type | Description |
|---|---|---|
| company_id* | UUID | The company's UUID. |
Array of broker objects (same shape as the Brokers section's GET response).
/insurance-companies/{company_id}/settlement-accountSet settlement bank account
Registers the account Insureflow transfers premium proceeds into (net of commission) after each successful payment. Performs a live NIBSS name-enquiry lookup before saving — the response's settlement_account_name is whatever that lookup confirmed, never a value you supply directly.
Path parameters
| Field | Type | Description |
|---|---|---|
| company_id* | UUID | The company's UUID. |
Request body
| Field | Type | Description |
|---|---|---|
| bank_code* | string | 6-digit NIP institution code, e.g. GTBank = 000013. Not the 3-digit CBN code — see the Appendix. |
| account_number* | string | 10-digit NUBAN account number. |
Returns the updated company object.
- Required before settlement payouts fire. Payments can still be collected without it, but proceeds won't transfer until an account is on file.
- The NIBSS lookup is real even in sandbox — a dummy account number returns HTTP 424.
Brokers
Broker onboarding is initiated by the broker (unauthenticated). A broker must be approved by Insureflow and assigned to an insurer before it can create staff or transact against that insurer's policies.
/brokersSubmit broker onboarding application
Registers a new broker. Starts in pending status.
Request body
| Field | Type | Description |
|---|---|---|
| name* | string | Legal broker organization name. |
| contact_email* | string | Primary admin contact email. |
| bvn | string | Bank Verification Number — needed later to provision a virtual account, can be supplied here or via the Virtual Accounts endpoints. |
| phone_number | string | Contact phone number. |
Response
| Field | Type | Description |
|---|---|---|
| broker | BrokerOut | The created broker record. |
| otp | string | One-time activation token — only ever returned here. |
/brokers/{broker_id}Get broker details
Broker roles can only retrieve their own broker record.
Path parameters
| Field | Type | Description |
|---|---|---|
| broker_id* | UUID | The broker's UUID. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Broker UUID. |
| name | string | Broker name. |
| contact_email | string | Admin contact email. |
| status | string | pending | approved | rejected | suspended. |
| rejection_reason | string | null | Populated if rejected. |
| squad_va_number | string | null | The broker's own collection virtual account number, once provisioned. |
| squad_va_bank | string | null | Bank the virtual account is held at. |
| created_at | datetime | ISO 8601 UTC. |
/brokers/{broker_id}/insurersList insurers this broker works with
Every insurer with an active assignment to this broker.
Path parameters
| Field | Type | Description |
|---|---|---|
| broker_id* | UUID | The broker's UUID. |
Array of insurance company objects (same shape as the Insurance Companies section's GET response).
/brokers/{broker_id}/staffCreate a broker staff account
Creates an additional login under the same broker organization with the Broker Staff role — full transacting access, but cannot manage other staff accounts.
Path parameters
| Field | Type | Description |
|---|---|---|
| broker_id* | UUID | The broker's UUID. |
Request body
| Field | Type | Description |
|---|---|---|
| email* | string | Email for the new staff account. |
Response
| Field | Type | Description |
|---|---|---|
| otp | string | One-time activation token. Relay it to the new staff member — it is not stored and cannot be retrieved again. |
Policyholders
Policyholders are the insured individuals a policy covers. Creation is an Insurance Company Admin action — a broker is assigned as the servicing broker on each policyholder, but doesn't create the record itself. The API path is /users for historical reasons; the schema below is what it actually returns.
/usersCreate a policyholder
full_name is the only required field; the rest improve reminder delivery and identity verification.
Request body
| Field | Type | Description |
|---|---|---|
| broker_id* | UUID | The broker who will service this policyholder — must have an active assignment to your company. |
| full_name* | string | Full legal name. |
| string | For payment reminders. | |
| phone_number | string | Local format, e.g. 08012345678. |
| identification_number | string | Government ID (NIN, passport, etc.) — encrypted at rest. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Policyholder UUID — required to create a policy. |
| broker_id | UUID | The servicing broker. |
| insurance_company_id | UUID | The underwriting company. |
| broker_name | string | Denormalized broker name, for display. |
| insurance_company_name | string | Denormalized company name, for display. |
| full_name | string | As provided. |
| string | null | null if not provided. | |
| phone_number | string | null | null if not provided. |
| identification_number | string | null | null if not provided. Masked in most UI surfaces, plaintext over the API to the owning tenant. |
| created_at | datetime | ISO 8601 UTC. |
/users/{policyholder_id}Get a policyholder
Path parameters
| Field | Type | Description |
|---|---|---|
| policyholder_id* | UUID | The policyholder's UUID. |
Same shape as the create response above.
/usersList policyholders
An Insurance Company Admin sees every policyholder across their assigned brokers by default; a broker sees only their own.
Query parameters
| Field | Type | Description |
|---|---|---|
| broker_id | UUID | Narrow to one broker. Broker roles may only pass their own broker_id. |
Array of policyholder objects.
Policies
A policy records a policyholder's cover terms. Creating one auto-generates a rolling window of 12 upcoming installment rows in due status — one per payment period. Creation is an Insurance Company Admin action, naming which broker services the policy.
/policiesCreate a policy
Request body
| Field | Type | Description |
|---|---|---|
| policyholder_id* | UUID | The covered policyholder. |
| broker_id* | UUID | The broker servicing this policy — must have an active assignment to your company. |
| reference_number* | string | Your own unique debit-note / policy reference. |
| premium_amount_kobo* | integer | Premium per payment period, in kobo. Must be > 0. |
| premium_frequency* | string | monthly | quarterly | annually. |
| start_date* | date | ISO 8601 (YYYY-MM-DD). The first installment's due date is derived from this. |
| policy_type | string | Open string label. Defaults to GENERIC — any value is accepted (LIFE, MOTOR, HEALTH, ...). |
| policy_name | string | Optional display name for the policy. |
| duration_months | integer | Optional cover duration. |
| coverage_amount_kobo | integer | Optional sum insured, in kobo. |
| coverage_items | string | Optional free-text coverage detail. |
| beneficiaries | string | Optional free-text beneficiary list. |
| broker_notes | string | Optional notes visible to the servicing broker. |
| internal_tags | string | Optional comma-separated tags. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Policy UUID — required to list installments. |
| policyholder_id / broker_id / insurance_company_id | UUID | The three parties. |
| reference_number | string | Your supplied reference. |
| policy_type | string | Type label. |
| premium_amount_kobo | integer | Per-period premium in kobo. |
| premium_frequency | string | monthly | quarterly | annually. |
| start_date | date | Policy start date. |
| status | string | active | cancelled. |
| policyholder_name / broker_name / insurance_company_name | string | Denormalized names, for display. |
| created_at | datetime | ISO 8601 UTC. |
/policies/{policy_id}Get a policy
Path parameters
| Field | Type | Description |
|---|---|---|
| policy_id* | UUID | The policy's UUID. |
Same shape as the create response above.
/policiesList policies
user_id narrows to one policyholder's policies; omitted returns every policy you can see.
Query parameters
| Field | Type | Description |
|---|---|---|
| user_id | UUID | Narrow to one policyholder. |
Array of policy objects.
/policies/{policy_id}/installmentsList a policy's installments
The full installment schedule for one policy, in due-date order.
Path parameters
| Field | Type | Description |
|---|---|---|
| policy_id* | UUID | The policy's UUID. |
Array of installment objects — see the Installments section for the full field list.
Installments
Each due date on a policy is its own installment row. Premiums are never auto-debited — a broker must explicitly initiate payment against a due or overdue installment_id.
/installmentsList installments
Scoped to everything you can see: your whole tenant for an insurer, your own broker's book across every insurer you work with for a broker (narrow with insurer_id).
Query parameters
| Field | Type | Description |
|---|---|---|
| status | string | due | overdue | paid | cancelled. |
| policy_type | string | Filter by the policy's type label. |
| ids | string | Comma-separated installment UUIDs — fetch an exact set in one call. |
| insurer_id | UUID | Broker roles only: narrow to one insurer. |
Response (array item fields)
| Field | Type | Description |
|---|---|---|
| id | UUID | Installment UUID — the value POST /payments and POST /payments/bulk take. |
| policy_id | UUID | The parent policy. |
| due_date | date | When this installment is due. |
| amount_kobo | integer | Amount owed, in kobo. |
| status | string | due | overdue | paid | cancelled. |
| payment_id | UUID | null | Set once paid via a single payment. |
| payment_batch_item_id | UUID | null | Set once paid via a bulk batch. Mutually exclusive with payment_id. |
| reference_number | string | null | Your own per-installment reference, if set. |
| policy_type | string | Denormalized from the parent policy. |
| policyholder_name / broker_name / insurance_company_name | string | Denormalized names, for display. |
| payment_date | datetime | null | When this installment was actually paid — null until then. Distinct from settlement date. |
| created_at | datetime | ISO 8601 UTC. |
/installments/{installment_id}/reference-numberSet an installment's reference number
Attaches your own debit-note or reconciliation reference to a specific installment — useful for matching an Excel bulk-pay upload against your own records.
Path parameters
| Field | Type | Description |
|---|---|---|
| installment_id* | UUID | The installment's UUID. |
Request body
| Field | Type | Description |
|---|---|---|
| reference_number | string | null | Pass null to clear it. |
Returns the updated installment object.
Payments (Single)
Every payment mints a Squad Dynamic Virtual Account scoped to that exact amount. Transfer the exact amount before it expires; Insureflow reconciles the transfer and marks the installment paid automatically — there is no separate confirm step.
/paymentsInitiate a single payment
Requires an Idempotency-Key header (see Overview). Rate-limited per broker and per IP.
Request body
| Field | Type | Description |
|---|---|---|
| installment_id* | UUID | Must be due or overdue, and belong to your broker. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Payment UUID. |
| installment_id / broker_id / insurance_company_id | UUID | The three parties. |
| amount_kobo | integer | Amount to transfer, in kobo — must match exactly. |
| status | string | initiated | success | mismatch | expired | failed. |
| squad_transaction_ref | string | Server-generated Squad transaction reference. |
| squad_virtual_account_number | string | The account to transfer into. |
| squad_virtual_account_bank | string | The bank that account is held at. |
| va_expires_at | datetime | Transfer must land before this. |
| failure_reason | string | null | Populated only if status is failed. |
| created_at | datetime | ISO 8601 UTC. |
- mismatch means the wrong amount was transferred — the sender is refunded; initiate a new payment (new Idempotency-Key) for the correct amount.
- expired means the transfer window elapsed with no transfer — initiate a new payment.
- failed means a gateway-side error — check failure_reason; a 502 from this API is transient and safe to retry with a new Idempotency-Key.
/payments/{payment_id}Get a payment
Poll this until status leaves initiated.
Path parameters
| Field | Type | Description |
|---|---|---|
| payment_id* | UUID | The payment's UUID. |
Same shape as the create response above.
/paymentsList payments
Query parameters
| Field | Type | Description |
|---|---|---|
| broker_id | UUID | Insurer roles only: narrow to one broker. |
| status | string | initiated | success | mismatch | expired | failed. |
Array of payment objects, newest first.
Payments (Bulk)
Collect many premiums in one transfer: one debit from the payer, one Squad virtual account, one settlement payout to the insurer — never one payout per item, regardless of how many installments are in the batch. Capped at 500 installments per batch.
/payments/bulkInitiate a bulk payment
Every installment must belong to your broker, be due or overdue, and belong to the same insurer — a batch cannot mix insurers. Requires an Idempotency-Key header.
Request body
| Field | Type | Description |
|---|---|---|
| installment_ids* | UUID[] | Up to 500 installment UUIDs. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Batch UUID. |
| broker_id / insurance_company_id | UUID | The two parties (single-insurer per batch). |
| total_amount_kobo | integer | Sum of every item's amount. |
| item_count | integer | How many installments are in this batch. |
| status | string | initiated | success | mismatch | expired | failed. |
| squad_transaction_ref | string | Server-generated Squad transaction reference. |
| squad_virtual_account_number | string | The account to transfer the total into. |
| squad_virtual_account_bank | string | The bank that account is held at. |
| va_expires_at | datetime | Transfer must land before this. |
| failure_reason | string | null | Populated only if status is failed. |
| created_at | datetime | ISO 8601 UTC. |
| items | array | One entry per installment_id, each with its own amount_kobo. |
/payments/bulk/{batch_id}Get a bulk payment batch
Path parameters
| Field | Type | Description |
|---|---|---|
| batch_id* | UUID | The batch's UUID. |
Same shape as the create response above.
/payments/bulkList bulk payment batches
Query parameters
| Field | Type | Description |
|---|---|---|
| broker_id | UUID | Insurer roles only: narrow to one broker. |
| status | string | initiated | success | mismatch | expired | failed. |
Array of batch objects, newest first.
/payments/bulk/templateDownload the reference-number Excel template
A minimal .xlsx with the one column header POST /payments/bulk/resolve-file's matcher accepts, so the expected format is unambiguous.
Binary .xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet).
/payments/bulk/resolve-fileResolve an uploaded Excel file to installment IDs
Upload a filled-in reference-number spreadsheet (multipart/form-data); matches each row's reference number against your due/overdue installments and returns which installment_ids matched, so you can pass them straight to POST /payments/bulk.
Request body
| Field | Type | Description |
|---|---|---|
| file* | file | The .xlsx file, multipart/form-data. |
Response
| Field | Type | Description |
|---|---|---|
| resolved | array | Matched rows, each with the installment_id and amount. |
| unmatched | array | Rows whose reference number didn't match any payable installment, with the reason. |
Virtual Accounts
Beyond the per-payment collection VAs, each broker also has one permanent virtual account for KYB-linked self-service — this is the account shown on your own dashboard, not a per-transaction one.
/virtual-accounts/meGet your broker's virtual account
Response
| Field | Type | Description |
|---|---|---|
| broker_id / broker_name | UUID / string | The owning broker. |
| squad_va_number | string | null | null until provisioned via the PATCH below. |
| squad_va_bank | string | null | null until provisioned. |
| squad_customer_identifier | string | null | Squad's internal customer reference, once provisioned. |
| created_at | datetime | ISO 8601 UTC. |
/virtual-accounts/meProvision or update KYB details
Submits BVN and phone number to provision (or re-provision) the broker's permanent virtual account with Squad.
Request body
| Field | Type | Description |
|---|---|---|
| bvn* | string | Bank Verification Number. |
| phone_number* | string | Contact phone number. |
Returns the updated virtual account object.
Commission Configuration
Commission rates are versioned, not constants — changing a rate never edits history in place, it closes the previous row and opens a new one, effective immediately. The rate active at payment time is locked onto that payment permanently.
/commission-configsSet a commission rate
One endpoint handles every scope, but who can call it depends on the request body's scope: global and insurance_company rates are an Insureflow platform operation; an Insurance Company Admin may only set broker-scoped overrides for brokers actively assigned to their own company.
Request body
| Field | Type | Description |
|---|---|---|
| scope* | string | "broker" for an insurer-set override. |
| broker_id* | UUID | Required when scope is "broker" — must be assigned to your company. |
| gtbank_rate_bps* | integer | GTBank fee, in basis points (1 bps = 0.01%). |
| insureflow_rate_bps* | integer | Insureflow platform fee, in basis points. |
| broker_rate_bps | integer | Broker commission, in basis points. Deducted from the insurer's settlement proceeds. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Commission config UUID. |
| scope | string | global | insurance_company | broker. |
| insurance_company_id / broker_id | UUID | null | Whichever applies to this row's scope. |
| gtbank_rate_bps / insureflow_rate_bps / broker_rate_bps | integer | null | The three rates. |
| effective_from | datetime | When this rate became active. |
| effective_to | datetime | null | When superseded. null means currently active. |
| created_by | UUID | The admin who set this rate. |
- Example: a ₦10,000 premium under GTBank 50 bps / Insureflow 50 bps / broker 100 bps splits as ₦50 + ₦50 + ₦100 commission, insurer receives the ₦9,800 remainder.
/commission-configsList commission configurations
An Insurance Company Admin sees every config touching their company: global, company-level, and per-broker rates for their assigned brokers. A broker sees global rates and their own broker-scoped rates only.
Array of commission config objects, newest first.
Reminders
Nudges a policyholder about a due or overdue installment. Sending a reminder never charges anything.
/remindersSend a reminder
Request body
| Field | Type | Description |
|---|---|---|
| installment_id* | UUID | Must be due or overdue. |
Response
| Field | Type | Description |
|---|---|---|
| id | UUID | Reminder UUID. |
| installment_id / broker_id / sent_by | UUID | What was reminded, and by whom. |
| channel | string | Delivery channel used. |
| status | string | sent | failed | pending. |
| sent_at | datetime | null | When delivery completed. |
| created_at | datetime | ISO 8601 UTC. |
/reminders/bulkSend reminders for multiple installments
Fans out to one reminder per installment_id, never blocking on an individual failure.
Request body
| Field | Type | Description |
|---|---|---|
| installment_ids* | UUID[] | Each must be due or overdue. |
Response
| Field | Type | Description |
|---|---|---|
| sent_count | integer | How many reminders were sent successfully. |
| failed_count | integer | How many failed. |
/remindersList reminders
Array of reminder objects.
Reports
Premium totals over an explicit date range, grouped by the counterparty on the other side of each transaction — by broker for an insurer's view, by insurer for a broker's.
Settlements
Read-only visibility into the payouts Insureflow has made (or attempted) to an insurer's settlement account — one payout per successful single payment, one per bulk batch, net of commission.
/settlementsList settlement payouts
Query parameters
| Field | Type | Description |
|---|---|---|
| status | string | pending | success | failed. |
Response (array item fields)
| Field | Type | Description |
|---|---|---|
| id | UUID | Settlement payout UUID. |
| insurance_company_id | UUID | The receiving insurer. |
| source_type | string | "payment" or "payment_batch" — what triggered this payout. |
| source_id | UUID | The Payment or PaymentBatch UUID that triggered it. |
| amount_kobo | integer | Net-of-commission amount transferred. |
| status | string | pending | success | failed. |
| squad_transfer_ref | string | Server-generated Squad transfer reference. |
| attempt_number | integer | 1 unless a prior attempt failed and was retried. |
| previous_attempt_id | UUID | null | Chains to the attempt this one retried, if any. |
| failure_reason | string | null | Populated only if status is failed. |
| created_at | datetime | ISO 8601 UTC. |
/settlements/{payout_id}Get a settlement payout
Path parameters
| Field | Type | Description |
|---|---|---|
| payout_id* | UUID | The payout's UUID. |
Same shape as the list response above.
Integration Flows
Two typical end-to-end flows, reflecting who is actually authorized to call each step.
A. An insurance company onboards a policyholder and writes a policy
- Insurer and broker both complete onboarding (
POST /insurance-companies,POST /brokers) and are approved by Insureflow; both activate with their one-time token. - An Insureflow operator assigns the broker to the insurer.
- The insurer sets its settlement account (
POST /insurance-companies/{company_id}/settlement-account). - The insurer creates the policyholder, naming the servicing broker (
POST /users). - The insurer creates the policy against that policyholder and broker (
POST /policies) — this generates the upcoming installment schedule automatically.
B. A broker collects a premium
- List due or overdue installments for the policyholder (
GET /installments?status=due). - Initiate a payment for one installment (
POST /payments) — or several at once (POST /payments/bulk) — with a freshIdempotency-Key. - Present the returned virtual account number and bank to the payer, and the amount and expiry.
- Poll the payment (
GET /payments/{id}) until its status leavesinitiated. Onsuccess, the installment is marked paid and the insurer is settled automatically, net of commission. - On
mismatchorexpired, initiate a new payment with a new key.
Appendix
NIP bank codes
6-digit institution codes accepted by bank_code fields — not the 3-digit CBN code.
| Code | Bank |
|---|---|
| 000013 | GTBank |
| 000014 | Access Bank |
| 000015 | Zenith Bank |
| 000016 | First Bank |
| 000004 | UBA |
| 000008 | Fidelity Bank |
| 000010 | Ecobank |
| 000011 | Unity Bank |
| 000023 | Citibank |
| 000026 | Taj Bank |
| 000027 | Globus Bank |
| 090267 | Kuda Bank |
| 000021 | Standard Chartered |