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

Header Parameters

Idempotency-Keystring

Your key for this request, 1 to 128 characters of letters, digits and `. _ : -`. The same request sent again with the same key returns the first answer instead of doing the work twice. See [Idempotency](/api/idempotency).

Request Body

application/json

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.

currencystringrequired

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

language"fr" | "en"

The language of the invoice's e-mail and PDF: `fr` or `en`. Defaults to the linked customer's preferred language, else your account's language (Settings → Regional → Language), else `en`.

"fr""en"
template_idstring | null

One of the invoice templates set up in the Dashboard, by id.

acceptobject | null

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

recurring_frequency"daily" | "weekly" | "monthly" | "quarterly" | "yearly"

Same as `recurring_interval`, accepted for older integrations: `daily`, `weekly`, `monthly`, `quarterly` or `yearly`.

"daily""weekly""monthly""quarterly""yearly"
payment_schedulesarray | null

With a `payment_type` of `split` or `milestone`, the instalments the payer settles one at a time.

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.

document_type"invoice" | "quote" | "estimate"

Defaults to `invoice`. A `quote` or an `estimate` is not returned by the other `/invoices` routes.

"invoice""quote""estimate"
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

At least one line.

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.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://api.wajub.com/invoices" \  -H "Idempotency-Key: invoice-order-1042" \  -H "Content-Type: application/json" \  -d '{    "currency": "XAF",    "customer_name": "Amina Diallo",    "invoice_date": "2026-09-16",    "items": null  }'
POST
/invoices
{  "code": 201,  "status": "Created",  "message": "Invoice created",  "invoice": {    "id": "inv_Hq7Lm2Xp9Rt4Vb8Nc3Kd",    "invoice_number": null,    "document_type": "invoice",    "status": "draft",    "customer": null,    "customer_id": null,    "customer_name": "Amina Diallo",    "customer_email": "amina@example.com",    "customer_company_name": null,    "customer_phone": null,    "customer_address": null,    "invoice_date": "2026-09-16",    "due_date": "2026-09-30",    "currency": "XAF",    "language": "fr",    "subtotal": 50000,    "discount_amount": 0,    "tax_amount": 0,    "total": 50000,    "amount_paid": 0,    "amount_due": 50000,    "payment_type": "full",    "is_recurring": false,    "recurring_interval": null,    "next_invoice_date": null,    "recurring_parent": null,    "notes": null,    "terms": null,    "footer": null,    "accept": null,    "sent_at": null,    "paid_at": null,    "cancelled_at": null,    "items": [      {        "id": "9d3f6a2e-4b1c-4e8a-9f27-6c5d8b1a0e43",        "name": "Website design",        "description": null,        "quantity": 1,        "unit": null,        "unit_price": 50000,        "tax_rate": 0,        "tax_amount": 0,        "discount_type": null,        "discount_value": 0,        "discount_amount": 0,        "subtotal": 50000,        "total": 50000,        "sort_order": 0      }    ],    "created_at": "2026-09-16T09:12:04+00:00",    "updated_at": "2026-09-16T09:12:04+00:00"  }}

Draft created

What did you think of this content?