Create an invoice (draft, or create and send)
Creates an invoice with the next invoice number (INV-0155). The server computes every line amount,
the subtotal, VAT (7.5% of the subtotal, rounded half up to the kobo, when vat_enabled) and the total;
clients never send totals.
send: false(default) saves a draft. Nothing is emailed and no account number is created.send: truecreates and sends in one call: same as creating a draft then callingsendInvoice. Whenvirtual_account_requestedis true, the per-invoice account number is opened at the partner bank before the email goes out; if the bank is unavailable the call fails with 503 and nothing is created (retry with the same Idempotency-Key).
The customer is either an existing one (customer_id) or a new one (customer), which is saved.
Emits invoice.sent when sent.
Error codes: invalid_api_key, parameter_invalid, parameter_missing, resource_not_found, scope_missing, csrf_token_invalid, idempotency_key_reused, account_closed, amount_too_small, currency_mismatch, currency_not_enabled, bank_unavailable, rate_limited.
Authorizations
Server API key, scoped. pk_test_ keys hit the sandbox tenant.
Headers
Optional on non-money POSTs; honoured when sent.
1 - 255Optional client correlation id, up to 128 characters. It is not echoed: the response's X-Request-Id is always
our own req_… id. We log your value with the request as client_request_id, so support can find a request by
either id. A longer value is refused with 400 parameter_invalid.
128Body
Exactly one of customer_id or customer is required.
At least one item; the total must be above zero.
1 - 100 elementsPayment terms: 0 = on receipt, else days after issued_on.
0, 7, 14, 30 A saved customer (cus_…).
A new customer; saved for next time.
Add VAT at 7.5% of the subtotal.
Give the invoice its own account number when it is sent (recommended in the app).
Automatic reminders 3 days before the due date, on it, and every 7 days after.
Note to the customer, shown on the invoice.
500Account the money lands in (acc_…). Defaults to the business's Naira · Main account. Any of the
business's active accounts in the same currency: Main, Payroll or a sub-account. Agent accounts are not
allowed (an agent's money comes only from top-ups the team makes, within its limits). Payments are
credited to this account directly.
404 resource_not_found if it isn't one of the business's accounts; 403 account_closed if it is closed; 422
currency_mismatch if it is in another currency; 400 parameter_invalid with param: settlement_account_id for an
agent account, or one still opening.
True to send immediately (see sendInvoice); false saves a draft.
Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.
Response
Invoice created (as a draft, or sent when send was true).
An invoice (ivc_…, an alias view of the shared col_ collection table).
ivc_…
Always invoice.
"invoice"RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
Human invoice number, sequential per business.
^INV-\d{4,}$Invoice state (not a money movement; see CONVENTIONS §8 note in docs/discrepancies).
draft → sent → partially_paid → paid; sent / partially_paid → overdue after due_on
while money is still owed (an overdue invoice can have part payments; see amount_paid);
draft / sent / partially_paid / overdue → void. UI labels: sent → "Awaiting payment",
partially_paid → "Part paid".
draft, sent, partially_paid, overdue, paid, void The customer (payer) on an invoice or static virtual account.
ISO 4217. Only NGN is live at launch; others return 422 currency_not_enabled.
NGN, USD, GBP, EUR, GHS, KES Lines in order.
Whether VAT is added.
Percentage in basis points (50 = 0.5%).
0 <= x <= 10000Sum of line amounts, before VAT.
subtotal × vat_rate_bps / 10000, rounded half up to the minor unit. Zero when VAT is off.
subtotal + vat.
Sum of payments.
"Left to pay": total − amount_paid, never below zero. Zero when paid or void.
Payment terms.
0, 7, 14, 30 Whether the invoice gets (or got) its own account number.
The invoice's pay page. Every invoice has one; it shows 404 to payers while a draft.
One of the business's own PanoFlow accounts (owned by the Accounts service).
Automatic reminders on.
Present when payments exceed the total. The excess stays in the settlement account.
Calendar date, interpreted in Africa/Lagos.
"2026-11-07"
Calendar date, interpreted in Africa/Lagos.
"2026-11-07"
Whole days past due_on, when overdue ("6 days late").
The invoice's own (per-invoice, dynamic) account number. Anything paid into it is recorded against this invoice.
Calendar date, interpreted in Africa/Lagos.
"2026-11-07"
Note to the customer.
Money recorded against the invoice, oldest first.
Timeline for the drawer. Returned by getInvoice and invoice actions; omitted from lists.
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
RFC 3339, UTC.
"2026-10-27T08:41:00Z"
Who did something. Shown in activity, approvals and the audit log.
Up to 20 string keys (≤ 40 chars) with string values (≤ 500 chars). Returned on the resource and its events.