nenoDevelopers
⌘K
v1

Invoices

Create an invoice

POST/invoices

Creates an invoice. It is saved as a draft unless you set finalize: true to assign an invoice number, or send: true to finalize it and email the customer in the same request.

Headers

Idempotency-Keystring · max 255required

Client-generated key that identifies one write for 24 hours. Reuse it only when retrying the same method, path, query, and body.

Body

customerIdstring · uuidrequired
currencyCodestring
lineItemsarray of objectsrequired
Each item
descriptionstringrequired
detailsstring
unitstring
quantitystringrequired

Decimal as string.

unitPriceMinorstringrequired

Minor units as string.

taxRatePercentstring
discountPercentstring
issueDatestring · date
dueDatestring · date
validUntilstring · date

Quotes only.

poNumberstring
notesstring
termsstring
finalizebooleandefault false

If true, finalize on create (assign invoiceNumber).

sendbooleandefault false

If true, email the customer on create (implies finalize).

sendToarray of strings

Recipients when send is true; defaults to the customer.

sendMessagestring

Optional message body when send is true.

Responses

201
Created. Created. status reflects whether it was finalized/sent.
400
Bad request. Malformed request.
401
Unauthorized. Missing, invalid, revoked, or expired API key.
403
Forbidden. The API key lacks a required scope or the creator lacks a required permission.
409
Conflict. A matching request with this Idempotency-Key is still in progress. Retry after one second.
422
Unprocessable content. This Idempotency-Key was already used for a different request.
429
Too many requests. Rate limit exceeded.
Request
curl -X POST https://api.neno.build/public/v1/invoices \
-H "Authorization: Bearer $NENO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"customerName": "Aalto Studio BV",
"currencyCode": "EUR",
"lineItems": [
{
"description": "Brand identity, phase 2",
"quantity": "1",
"unitPriceMinor": "125000",
"taxRatePercent": "21"
}
],
"finalize": false
}'
201 Created · application/json
{
"id": "inv_7Hq2c9LmX4",
"type": "invoice",
"invoiceNumber": "2026-0142",
"language": "en",
"templateStyle": null,
"customerName": "Aalto Studio BV",
"customerContactPerson": "Mira Aalto",
"customerAddressLine1": "Prinsengracht 263",
"customerAddressLine2": null,
"customerCity": "Amsterdam",
"customerPostalCode": "1016 GV",
"customerCountryCode": "NL",
"customerVatNumber": "NL859412763B01",
"currencyCode": "EUR",
"netAmountMinor": "125000",
"taxTotalMinor": "26250",
"totalMinor": "151250",
"discountPercent": null,
"discountMinor": null,
"issueDate": "2026-09-24",
"dueDate": "2026-10-24",
"paidAt": "2026-09-24T09:30:00Z",
"poNumber": "PO-88213",
"notes": null,
"terms": null,
"logoUrl": null,
"lineItems": [
{
"id": "9b2f6c1e-4a7d-4f0e-8c3b-2d51e7a0f4c9",
"lineNo": 1,
"description": "Brand identity, phase 2",
"details": null,
"unit": "project",
"quantity": "1",
"unitPriceMinor": "125000",
"taxRatePercent": "21",
"discountPercent": null,
"lineDiscountMinor": null,
"lineGrossMinor": "string",
"lineSubtotalMinor": "string",
"lineTaxMinor": "string",
"lineTotalMinor": "string"
}
],
"taxes": [
{
"id": "9b2f6c1e-4a7d-4f0e-8c3b-2d51e7a0f4c9",
"name": "string",
"ratePercent": "string",
"amountMinor": "string",
"discountMinor": null
}
],
"status": "draft",
"creditedInvoiceId": null,
"creditedInvoiceNumber": null
}