Create a draft invoice (granular)
POST
/api/public/v1/invoices
Code sample: cURL
curl --request POST \ --url 'https://api.getzutax.com/api/public/v1/invoices?async=false' \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: <unique-request-key>' \ --data '{ "external_id": "inv-2026-0001", "customer_external_id": "cust-obs-001", "supplier_external_id": "tenant-zutax-ng", "currency": "NGN", "issue_date": "2026-02-11", "due_date": "2026-02-25", "invoice_kind": "b2b", "note": "Implementation and monthly support services.", "payment_terms": "Net 14", "lines": [ { "name": "ERP integration implementation", "description": "Discovery, implementation, and go-live support", "product_external_id": "svc-erp-integration", "quantity": 1, "unit_price_naira": 200000, "vat_rate": 0.075, "discount_naira": 0, "isic_code": "6202" }, { "name": "Managed support", "quantity": 1, "unit_price_naira": 15000, "vat_rate": 0.075, "discount_naira": 0 } ]}'Creates an invoice in ‘draft’ status. Does NOT validate, sign, or submit to Pasca. Use POST /invoices/{id}/transmit or the composite POST /invoices/transmit endpoint to advance the lifecycle. Pass ?async=true to enqueue the work and receive a 202 with job_id; otherwise the call is synchronous (201).
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ” async
Async
boolean
Request Body required
Section titled “Request Body required ” Media type application/json
InvoiceCreateInput
object
external_id
required
External Id
string
customer_external_id
required
Customer External Id
string
currency
Currency
string
issue_date
required
Issue Date
string format: date
due_date
required
Due Date
string format: date
invoice_kind
Invoice Kind
string
lines
required
Lines
Array<object>
InvoiceLineInputobject
name
required
Name
string
Examples
Example Service invoice
Create a draft B2B invoice
{ "external_id": "inv-2026-0001", "customer_external_id": "cust-obs-001", "supplier_external_id": "tenant-zutax-ng", "currency": "NGN", "issue_date": "2026-02-11", "due_date": "2026-02-25", "invoice_kind": "b2b", "note": "Implementation and monthly support services.", "payment_terms": "Net 14", "lines": [ { "name": "ERP integration implementation", "description": "Discovery, implementation, and go-live support", "product_external_id": "svc-erp-integration", "quantity": 1, "unit_price_naira": 200000, "vat_rate": 0.075, "discount_naira": 0, "isic_code": "6202" }, { "name": "Managed support", "quantity": 1, "unit_price_naira": 15000, "vat_rate": 0.075, "discount_naira": 0 } ]}Responses
Section titled “ Responses ”Successful Response
Media type application/json
Examples
Example Sample response
200 response example
{ "status": "ok", "message": "Request completed successfully."}Created
Media type application/json
InvoiceResponse
object
id
required
Id
string format: uuid
status
required
Status
string
currency
required
Currency
string
issue_date
required
Issue Date
string format: date
due_date
required
Due Date
string format: date
subtotal_naira
required
Subtotal Naira
string
vat_total_naira
required
Vat Total Naira
string
total_naira
required
Total Naira
string
Examples
Example Invoice created
Draft invoice response
{ "id": "f3df2967-7cbe-4cca-8c8c-975ee2f6857f", "external_id": "inv-2026-0001", "status": "draft", "invoice_number": "INV-2026-0001", "irn": null, "currency": "NGN", "issue_date": "2026-02-11", "due_date": "2026-02-25", "subtotal_naira": "215000.00", "vat_total_naira": "16125.00", "total_naira": "231125.00", "customer_external_id": "cust-obs-001", "pasca_dispatch_id": null}Accepted
Media type application/json
JobAcceptedResponse
202 response body returned when an ERP POSTs ?async=true.
object
job_id
required
Job Id
string format: uuid
status
required
Status
string
result_url
required
Result Url
string
Examples
Example Sample response
202 response example
{ "job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "status": "queued", "result_url": "string"}Validation Error
Media type application/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationErrorobject
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
Examples
Example Sample response
422 response example
{ "detail": [ { "loc": [], "msg": "string", "type": "string" } ]}