Czechia (Czech tax documents)
Czechia has no e-invoicing mandate. A PDF tax document (daňový doklad, section 29 of the VAT Act 235/2004 Sb.) is a valid invoice. Space Invoices checks Czech identifiers, adds Czech wording and shows VAT in CZK. You choose the VAT treatment of each line.
Prerequisites
| Requirement | Description |
|---|---|
| Czech entity | An entity with country_code: "CZ". Currency defaults to CZK and locale to cs-CZ. Keep the entity currency in CZK. |
| DIČ | The entity tax_number, if you are a VAT payer. |
| IČO | The entity company_number. Required for every Czech entity. |
| API key | An account key (sk_*) to create the entity. An entity key (ek_*), or an account key with the x-entity-id header, for documents. See Authentication. |
Scope
| Supported | Not supported |
|---|---|
| Invoices, and credit notes as corrective tax documents | Peppol and ISDOC e-invoice sending |
| B2B customers with DIČ and IČO | EET and on-site payments (card terminals, cash) |
| Online-paid B2C sales, with or without customer details | Domestic reverse charge (section 92a) |
| VAT rates of 21%, 12% and 0% | |
| Intra-EU reverse charge and export wording | |
| Invoices in other currencies, with VAT also stated in CZK | |
Czech PDF documents (cs-CZ) | Tax documents for received advance payments. Advance invoices exist, but aren’t covered as Czech tax documents. |
What a Czech tax document contains
| Required content | Where it comes from |
|---|---|
| Supplier name, address and DIČ | Entity name, address, post_code, city and tax_number |
| Customer name, address and DIČ | Customer name, address fields and tax_number |
| Document number | Generated automatically from the entity number format |
| Description and quantity | items[].name, items[].quantity and items[].unit |
| Date of issue | date. Defaults to today. |
| Date of taxable supply | date_service, and date_service_to for a period. Printed as “Datum plnění”. Only on invoices and credit notes. |
| Unit price without VAT | items[].price, or calculated from items[].gross_price |
| VAT base, rate and amount per rate | Calculated. Returned in taxes. |
| Total | total_with_tax |
| IČO and commercial-register entry | Entity company_number and settings.document_footer |
Set date_service only when the date of taxable supply differs from the issue date.
Setup
1. Create the entity
Send the IČO as 8 digits. It is required for a Czech entity. Send the DIČ as CZ followed by 8 to 10 digits.
const _entity = await sdk.entities.create({
name: "Nabíjíme s.r.o.",
country: "Czechia",
country_code: "CZ",
address: "Na Příkopě 10",
post_code: "110 00",
city: "Praha",
tax_number: "CZ12345679",
company_number: "12345679",
});Validation of Czech identifiers:
tax_numbermust be a DIČ:CZand 8 to 10 digits. Spaces and hyphens are removed. Bare digits get theCZprefix.company_numberis required and must be an 8-digit IČO with a valid check digit. A request without it fails with 422, and you can’t clear it later.- If you aren’t a VAT payer, create the entity with
is_tax_subject: false. You can omittax_number.
New Czech entities get the taxes DPH (21%, the default), DPH 12% and DPH 0%. On a line, pick them with taxes: [{ "classification": "standard" }], "reduced" or "zero".
2. Add the commercial-register entry
Business documents must also show the IČO and the commercial-register entry. A new Czech entity gets a default document footer that already contains the IČO:
{entity_name}, {entity_address}, {entity_post_code} {entity_city}, IČO: {entity_company_number}A custom document_footer replaces the default, so keep IČO: {entity_company_number} in it. Add the register entry to the footer:
await sdk.entities.update(entity.id, {
settings: {
document_footer:
"{entity_name}, {entity_address}, {entity_post_code} {entity_city}, IČO: {entity_company_number} | Zapsáno v obchodním rejstříku vedeném Městským soudem v Praze, oddíl C, vložka 12345",
},
});The footer is limited to 500 characters. It replaces the default footer, and it applies to new documents.
3. Review the tax clauses
A document that charges no VAT needs a legal reference. New Czech entities get these default clauses, which Space Invoices copies to the document tax_clause:
Setting in settings.tax_clause_defaults | Used for | Default text |
|---|---|---|
intra_eu_b2b | Services sold to EU businesses with reverse charge | Daň odvede zákazník (čl. 196 směrnice 2006/112/ES) |
intra_eu_b2b_goods | Goods sold to EU businesses (intra-EU supply exempt from VAT) | Dodání zboží do jiného členského státu osvobozeno od daně podle § 64 zákona o DPH |
3w_b2b and 3w_b2c | Exports to customers outside the EU | Vývoz zboží osvobozen od daně podle § 66 zákona o DPH; u služeb je místo plnění mimo tuzemsko (§ 9 zákona o DPH) |
domestic | Entities created with is_tax_subject: false | Dodavatel není plátcem DPH. |
- The
intra_eu_b2b,intra_eu_b2b_goodsand export clauses apply only when the document charges no VAT. - Intra-EU B2B documents with lines classified as
productgetintra_eu_b2b_goods. Other lines getintra_eu_b2b, and a document with both gets both clauses. - The reverse-charge wording must say that the customer accounts for the tax (daň odvede zákazník). An exempt supply needs a legal reference. Keep both if you change the text.
To change a clause, send every clause you want to keep. The whole tax_clause_defaults object is replaced.
await sdk.entities.update(entity.id, {
settings: {
tax_clause_defaults: {
intra_eu_b2b: "Daň odvede zákazník (čl. 196 směrnice 2006/112/ES).",
intra_eu_b2b_goods: "Dodání zboží do jiného členského státu osvobozeno od daně podle § 64 zákona o DPH.",
"3w_b2b": "Vývoz zboží osvobozen od daně podle § 66 zákona o DPH.",
"3w_b2c": "Vývoz zboží osvobozen od daně podle § 66 zákona o DPH.",
},
},
});Set tax_clause on a single document to override the default for that document.
4. Turn on automatic reverse charge (optional)
For sales to EU businesses, Space Invoices can apply reverse charge for you. It checks the customer’s VAT number in VIES and marks the line taxes as reverse charged. If VIES reports the number as invalid, no reverse charge is applied. It is off by default.
await sdk.entities.update(entity.id, {
settings: {
tax_rules: {
eu: { auto_reverse_charge: true },
},
},
});Issuing
B2B invoice in CZK
Create the customer first. Space Invoices validates the DIČ and IČO when it saves the customer.
const _customer = await sdk.customers.create({
name: "Servis Praha a.s.",
address: "Vinohradská 100",
post_code: "130 00",
city: "Praha",
country_code: "CZ",
tax_number: "CZ76543218",
company_number: "76543218",
});Then issue the invoice with the customer ID:
const _invoice = await sdk.invoices.create({
customer_id: customer.id,
date: "2026-10-02",
date_service: "2026-09-01",
date_service_to: "2026-09-30",
items: [
{
name: "Charging network service, September",
quantity: 1,
unit: "month",
price: 12000,
taxes: [{ classification: "standard" }],
},
],
});B2C sale paid online
A Czech business doesn’t have to issue a tax document to consumers (section 28). If you do, a document without customer details is valid as a simplified tax document (zjednodušený daňový doklad) when the total is at most CZK 10,000. Above that, include the customer. Simplified documents aren’t allowed for reverse-charge or intra-EU exempt supplies of goods.
Space Invoices doesn’t enforce the CZK 10,000 limit or these exclusions. Checking them before you issue a document without customer details is your responsibility.
Send the price VAT-inclusive with gross_price. The invoice total is quantity times gross_price, and Space Invoices calculates the VAT base. Record the online payment with payments.
const _invoice = await sdk.invoices.create({
items: [
{
name: "EV charging session",
quantity: 18.4,
unit: "kWh",
gross_price: 9.8,
taxes: [{ classification: "standard" }],
},
],
payments: [{ type: "card", amount: 180.32, reference: "YOUR_PAYMENT_PROVIDER_REFERENCE" }],
});This invoice has a total_with_tax of 180.32. If you give discounts on the gross amount, see Calculation Modes.
Invoice in another currency to an EU business
An invoice in another currency shows the VAT also in CZK on the PDF. The rate is the ECB reference rate, and the PDF prints the rate and its date.
- The rate is for the date of taxable supply (
date_service_to, otherwisedate_service) when that date is on or beforedate. Otherwise it is fordate. - Conversions go to the entity currency, so keep it in CZK.
- The response has
exchange_rate,taxes[].base_converted,taxes[].amount_convertedandtotal_with_tax_converted.
This example uses automatic reverse charge for a German business customer:
const _invoice = await sdk.invoices.create({
currency_code: "EUR",
date: "2026-10-02",
date_service: "2026-09-30",
customer: {
name: "Beispiel GmbH",
address: "Hauptstraße 1",
post_code: "10115",
city: "Berlin",
country_code: "DE",
tax_number: "DE123456789",
},
items: [
{
name: "Wallbox charger",
quantity: 2,
unit: "pcs",
price: 450,
taxes: [{ classification: "standard" }],
},
],
});The response has transaction_type: "intra_eu_b2b" and the intra_eu_b2b clause in tax_clause.
If the exchange rate is temporarily unavailable, issuing a Czech invoice, advance invoice or credit note in another currency fails with HTTP 503 and the code CZ_CZK_CONVERSION_UNAVAILABLE. Retry later. Drafts (is_draft: true) aren’t affected, but finalizing one checks the rate again. Advance invoices are only guarded this way. Space Invoices doesn’t cover tax documents for received advance payments.
Corrections
Correct a tax document with a credit note (opravný daňový doklad, section 45):
- Link the original invoice in
linked_documents. The PDF shows its number. - State the reason in
note. - Set
date_serviceto the date the correction occurred, if it differs from the issue date. - Send positive amounts. Space Invoices applies the credit note sign.
- The credit note is applied to the invoice’s open balance automatically.
Linking the original invoice is your responsibility. Space Invoices doesn’t require linked_documents on a credit note, and it doesn’t check that the credit note refers to the invoice it corrects.
const _creditNote = await sdk.creditNotes.create({
customer_id: customer.id,
linked_documents: [invoice.id],
date_service: "2026-10-20",
note: "Oprava daňového dokladu: sleva po reklamaci.",
items: [
{
name: "Sleva po reklamaci",
quantity: 1,
price: 500,
taxes: [{ classification: "standard" }],
},
],
});Rounding
To round a total to whole crowns, send the rounded total in expected_total_with_tax:
{ "expected_total_with_tax": 180 }- The difference must be at most 1.00 in the document currency.
rounding_correctionstores the difference, andtotal_with_taxequals your total.- The correction isn’t part of any VAT base. The
taxessummary doesn’t change.
Common errors
Errors with a stable code return it in the top-level code, for both 422 and 503. Match on the code, not the message.
| Response | Fix |
|---|---|
422 CZ_INVALID_TAX_NUMBER: Czech tax number (DIČ) is not valid. | Send tax_number as CZ and 8 to 10 digits, for a Czech entity or customer. |
422 CZ_COMPANY_NUMBER_REQUIRED: Czech entities require a company number (IČO). | Send company_number when you create a Czech entity, and don’t set it to null or an empty string on update. |
422 CZ_INVALID_COMPANY_NUMBER: Czech company number (IČO) is not valid. | Send company_number as 8 digits with a valid check digit. |
422 Validation failed, with an issue on expected_total_with_tax | The rounding difference is above 1.00. Send a total closer to the calculated one. |
422 Credit note item values must be positive. | Send positive quantities and prices on credit notes. |
503 CZ_CZK_CONVERSION_UNAVAILABLE: Exchange rate to CZK is temporarily unavailable. | Retry later. A draft can be saved meanwhile. |
Related API
See the Entities API Reference, Customers API Reference, Invoices API Reference and Credit Notes API Reference. For EU rules, see European Union.