The API is a generic interface that can be used for all countries. If there are additional country-specific requirements, these are described in the country-specific guides.
The generic interface is available from EFR version 2.5.0. The changes to the interface are backwards compatible.
These additional country specific business cases are rare, but if applicable to your business, need to be implemented and tested. The applicable country to the business case is visible via the country flag beneath the business case title.
If your business has any additional business cases that are not included on this list or if you have any comments or questions, please contact us at: ticket@efsta.eu
Every business case must be started by sending a request with a <TraS> Tag, as soon as the first article has been recorded. The response contains the fiscal TSE signature, the transaction ID (TID), and the timestamp of the process start.
At the completion of a transaction the whole transaction data has to be sent to the EFR within a <Tra> Tag per /register request with the TID from the start request.
A transaction will be startetd with TraS request. The TID from the response must be stored in the POS.
The transaction will be finished with a Tra request and the TID has to be sent in the request.
If a POS is used by input devices (handheld device), the input device ID must also be specified with the transaction.
The input device data can be maintained via the basis data in the portal.
The Device Id must be sent as an attribute Pos.Dev
If amounts are recorded "on behalf of third parties", the third party is responsible for the correct recording of sales tax (e.g. shop-in-shop).
To do this, you can set the agency ID (DE_AGENTUR_ID) in the position. The agency data can be maintained in the basis data via the portal.
The agency ID Id has to be sent as an attribute DE_AGENTUR_ID
In the german fiscal law there is a special tax for old/used parts in the vehicle sector. The tax arises, if a
customer replace parts of a vehicle, the basis is the value of the new part. This tax is paid by the shop
or merchant and is listed separate on the bon for the customer.
The tax corresponds to the current full sales tax on the assessment basis, which is to be determined
according to § 10 Abs. 2 Satz 2 UStG. The assessment basis is an average value which is defined as
10% of the list price of the equivalent new part (without discounts and without sales tax).
This tax can be sent to the EFR-service with a position type PTY="TaxPos".
Example
XML
JSON
<Tra> <ESRD="2024-06-01T08:30:15"TL="001"TT="1"TN="111"T="1176.00"Opr="101"OprN="Mario Rossi"> <PosA> <PosPN="1"Dsc="motor exchange"Amt="1160.00"TaxG="A"/> <PosPTY="TaxPos"PN="2"RPN="1"Dsc="tax for old parts"Amt="16.00"TaxG="A"/> </PosA> <PayA> <PayDsc="Cash"Amt="1176.00"PayG="Cash"/> </PayA> <TaxA> <TaxTaxG="A"Prc="16"Net="1000.00"TAmt="176.00"Amt="1176.00"/> </TaxA> </ESR> </Tra>
If a merchant bought used objects and sells them to his customers, a difference tax rate can be used
instead of the regular tax rate.
E.g.:
A merchant buys a used item at a price of €900. He then sells it to a private person for €1150. The tax
is calculated from the difference (sales price – purchase price), in this case €1150 - €900 = €250. The
tax amount would be €39.92 with a tax rate of 19%.
Since the tax is not printed directly on the receipt, this article is sent to the EFR as a 0% tax rate and a correction receipt has to be created afterwards.
Example
XML
JSON
<Tra> <ESRD="2024-06-01T08:30:15"TL="001"TT="1"TN="112"T="1150.00"Opr="101"OprN="Mario Rossi"> <PosA> <PosPN="1"Dsc="Sell of used item"Amt="1150.00"TaxG="G"/> </PosA> <PayA> <PayDsc="Cash"Amt="1150.00"PayG="Cash"/> </PayA> <TaxA> <TaxTaxG="G"Prc="0"Net="1150.00"TAmt="0.00"Amt="1150.00"/> </TaxA> </ESR> </Tra>
It must be written on the bon, that the tax rate of the article is differential tax rate
according to §25a UstG.
A correction bon must be created afterwards, which includes the differential tax rate. This can also be
created in the accounting department and does not necessarily have to be sent to the EFR service.
Alternatively, the correction of the tax can be made e.g. monthly in the accounting department via
internal receipt. Please coordinate this procedure with your tax advisor
Accompanying documents like offers and orders may be registered before the sales receipt using ESR.NFS with any value. These documents have to be referenced by JIR (or ZKI if no JIR is available) in the related sales receipt using the property ESR.RFiscal.
The Croatian consumption tax can be sent by specifying both the VAT group (A, B, ...) and the consumption group (V1) delimited with space in Pos.TaxG="A V1". Additionally the Tax-line in the tax array is specified with:
Tax.TTY="CT" TaxType is consumption tax
Tax.Base is set with the tax base amount (net)
Tax.Net and Tax.TAmt is not set
Tax.Amt is set with the consumption tax amount instead of the gross amount
The export requires us to track detailed information about article registrations:
Registration of an article
Change to that registration:
Addition, subtraction or deletion
Parking of a receipt (NFS=SUSPEND)
Resuming a receipt, even if it is parked again
Example
XML
JSON
<Tra> <ESRD="2025-04-24T08:30:15"TL="001"TT="1"T="3.46"Opr="101"OprN="Sofia Eriksson"OprTaxId="xxx"> <PosA> <!-- Cashier registers article with Qty of 2. --> <PosPN="1"TS="2025-04-24T08:30:15"IN="1007"Dsc="Product A"TaxG="A"Amt="0.98"Qty="2"Pri="0.49"Cat="10"CatN="Example Category"/> <!-- Cashier registers a new article. --> <PosPN="2"TS="2025-04-24T08:30:22"IN="3278"Dsc="Product B"TaxG="B"Amt="9.95"Qty="5"Pri="1.99"Cat="20"CatN="Example Category 2"/> <!-- Cashier changes the Qty of Product A with IN="1007", from 2 to 3. --> <PosPN="3"TS="2025-04-24T08:30:47"IN="1007"Dsc="Product A"TaxG="A"Amt="0.49"Qty="1"Pri="0.49"Cat="10"CatN="Example Category"/> <!-- Cashier changes the Qty of Product B from 5 to 1 using a Line Void to remove 4. --> <PosPN="4"TS="2025-04-24T08:30:55"IN="3278"Dsc="Product B"TaxG="B"Amt="-7.96"Qty="-4"Pri="1.99"Cat="20"CatN="Example Category 2"Void="1"/> </PosA> <PayA> <PayDsc="Example Payment"PayG="cash"Amt="5.00"/> <PayDsc="Example Change"PayG="change"Amt="-1.54"/> </PayA> </ESR> </Tra>
{ "Tra":{ "ESR":{ "D":"2025-04-24T08:30:15", "TL":"001", "TT":"1", "T":"3.46", "Opr":"101", "OprN":"Sofia Eriksson", "OprTaxId":"xxx", "PosA":[ // Cashier registers article with Qty of 2. { "_":"Pos", "PN":"1", "TS":"2025-04-24T08:30:15", "IN":"1007", "Dsc":"Product A", "TaxG":"A", "Amt":"0.98", "Qty":"2", "Pri":"0.49", "Cat":"10", "CatN":"Example Category" }, // Cashier registers a new article. { "_":"Pos", "PN":"2", "TS":"2025-04-24T08:30:22", "IN":"3278", "Dsc":"Product B", "TaxG":"B", "Amt":"9.95", "Qty":"5", "Pri":"1.99", "Cat":"20", "CatN":"Example Category 2" }, // Cashier changes the Qty of Product A with IN="1007", from 2 to 3. { "_":"Pos", "PN":"3", "TS":"2025-04-24T08:30:47", "IN":"1007", "Dsc":"Product A", "TaxG":"A", "Amt":"0.49", "Qty":"1", "Pri":"0.49", "Cat":"10", "CatN":"Example Category" }, // Cashier changes the Qty of Product B from 5 to 1 using a Line Void to remove 4. { "_":"Pos", "PN":"4", "TS":"2025-04-24T08:30:55", "IN":"3278", "Dsc":"Product B", "TaxG":"B", "Amt":"-7.96", "Qty":"-4", "Pri":"1.99", "Cat":"20", "CatN":"Example Category 2", "Void":"1" } ], "PayA":[ { "_":"Pay", "Dsc":"Example Payment", "PayG":"cash", "Amt":"5.00" }, { "_":"Pay", "Dsc":"Example Change", "PayG":"change", "Amt":"-1.54" } ] } } }