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.

RoleScope
Insurance Company AdminManages one insurance company: creates policyholders and policies, assigns servicing brokers, sets the settlement account, and reads everything under that company.
Broker AdminManages one brokerage: creates staff logins, provisions the virtual account, and has full transacting access — collecting premiums, viewing reports, sending reminders.
Broker StaffSame 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": "..." }.

StatusMeaning
400Bad request — malformed input.
401Missing or invalid Bearer token.
403Authenticated, but your role lacks the required permission.
404The resource doesn't exist, or doesn't belong to your organization.
409Conflict — e.g. the Idempotency-Key was already used with a different request body.
422Validation error — see detail for the specific field.
429Rate limit exceeded — back off and retry.
502Upstream 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.

POST/auth/activate

Activate a new account

No authentication required

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

FieldTypeDescription
token*stringThe one-time activation token.
password*stringChosen password.

HTTP 204 No Content on success.

POST/auth/login

Obtain a Bearer token

No authentication required

Standard OAuth2 password flow. Sends credentials as application/x-www-form-urlencoded form data, not JSON.

Request body

FieldTypeDescription
username*stringAccount email address.
password*stringAccount password.

Response

FieldTypeDescription
access_tokenstringJWT Bearer token, valid 60 minutes.
token_typestringAlways "bearer".
  • Login is blocked while your organization (insurance company or broker) is pending, rejected, or suspended.
PATCH/auth/change-password

Change your own password

Any authenticated role

Changes the password of the currently authenticated account.

Request body

FieldTypeDescription
current_password*stringCurrent password, for verification.
new_password*stringNew password.

Response

FieldTypeDescription
access_tokenstringA fresh Bearer token (the old one stays valid until it expires).
token_typestringAlways "bearer".

Insurance Companies

Onboarding is unauthenticated; every other endpoint requires an Insurance Company Admin Bearer token, scoped to that one company.

POST/insurance-companies

Submit onboarding application

No authentication required

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

FieldTypeDescription
name*stringLegal company name.
contact_email*stringPrimary admin contact email.

Response

FieldTypeDescription
companyInsuranceCompanyOutThe created company record (see GET below for its full shape).
otpstringOne-time activation token — only ever returned here. Store or relay it immediately.
GET/insurance-companies/{company_id}

Get company details

Insurance Company Admin (own company only)

Returns the current state of the insurance company record.

Path parameters

FieldTypeDescription
company_id*UUIDThe company's UUID.

Response

FieldTypeDescription
idUUIDCompany UUID.
namestringLegal name.
contact_emailstringAdmin contact email.
statusstringpending | approved | rejected | suspended.
rejection_reasonstring | nullPopulated if rejected.
settlement_bank_codestring | nullnull until a settlement account is set.
settlement_account_numberstring | nullnull until a settlement account is set.
settlement_account_namestring | nullnull until a settlement account is set.
parent_company_idUUID | nullSet only for a subsidiary under a parent organization grouping.
created_atdatetimeISO 8601 UTC.
GET/insurance-companies/{company_id}/brokers

List brokers assigned to this company

Insurance Company Admin (own company only)

Every broker with an active assignment to this insurer — the many-to-many relationship, not a fixed 1:1 broker.

Path parameters

FieldTypeDescription
company_id*UUIDThe company's UUID.

Array of broker objects (same shape as the Brokers section's GET response).

POST/insurance-companies/{company_id}/settlement-account

Set settlement bank account

Insurance Company Admin (own company only)

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

FieldTypeDescription
company_id*UUIDThe company's UUID.

Request body

FieldTypeDescription
bank_code*string6-digit NIP institution code, e.g. GTBank = 000013. Not the 3-digit CBN code — see the Appendix.
account_number*string10-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.

POST/brokers

Submit broker onboarding application

No authentication required

Registers a new broker. Starts in pending status.

Request body

FieldTypeDescription
name*stringLegal broker organization name.
contact_email*stringPrimary admin contact email.
bvnstringBank Verification Number — needed later to provision a virtual account, can be supplied here or via the Virtual Accounts endpoints.
phone_numberstringContact phone number.

Response

FieldTypeDescription
brokerBrokerOutThe created broker record.
otpstringOne-time activation token — only ever returned here.
GET/brokers/{broker_id}

Get broker details

Broker (own record) or Insureflow Admin

Broker roles can only retrieve their own broker record.

Path parameters

FieldTypeDescription
broker_id*UUIDThe broker's UUID.

Response

FieldTypeDescription
idUUIDBroker UUID.
namestringBroker name.
contact_emailstringAdmin contact email.
statusstringpending | approved | rejected | suspended.
rejection_reasonstring | nullPopulated if rejected.
squad_va_numberstring | nullThe broker's own collection virtual account number, once provisioned.
squad_va_bankstring | nullBank the virtual account is held at.
created_atdatetimeISO 8601 UTC.
GET/brokers/{broker_id}/insurers

List insurers this broker works with

Broker (own record) or Insureflow Admin

Every insurer with an active assignment to this broker.

Path parameters

FieldTypeDescription
broker_id*UUIDThe broker's UUID.

Array of insurance company objects (same shape as the Insurance Companies section's GET response).

POST/brokers/{broker_id}/staff

Create a broker staff account

Broker Admin (own broker only)

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

FieldTypeDescription
broker_id*UUIDThe broker's UUID.

Request body

FieldTypeDescription
email*stringEmail for the new staff account.

Response

FieldTypeDescription
otpstringOne-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.

POST/users

Create a policyholder

Insurance Company Admin

full_name is the only required field; the rest improve reminder delivery and identity verification.

Request body

FieldTypeDescription
broker_id*UUIDThe broker who will service this policyholder — must have an active assignment to your company.
full_name*stringFull legal name.
emailstringFor payment reminders.
phone_numberstringLocal format, e.g. 08012345678.
identification_numberstringGovernment ID (NIN, passport, etc.) — encrypted at rest.

Response

FieldTypeDescription
idUUIDPolicyholder UUID — required to create a policy.
broker_idUUIDThe servicing broker.
insurance_company_idUUIDThe underwriting company.
broker_namestringDenormalized broker name, for display.
insurance_company_namestringDenormalized company name, for display.
full_namestringAs provided.
emailstring | nullnull if not provided.
phone_numberstring | nullnull if not provided.
identification_numberstring | nullnull if not provided. Masked in most UI surfaces, plaintext over the API to the owning tenant.
created_atdatetimeISO 8601 UTC.
GET/users/{policyholder_id}

Get a policyholder

Insurance Company Admin or the assigned Broker

Path parameters

FieldTypeDescription
policyholder_id*UUIDThe policyholder's UUID.

Same shape as the create response above.

GET/users

List policyholders

Insurance Company Admin or Broker

An Insurance Company Admin sees every policyholder across their assigned brokers by default; a broker sees only their own.

Query parameters

FieldTypeDescription
broker_idUUIDNarrow 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.

POST/policies

Create a policy

Insurance Company Admin

Request body

FieldTypeDescription
policyholder_id*UUIDThe covered policyholder.
broker_id*UUIDThe broker servicing this policy — must have an active assignment to your company.
reference_number*stringYour own unique debit-note / policy reference.
premium_amount_kobo*integerPremium per payment period, in kobo. Must be > 0.
premium_frequency*stringmonthly | quarterly | annually.
start_date*dateISO 8601 (YYYY-MM-DD). The first installment's due date is derived from this.
policy_typestringOpen string label. Defaults to GENERIC — any value is accepted (LIFE, MOTOR, HEALTH, ...).
policy_namestringOptional display name for the policy.
duration_monthsintegerOptional cover duration.
coverage_amount_kobointegerOptional sum insured, in kobo.
coverage_itemsstringOptional free-text coverage detail.
beneficiariesstringOptional free-text beneficiary list.
broker_notesstringOptional notes visible to the servicing broker.
internal_tagsstringOptional comma-separated tags.

Response

FieldTypeDescription
idUUIDPolicy UUID — required to list installments.
policyholder_id / broker_id / insurance_company_idUUIDThe three parties.
reference_numberstringYour supplied reference.
policy_typestringType label.
premium_amount_kobointegerPer-period premium in kobo.
premium_frequencystringmonthly | quarterly | annually.
start_datedatePolicy start date.
statusstringactive | cancelled.
policyholder_name / broker_name / insurance_company_namestringDenormalized names, for display.
created_atdatetimeISO 8601 UTC.
GET/policies/{policy_id}

Get a policy

Insurance Company Admin or the servicing Broker

Path parameters

FieldTypeDescription
policy_id*UUIDThe policy's UUID.

Same shape as the create response above.

GET/policies

List policies

Insurance Company Admin or Broker

user_id narrows to one policyholder's policies; omitted returns every policy you can see.

Query parameters

FieldTypeDescription
user_idUUIDNarrow to one policyholder.

Array of policy objects.

GET/policies/{policy_id}/installments

List a policy's installments

Insurance Company Admin or the servicing Broker

The full installment schedule for one policy, in due-date order.

Path parameters

FieldTypeDescription
policy_id*UUIDThe 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.

GET/installments

List installments

Insurance Company Admin or Broker

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

FieldTypeDescription
statusstringdue | overdue | paid | cancelled.
policy_typestringFilter by the policy's type label.
idsstringComma-separated installment UUIDs — fetch an exact set in one call.
insurer_idUUIDBroker roles only: narrow to one insurer.

Response (array item fields)

FieldTypeDescription
idUUIDInstallment UUID — the value POST /payments and POST /payments/bulk take.
policy_idUUIDThe parent policy.
due_datedateWhen this installment is due.
amount_kobointegerAmount owed, in kobo.
statusstringdue | overdue | paid | cancelled.
payment_idUUID | nullSet once paid via a single payment.
payment_batch_item_idUUID | nullSet once paid via a bulk batch. Mutually exclusive with payment_id.
reference_numberstring | nullYour own per-installment reference, if set.
policy_typestringDenormalized from the parent policy.
policyholder_name / broker_name / insurance_company_namestringDenormalized names, for display.
payment_datedatetime | nullWhen this installment was actually paid — null until then. Distinct from settlement date.
created_atdatetimeISO 8601 UTC.
PATCH/installments/{installment_id}/reference-number

Set an installment's reference number

Insurance Company Admin or Broker

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

FieldTypeDescription
installment_id*UUIDThe installment's UUID.

Request body

FieldTypeDescription
reference_numberstring | nullPass 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.

POST/payments

Initiate a single payment

Broker Admin or Broker Staff

Requires an Idempotency-Key header (see Overview). Rate-limited per broker and per IP.

Request body

FieldTypeDescription
installment_id*UUIDMust be due or overdue, and belong to your broker.

Response

FieldTypeDescription
idUUIDPayment UUID.
installment_id / broker_id / insurance_company_idUUIDThe three parties.
amount_kobointegerAmount to transfer, in kobo — must match exactly.
statusstringinitiated | success | mismatch | expired | failed.
squad_transaction_refstringServer-generated Squad transaction reference.
squad_virtual_account_numberstringThe account to transfer into.
squad_virtual_account_bankstringThe bank that account is held at.
va_expires_atdatetimeTransfer must land before this.
failure_reasonstring | nullPopulated only if status is failed.
created_atdatetimeISO 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.
GET/payments/{payment_id}

Get a payment

Insurance Company Admin or the paying Broker

Poll this until status leaves initiated.

Path parameters

FieldTypeDescription
payment_id*UUIDThe payment's UUID.

Same shape as the create response above.

GET/payments

List payments

Insurance Company Admin or Broker

Query parameters

FieldTypeDescription
broker_idUUIDInsurer roles only: narrow to one broker.
statusstringinitiated | 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.

POST/payments/bulk

Initiate a bulk payment

Broker Admin or Broker Staff

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

FieldTypeDescription
installment_ids*UUID[]Up to 500 installment UUIDs.

Response

FieldTypeDescription
idUUIDBatch UUID.
broker_id / insurance_company_idUUIDThe two parties (single-insurer per batch).
total_amount_kobointegerSum of every item's amount.
item_countintegerHow many installments are in this batch.
statusstringinitiated | success | mismatch | expired | failed.
squad_transaction_refstringServer-generated Squad transaction reference.
squad_virtual_account_numberstringThe account to transfer the total into.
squad_virtual_account_bankstringThe bank that account is held at.
va_expires_atdatetimeTransfer must land before this.
failure_reasonstring | nullPopulated only if status is failed.
created_atdatetimeISO 8601 UTC.
itemsarrayOne entry per installment_id, each with its own amount_kobo.
GET/payments/bulk/{batch_id}

Get a bulk payment batch

Insurance Company Admin or the paying Broker

Path parameters

FieldTypeDescription
batch_id*UUIDThe batch's UUID.

Same shape as the create response above.

GET/payments/bulk

List bulk payment batches

Insurance Company Admin or Broker

Query parameters

FieldTypeDescription
broker_idUUIDInsurer roles only: narrow to one broker.
statusstringinitiated | success | mismatch | expired | failed.

Array of batch objects, newest first.

GET/payments/bulk/template

Download the reference-number Excel template

Broker Admin or Broker Staff

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).

POST/payments/bulk/resolve-file

Resolve an uploaded Excel file to installment IDs

Broker Admin or Broker Staff

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

FieldTypeDescription
file*fileThe .xlsx file, multipart/form-data.

Response

FieldTypeDescription
resolvedarrayMatched rows, each with the installment_id and amount.
unmatchedarrayRows 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.

GET/virtual-accounts/me

Get your broker's virtual account

Broker Admin or Broker Staff

Response

FieldTypeDescription
broker_id / broker_nameUUID / stringThe owning broker.
squad_va_numberstring | nullnull until provisioned via the PATCH below.
squad_va_bankstring | nullnull until provisioned.
squad_customer_identifierstring | nullSquad's internal customer reference, once provisioned.
created_atdatetimeISO 8601 UTC.
PATCH/virtual-accounts/me

Provision or update KYB details

Broker Admin

Submits BVN and phone number to provision (or re-provision) the broker's permanent virtual account with Squad.

Request body

FieldTypeDescription
bvn*stringBank Verification Number.
phone_number*stringContact 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.

POST/commission-configs

Set a commission rate

Insurance Company Admin (broker-scoped rates only)

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

FieldTypeDescription
scope*string"broker" for an insurer-set override.
broker_id*UUIDRequired when scope is "broker" — must be assigned to your company.
gtbank_rate_bps*integerGTBank fee, in basis points (1 bps = 0.01%).
insureflow_rate_bps*integerInsureflow platform fee, in basis points.
broker_rate_bpsintegerBroker commission, in basis points. Deducted from the insurer's settlement proceeds.

Response

FieldTypeDescription
idUUIDCommission config UUID.
scopestringglobal | insurance_company | broker.
insurance_company_id / broker_idUUID | nullWhichever applies to this row's scope.
gtbank_rate_bps / insureflow_rate_bps / broker_rate_bpsinteger | nullThe three rates.
effective_fromdatetimeWhen this rate became active.
effective_todatetime | nullWhen superseded. null means currently active.
created_byUUIDThe 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.
GET/commission-configs

List commission configurations

Insurance Company Admin or Broker

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.

POST/reminders

Send a reminder

Insurance Company Admin or Broker

Request body

FieldTypeDescription
installment_id*UUIDMust be due or overdue.

Response

FieldTypeDescription
idUUIDReminder UUID.
installment_id / broker_id / sent_byUUIDWhat was reminded, and by whom.
channelstringDelivery channel used.
statusstringsent | failed | pending.
sent_atdatetime | nullWhen delivery completed.
created_atdatetimeISO 8601 UTC.
POST/reminders/bulk

Send reminders for multiple installments

Insurance Company Admin or Broker

Fans out to one reminder per installment_id, never blocking on an individual failure.

Request body

FieldTypeDescription
installment_ids*UUID[]Each must be due or overdue.

Response

FieldTypeDescription
sent_countintegerHow many reminders were sent successfully.
failed_countintegerHow many failed.
GET/reminders

List reminders

Insurance Company Admin or Broker

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.

GET/reports/premiums

Get a premium report

Insurance Company Admin or Broker

Sums successful payments (single and bulk) in the given range. An insurer's rows are grouped by broker; a broker's rows are grouped by insurer.

Query parameters

FieldTypeDescription
date_from*datetimeISO 8601, inclusive.
date_to*datetimeISO 8601, inclusive.
broker_idUUIDInsurer roles only: narrow to one broker.
insurer_idUUIDBroker roles only: narrow to one insurer.

Response

FieldTypeDescription
rowsarrayOne row per counterparty: counterparty_id, counterparty_name, premiums_processed_kobo, payment_count.
total_kobointegerSum across every row.
date_from / date_todatetimeEchoed back from the request.
GET/reports/premiums/export

Download a premium report as Excel

Insurance Company Admin or Broker

Same params and data as above, returned as a downloadable spreadsheet instead of JSON.

Query parameters

FieldTypeDescription
date_from*datetimeISO 8601, inclusive.
date_to*datetimeISO 8601, inclusive.
broker_idUUIDInsurer roles only.
insurer_idUUIDBroker roles only.

Binary .xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet).

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.

GET/settlements

List settlement payouts

Insurance Company Admin

Query parameters

FieldTypeDescription
statusstringpending | success | failed.

Response (array item fields)

FieldTypeDescription
idUUIDSettlement payout UUID.
insurance_company_idUUIDThe receiving insurer.
source_typestring"payment" or "payment_batch" — what triggered this payout.
source_idUUIDThe Payment or PaymentBatch UUID that triggered it.
amount_kobointegerNet-of-commission amount transferred.
statusstringpending | success | failed.
squad_transfer_refstringServer-generated Squad transfer reference.
attempt_numberinteger1 unless a prior attempt failed and was retried.
previous_attempt_idUUID | nullChains to the attempt this one retried, if any.
failure_reasonstring | nullPopulated only if status is failed.
created_atdatetimeISO 8601 UTC.
GET/settlements/{payout_id}

Get a settlement payout

Insurance Company Admin

Path parameters

FieldTypeDescription
payout_id*UUIDThe 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

  1. Insurer and broker both complete onboarding (POST /insurance-companies, POST /brokers) and are approved by Insureflow; both activate with their one-time token.
  2. An Insureflow operator assigns the broker to the insurer.
  3. The insurer sets its settlement account (POST /insurance-companies/{company_id}/settlement-account).
  4. The insurer creates the policyholder, naming the servicing broker (POST /users).
  5. 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

  1. List due or overdue installments for the policyholder (GET /installments?status=due).
  2. Initiate a payment for one installment (POST /payments) — or several at once (POST /payments/bulk) — with a fresh Idempotency-Key.
  3. Present the returned virtual account number and bank to the payer, and the amount and expiry.
  4. Poll the payment (GET /payments/{id}) until its status leaves initiated. On success, the installment is marked paid and the insurer is settled automatically, net of commission.
  5. On mismatch or expired, 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.

CodeBank
000013GTBank
000014Access Bank
000015Zenith Bank
000016First Bank
000004UBA
000008Fidelity Bank
000010Ecobank
000011Unity Bank
000023Citibank
000026Taj Bank
000027Globus Bank
090267Kuda Bank
000021Standard Chartered

Status values quick reference

dueoverduepaidcancelledinitiatedsuccessmismatchexpiredfailedpendingapprovedrejectedsuspended