Create an invoice
/v1/invoicesOne of customer_id or customer_email is required. By default the invoice is created in pending (sent) status and the customer receives an email immediately — pass auto_send: false to create a draft and send it later via POST /v1/invoices/:code/send. Optional installments array creates a payment schedule: at least 2 entries, all of the same amount_kind, summing to the invoice total (fixed kobo) or exactly 100 (percentage). Minimum invoice amount is 10,000 kobo. Fires invoice.created.
Body parameters
amountintegerrequiredTotal payable in kobo. Minimum 10,000.
subtotalintegeroptionalPre-tax/pre-discount sum (kobo). When provided, amount must equal subtotal - discount + tax — we recompute and validate.
vat_ratenumberoptionalVAT rate as a percent. Nigerian standard is 7.5. Applied to subtotal - discount.
discount_amountintegeroptionalDiscount in kobo, applied before tax.
customer_emailstringoptionalCustomer email. Required when customer_id is omitted.
customer_idstringoptionalExisting Customer ID. Takes precedence over customer_email. Must be owned by you.
descriptionstringoptionalShort summary shown on the invoice (up to 500 chars).
notesstringoptionalFree-text terms shown on the PDF / hosted page (up to 2,000 chars).
due_datestringoptionalISO-8601 due date for the overall balance.
line_itemsarray<object>optionalItemised breakdown.
descriptionstringrequiredLine description (1–200 chars).
amountintegerrequiredPer-line amount in kobo.
quantityintegeroptionalQuantity (default 1).
installmentsarray<object>optionalOptional payment schedule. Requires ≥2 entries, all of the same amount_kind. Fixed entries must sum to amount; percentage entries must sum to exactly 100. Past due_date values are accepted — the overdue cron will flip them immediately.
amount_kindenum<'fixed' | 'percentage'>requiredHow the installment is expressed.
amount_inputnumberrequiredFor fixed: kobo. For percentage: percent (1–100). Server resolves percentages to kobo at creation; the last entry absorbs rounding so the resolved amounts sum to amount exactly.
due_datestringrequiredISO-8601 due date for this installment.
auto_sendbooleanoptionalWhether to immediately move the invoice from draft to pending (sent). Defaults to true.
metadataobjectoptionalArbitrary key/value pairs.
Response
201invoice_codestringTagPay invoice code (`INV_…`). Use this in every invoice API call.
invoice_numberstring | nullSequential human-readable invoice number (e.g. `INV-2026-0042`). Allocated when the invoice leaves `draft`; null for drafts.
amountintegerTotal payable in kobo.
subtotalintegerPre-tax/pre-discount amount in kobo.
tax_amountintegerVAT applied in kobo.
discount_amountintegerDiscount applied before tax, in kobo.
vat_ratenumber | nullVAT percent (e.g. `7.5`), or null when no tax applies.
currencystringAlways `NGN`.
statusenum<'draft' | 'pending' | 'paid' | 'overdue' | 'cancelled' | 'uncollectible'>Lifecycle state.
descriptionstring | nullShort summary shown on the invoice.
notesstring | nullFree-text terms shown on the PDF and hosted page.
due_datestring | nullISO-8601 due date for the whole invoice (single-payment invoices) or for the overall balance.
paid_atstring | nullISO-8601 timestamp the invoice was fully settled.
sent_atstring | nullISO-8601 timestamp the invoice transitioned out of draft.
voided_atstring | nullISO-8601 timestamp the invoice was cancelled.
marked_paid_atstring | nullISO-8601 timestamp the invoice was marked paid off-platform.
customer_emailstring | nullCustomer email used for delivery.
customer_idstring | nullLinked Customer ID, or null for guest invoices.
transaction_idstring | nullTransaction that settled the invoice.
pdf_urlstring | nullCached PDF URL. Null today — re-render via `GET /v1/invoices/:code/pdf`.
line_itemsarray<object> | nullOptional line-item breakdown — `{ description, amount, quantity? }`.
installmentsarray<Installment>Payment schedule. Empty array for single-payment invoices.
idstringInstallment ID.
ordinalinteger1-indexed position in the schedule.
amountintegerResolved amount in kobo.
amount_kindenum<'fixed' | 'percentage'>How the merchant originally entered the amount.
amount_inputstringOriginal input as a decimal string — kobo amount for `fixed`, percent for `percentage` (e.g. `"33.33"`).
due_datestringISO-8601 due date.
statusenum<'pending' | 'paid' | 'overdue'>Installment state.
paid_atstring | nullISO-8601 timestamp the installment was settled.
transaction_idstring | nullTransaction that settled this installment, if paid.
metadataobject | nullArbitrary merchant-supplied key/value pairs.
created_atstringISO-8601 creation timestamp.
updated_atstringISO-8601 last-update timestamp.
Errors
VALIDATION_ERROR400Neither `customer_id` nor `customer_email` was supplied, totals are inconsistent, or installments violate the sum / `amount_kind` rules.NOT_FOUND404`customer_id` does not exist or is not owned by you.INVALID_KEY401Secret key missing or invalid.