Skip to content

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

RequirementDescription
Czech entityAn 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ČOThe entity company_number. Required for every Czech entity.
API keyAn 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

SupportedNot supported
Invoices, and credit notes as corrective tax documentsPeppol and ISDOC e-invoice sending
B2B customers with DIČ and IČOEET and on-site payments (card terminals, cash)
Online-paid B2C sales, with or without customer detailsDomestic 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 contentWhere 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 numberGenerated automatically from the entity number format
Description and quantityitems[].name, items[].quantity and items[].unit
Date of issuedate. Defaults to today.
Date of taxable supplydate_service, and date_service_to for a period. Printed as “Datum plnění”. Only on invoices and credit notes.
Unit price without VATitems[].price, or calculated from items[].gross_price
VAT base, rate and amount per rateCalculated. Returned in taxes.
Totaltotal_with_tax
IČO and commercial-register entryEntity 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.

Create a Czech VAT payertypescript
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_number must be a DIČ: CZ and 8 to 10 digits. Spaces and hyphens are removed. Bare digits get the CZ prefix.
  • company_number is 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 omit tax_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:

Add the commercial-register entry to the document footertypescript
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_defaultsUsed forDefault text
intra_eu_b2bServices sold to EU businesses with reverse chargeDaň odvede zákazník (čl. 196 směrnice 2006/112/ES)
intra_eu_b2b_goodsGoods 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_b2cExports to customers outside the EUVý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)
domesticEntities created with is_tax_subject: falseDodavatel není plátcem DPH.
  • The intra_eu_b2b, intra_eu_b2b_goods and export clauses apply only when the document charges no VAT.
  • Intra-EU B2B documents with lines classified as product get intra_eu_b2b_goods. Other lines get intra_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.

Change the default tax clausestypescript
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.

Turn on automatic reverse chargetypescript
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.

Create a Czech business customertypescript
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:

Issue an invoice in CZK to a Czech businesstypescript
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.

Issue an invoice for an online-paid consumer saletypescript
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, otherwise date_service) when that date is on or before date. Otherwise it is for date.
  • Conversions go to the entity currency, so keep it in CZK.
  • The response has exchange_rate, taxes[].base_converted, taxes[].amount_converted and total_with_tax_converted.

This example uses automatic reverse charge for a German business customer:

Issue a EUR invoice to a German business with the VAT stated in CZKtypescript
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_service to 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.

Correct an invoice with a credit notetypescript
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_correction stores the difference, and total_with_tax equals your total.
  • The correction isn’t part of any VAT base. The taxes summary 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.

ResponseFix
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_taxThe 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.

See the Entities API Reference, Customers API Reference, Invoices API Reference and Credit Notes API Reference. For EU rules, see European Union.