Skip to content
Loading keys…
Authorization<token>

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

idstringrequired

The invoice `id`.

Request Body

application/json

language"fr" | "en"

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"
customer_idstring

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.

is_recurringboolean

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.

customer_addressstring

The customer's postal address, printed on the invoice.

customer_company_namestring

The customer's company, printed under their name.

customer_emailstring

Where `POST /invoices/{id}/send` e-mails the invoice and its PDF, and where the Dashboard sends its reminders.

customer_namestringrequired

The name printed on the invoice. Required, even with `customer_id`: the customer can be a person or a business you only name.

customer_phonestring

The customer's phone number, international format.

due_datestring

On or after `invoice_date`.

footerstring

Up to 500 characters.

global_discount_type"percentage" | "fixed"

`percentage` or `fixed`.

"percentage""fixed"
global_discount_valuenumber

A percentage or an amount, by `global_discount_type`.

has_global_discountboolean

Apply a discount to the whole invoice, set by `global_discount_type` and `global_discount_value`.

invoice_datestringrequired

The date printed on the invoice, `YYYY-MM-DD`.

itemsarray<object>required

Replaces every line of the invoice: at least one.

notesstring

Up to 5 000 characters.

payment_terms_daysinteger

Sets `due_date` this many days from today when `due_date` is left out.

payment_type"full" | "split" | "milestone"

`full` (default), `split` or `milestone`.

"full""split""milestone"
recurring_interval"daily" | "weekly" | "monthly" | "quarterly" | "yearly"

`daily`, `weekly`, `monthly`, `quarterly` or `yearly`.

"daily""weekly""monthly""quarterly""yearly"
termsstring

Up to 5 000 characters.

currencystringrequired

A currency Wajub supports, as on `POST /payments`. Any other code answers 422.

acceptobject | null

Restricts the methods the payer is offered on the invoice's page, as on `POST /payments`.

payment_schedulesarray | null

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"  }'
PUT
/invoices/{id}
{  "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

What did you think of this content?