Documents
Issued invoices (Faktury vydané) are at /api/v1/invoices, received invoices (Faktury přijaté) at /api/v1/received-invoices.
Both have the same shape: the supplier is always supplier, the customer customer.
Kinds of issued documents
kind | Document |
|---|---|
invoice | Invoice – a tax document (default). |
proforma | Advance invoice (zálohová faktura). Not a tax document, no DUZP. |
creditNote | Corrective tax document (dobropis). Needs correctedDocumentId and correctionReason; its amounts are negative. |
advanceTaxDocument | Tax document on a received advance payment. Made only by POST /invoices/{id}/advance-tax-document on a paid proforma. |
quote | Price quote. Not paid; dueDate is its validity. |
The kind of a document never changes after it is created.
Issuing a document
POST /api/v1/invoices
Only the lines and the customer are required: either a whole customer or a contactId from the address book. abFaktura fills in the rest:
| Field | When empty |
|---|---|
number | The next number of the number series (the default one, or numberSeriesId). |
supplier | Always your company from the settings; not sent for an issued document. |
issueDate | Today in Czech time. |
taxableSupplyDate | The issue date (VAT payers only, not on a proforma or a quote). |
dueDate | The issue date + dueInDays (14 days by default). |
paymentMethod | bankTransfer; your default account and the document number as the variable symbol are filled in. |
vatPayer | Whether your company is a VAT payer. |
lines[].vatRate | 21 % for a VAT payer, otherwise 0. |
currency | CZK. For a foreign currency without exchangeRate the Czech National Bank rate of the DUZP day is used. |
language | The contact's language, otherwise cs. Also en and bilingual. |
The server computes the totals
You never send totals. The server computes them like the app: VAT is rounded once per rate (§ 37 of the Czech VAT Act),
a price with VAT (priceIncludesVat: true) is computed from the gross amount, line and document discounts apply before VAT,
and roundToCrowns adds the rounding to whole crowns.
"lines": [
{ "name": "Development", "quantity": 2, "unitPrice": 1000, "vatRate": 21 },
{ "name": "Book", "quantity": 1, "unitPrice": 112, "vatRate": 12, "priceIncludesVat": true }
]
→ subtotal 2100, vatTotal 432 (420 + 12), total 2532
The VAT classification of a line (vatClassification) defaults to the domestic 01,02 for issued and 40,41 for received documents;
for reverse charge, EU supplies and similar, send the code of the Czech VAT return row (e.g. 25, 20, 21).
Invoice from a proforma or a quote
A final invoice of a proforma has sourceProformaId: what was paid on the proforma is paid on the invoice.
A document from a quote has sourceQuoteId. When a proforma is paid, a VAT payer issues the tax document on the received payment:
POST /api/v1/invoices/{proforma-id}/advance-tax-document
Changing and deleting
PUT /api/v1/invoices/{id} replaces the whole document: send all fields, the lines are replaced.
The number stays when you do not send it. The kind and the links (correction, proforma, quote) do not change.
DELETE /api/v1/invoices/{id} moves the document to the deleted ones (it can be restored in the app); its number is never reused.
Payments
POST /api/v1/invoices/{id}/payments
{ "amount": 3025, "date": "2026-10-28", "method": "bankTransfer", "note": "Statement 10/2026" }
The answer is the document with the new amounts (amountPaid, amountDue, paid). A negative amount refunds an overpayment.
GET /invoices/{id}/payments lists the payments, DELETE /invoices/{id}/payments/{paymentId} removes one.
For a document in a foreign currency without exchangeRate the Czech National Bank rate of the payment day is used and the exchange difference is booked automatically.
PDF and ISDOC
GET /api/v1/invoices/{id}/pdf returns the PDF as your customer gets it (with your logo and design).
When the PDF is not ready yet, the answer is 503 with Retry-After.
GET /api/v1/invoices/{id}/isdoc returns the document as ISDOC, the Czech e-invoice format read by Czech accounting software.
Sending by e-mail
POST /api/v1/invoices/{id}/send
{ "to": "billing@customer.cz", "subject": "Invoice 2026-0042", "message": "Hello, please find the invoice attached…" }
Without a subject and a message your e-mail template is used. The document is marked as sent and its history shows when the customer opened it.
Received invoices
POST /api/v1/received-invoices
{
"supplier": { "name": "Supplier s.r.o.", "companyNumber": "11223344", "taxNumber": "CZ11223344" },
"originalNumber": "FV-2026-0042",
"issueDate": "2026-10-20",
"dueDate": "2026-11-03",
"bankAccount": { "accountNumber": "123456789", "bankCode": "0800", "variableSymbol": "20260042" },
"lines": [ { "name": "Rent 11/2026", "unitPrice": 10000, "vatRate": 21 } ]
}
Your company is the customer, the supplier's number goes to originalNumber, and the invoice gets its own number from the series of received invoices.
Document limit of the plan
Issued documents (invoices, proformas, credit notes, tax documents on payments) count against the plan limit like in the app.
When the limit is used up, issuing ends with 422 DocumentLimitReached. Quotes and received invoices do not count.