Authorization
default A public key (pk./pk_test.) is accepted on /payments, /customers, /links, /invoices and the catalogue reads (/channels, /providers, /countries, /currencies); anything that moves money out, reads the balance or manages the account answers 406 to it. It is an identifier, never an authorization. Use a secret key (sk./sk_test.) for sensitive operations (transfers, refunds, balance), or a restricted key (rk./rk_test.) scoped to specific permissions. The _test. variant of any key selects the sandbox environment, there is no separate sandbox URL. Never expose your secret key in client-side code.
In: header
Path Parameters
The invoice `id`.
Request Body
application/json
The language of the invoice's e-mail and PDF: `fr` or `en`. Left as it is when omitted, even when `customer_id` changes.
"fr""en"One of your own customers, by the `cus_` id the Customers API returns. Their details are copied onto the invoice. Another merchant's customer answers 422.
Make the invoice a recurring template: a draft copy is generated each cycle of `recurring_interval`. Only a `document_type` of `invoice` can recur, and never a copy the series generated: both answer 422.
The customer's postal address, printed on the invoice.
The customer's company, printed under their name.
Where `POST /invoices/{id}/send` e-mails the invoice and its PDF, and where the Dashboard sends its reminders.
The name printed on the invoice. Required, even with `customer_id`: the customer can be a person or a business you only name.
The customer's phone number, international format.
On or after `invoice_date`.
Up to 500 characters.
`percentage` (default) or `fixed`.
"percentage""fixed"A percentage, at most 100, or an amount in the major unit of the currency and at most its decimals, by `global_discount_type`. An amount takes off at most the lines' amount.
Apply one discount to the invoice, set by `global_discount_type` and `global_discount_value`: worked out on the lines' amount after their own discounts, and spread over the lines in proportion to it before tax, so tax is charged on what is left (a 100 % discount leaves no tax); shipping is added after it. `false` removes it.
The date printed on the invoice, `YYYY-MM-DD`.
Replaces every line of the invoice: at least one, at most 200.
Up to 5 000 characters.
Sets `due_date` this many days from today when `due_date` is left out.
`full` (default), `split` or `milestone`.
"full""split""milestone"A shipping cost, in the major unit of the currency and at most its decimals (none for XAF). Added to `total` after the discount, and never taxed.
Lets the payer pay part of the balance on the invoice's page, at least this much at a time; the balance itself can always be paid, even when less than this is left. Above zero, in the currency's unit, at most `total`, and only with a `payment_type` of `full`: otherwise `422`. Leave it out for the balance in one payment. Until partial payments open on Wajub, any minimum answers `422`.
Your own number for the document: up to 32 letters, digits, spaces and `- _ / . #`, starting with a letter or a digit. Shown instead of `invoice_number` on the invoice's page, its PDF and e-mail, the payment's description and its receipt (`display_number`); `invoice_number` is still drawn when you send it. Unique among your documents of the same `document_type`, whatever the case: a number another document has answers `422`, naming it; `null` removes yours.
`daily`, `weekly`, `monthly`, `quarterly` or `yearly`.
"daily""weekly""monthly""quarterly""yearly"Up to 5 000 characters.
A currency Wajub supports, as on `POST /payments`. Any other code answers 422.
Restricts the methods the payer is offered on the invoice's page, as on `POST /payments`.
With a `payment_type` of `split` or `milestone`, the instalments the payer settles one at a time.
Response Body
application/json
application/json
application/json
application/json
curl -X PUT "https://api.wajub.com/invoices/inv_Hq7Lm2Xp9Rt4Vb8Nc3Kd" \ -H "Content-Type: application/json" \ -d '{ "customer_name": "Amina Diallo", "invoice_date": "2026-09-16", "items": null, "currency": "XAF" }'{ "code": 200, "status": "OK", "message": "Invoice updated", "invoice": { "id": "inv_Hq7Lm2Xp9Rt4Vb8Nc3Kd", "invoice_number": null, "status": "draft", "currency": "XAF", "subtotal": 65000, "total": 65000, "amount_paid": 0, "amount_due": 65000, "updated_at": "2026-09-16T10:02:51+00:00" }}Updated