Country specific Business Cases
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
Start Transaction
[DE]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
TraSrequest. The TID from the response must be stored in the POS. - The transaction will be finished with a
Trarequest and the TID has to be sent in the request.
Example: Start request
- XML
- JSON
<TraS>
<ESR TL="001" TT="1"/>
</TraS>
{
"TraS": {
"ESR": {
"TL": "001",
"TT": "1"
}
}
}
Example: Response of start transaction
- XML
- JSON
<TraSC SQ="360">
<Result RC="OK"/>
<Fis TID ="292" StartD="2024-06-01T08:30:02"/>
</TraSC>
{
"TraSC": {
"SQ": "360",
"Result": {
"RC": "OK"
},
"Fis": {
"TID": "292",
"StartD": "2024-06-01T08:30:02"
}
}
}
Example: Transaction with TID
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="100" T="34.90" Opr="101" OprN="Mario Rossi" OprTIN="12345678" TP="Table 1" TID="292">
<PosA>
<Pos PN="1" IN="1030" Dsc="Example Service" TaxG="A" Amt="34.90" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="40.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-5.10" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "100",
"T": "34.90",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"TID": "292",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1030",
"Dsc": "Example Service",
"TaxG": "A",
"Amt": "34.90"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "40.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-5.10"
}
]
}
}
}
Use of input devices (handheld device)
[DE]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
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="101" T="34.90" Opr="101" OprN="Mario Rossi" TP="Table 1">
<PosA>
<Pos PN="1" IN="1030" Dsc="Item 1" TaxG="A" Amt="34.90" Dev="101"/>
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="40.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-5.10" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "101",
"T": "34.90",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1030",
"Dsc": "Item 1",
"TaxG": "A",
"Amt": "34.90",
"Dev": "101"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "40.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-5.10"
}
]
}
}
}
Invoices in the name of third parties
[DE]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
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="102" T="34.90" Opr="101" OprN="Mario Rossi" TP="Table 1">
<PosA>
<Pos PN="1" IN="1030" Dsc="Item 1" TaxG="A" Amt="34.90" DE_AGENTUR_ID="5"/>
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="40.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-5.10" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "102",
"T": "34.90",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1030",
"Dsc": "Item 1",
"TaxG": "A",
"Amt": "34.90",
"DE_AGENTUR_ID": "5"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "40.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-5.10"
}
]
}
}
}
Private payment
[DE]Private pay in
The business transaction type "private pay in" documents the pay in of cash from the businessperson's private accounts into the cash register.
A private payment is marked with an attribute NFS="CAPITAL" and a positive amount.
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="103" T="200.00" Opr="101" OprN="Mario Rossi" NFS="CAPITAL">
<PosA>
<Pos PN="1" Dsc="Private pay in" Amt="200.00"/>
</PosA>
<PayA>
<Pay Dsc="Cash" PayG="0" Amt="200.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "103",
"T": "200.00",
"Opr": "101",
"OprN": "Mario Rossi",
"NFS": "CAPITAL",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Private pay in",
"Amt": "200.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"PayG": "0",
"Amt": "200.00"
}
]
}
}
}
Private pay out
The business transaction type "private pay out" documents the taking of cash from the cash register by the business owner for private purposes.
A private payment is marked with an attribute NFS="CAPITAL" and a negative amount.
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="104" T="-400.00" Opr="101" OprN="Mario Rossi" NFS="CAPITAL">
<PosA>
<Pos PN="1" Dsc="Private removal" Amt="-400.00"/>
</PosA>
<PayA>
<Pay Dsc="Cash" PayG="0" Amt="-400.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "104",
"T": "-400.00",
"Opr": "101",
"OprN": "Mario Rossi",
"NFS": "CAPITAL",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Private removal",
"Amt": "-400.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"PayG": "0",
"Amt": "-400.00"
}
]
}
}
}
Variance analysis / difference
[DE]During the cash closure money count, the determination of the target/actual difference takes place. Any difference must be sent to the EFR.
A variance analysis is marked with an attribute NFS="DIFF".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="105" T="-87.00" Opr="101" OprN="Mario Rossi" NFS="DIFF">
<PosA>
<Pos PN="1" Dsc="difference" Amt="-87.00"/>
</PosA>
<PayA>
<Pay Dsc="Cash" PayG="0" Amt="-87.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "105",
"T": "-87.00",
"Opr": "101",
"OprN": "Mario Rossi",
"NFS": "DIFF",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "difference",
"Amt": "-87.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"PayG": "0",
"Amt": "-87.00"
}
]
}
}
}
Wage payment
A "wage payment" represents a (partial) payment of the wage from the POS (e.g. wage advance) by the employer to the employee.
A wage payment is marked with an attribute NFS="WAGE".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="106" T="-1000.00" Opr="101" OprN="Mario Rossi" NFS="WAGE">
<PosA>
<Pos PN="1" Dsc="wage" Amt="-1000.00"/>
</PosA>
<PayA>
<Pay Dsc="Cash" PayG="0" Amt="-1000.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "106",
"T": "-1000.00",
"Opr": "101",
"OprN": "Mario Rossi",
"NFS": "WAGE",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "wage",
"Amt": "-1000.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"PayG": "0",
"Amt": "-1000.00"
}
]
}
}
}
Gastronomy consumption inhouse vs. take away
If food is not consumed in the restaurant but taken away, a lower tax rate applies. Therefore, this must be indicated for each position.
- The default value, if nothing is specified, is
InH="1" - If the food is taken away the position is marked with an attribute
InH="0".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="107" T="9.90" Opr="101" OprN="Mario Rossi" TP="Bar">
<PosA>
<Pos PN="1" IN="1030" Dsc="Example item" TaxG="B" Amt="9.90" InH="0"/>
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="10.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-0.10" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "107",
"T": "9.90",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Bar",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1030",
"Dsc": "Example item",
"TaxG": "B",
"Amt": "9.90",
"InH": "0"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "10.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-0.10"
}
]
}
}
}
Delivery
Delivery with an invoice afterwards
In this case the sales tax becomes due immediately upon delivery. The delivery note thus has an effect on sales.
A delivery with an invoice afterwards is marked with an attribute DT="DELIVERY".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="108" T="399.00" DT="DELIVERY" Opr="101" OprN="Mario Rossi" TP="Bar">
<Ctm CN="12" Nam="Musterfirma GmbH" Adr="Musterstraße 1" Zip="10115" City="Berlin" Ctry="DE" TaxId="DE123456789"/>
<PosA>
<Pos PN="1" Dsc="Printer" TaxG="A" Amt="399.00"/>
</PosA>
<PayA>
<Pay Dsc="Open" PayG="8" Amt="399.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "108",
"T": "399.00",
"DT": "DELIVERY",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Bar",
"Ctm": {
"CN": "12",
"Nam": "Musterfirma GmbH",
"Adr": "Musterstraße 1",
"Zip": "10115",
"City": "Berlin",
"Ctry": "DE",
"TaxId": "DE123456789"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Printer",
"TaxG": "A",
"Amt": "399.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Open",
"PayG": "8",
"Amt": "399.00"
}
]
}
}
}
The invoice afterwards is non fiscal and marked with an attribute NFS="INVOICE".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="109" T="399.00" NFS="INVOICE" Opr="101" OprN="Mario Rossi" TP="Bar">
<Ctm CN="12" Nam="Musterfirma GmbH" Adr="Musterstraße 1" Zip="10115" City="Berlin" Ctry="DE" TaxId="DE123456789"/>
<PosA>
<Pos PN="1" Dsc="Drucker" TaxG="A" Amt="399.00"/>
</PosA>
<PayA>
<Pay Dsc="Offen" PayG="8" Amt="399.00"/>
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "109",
"T": "399.00",
"NFS": "INVOICE",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Bar",
"Ctm": {
"CN": "12",
"Nam": "Musterfirma GmbH",
"Adr": "Musterstraße 1",
"Zip": "10115",
"City": "Berlin",
"Ctry": "DE",
"TaxId": "DE123456789"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Drucker",
"TaxG": "A",
"Amt": "399.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Offen",
"PayG": "8",
"Amt": "399.00"
}
]
}
}
}
Delivery note is generated on the POS and passed along to an external system (accounting)
In this case, the delivery note is only a non-fiscal (signed) transaction. The sales tax accrues in the external system.
In this case the delivery is marked with an attribute NFS="DELIVERY".
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="110" T="399.00" NFS="DELIVERY" Opr="101" OprN="Mario Rossi" TP="Bar">
<Ctm CN="12" Nam="Musterfirma GmbH" Adr="Musterstraße 1" Zip="10115" City="Berlin" Ctry="DE" TaxId="DE123456789"/>
<PosA>
<Pos PN="1" Dsc="Printer" TaxG="A" Amt="399.00"/>
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "110",
"T": "399.00",
"NFS": "DELIVERY",
"Opr": "101",
"OprN": "Mario Rossi",
"TP": "Bar",
"Ctm": {
"CN": "12",
"Nam": "Musterfirma GmbH",
"Adr": "Musterstraße 1",
"Zip": "10115",
"City": "Berlin",
"Ctry": "DE",
"TaxId": "DE123456789"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Printer",
"TaxG": "A",
"Amt": "399.00"
}
]
}
}
}
Tax of old parts (Altteilsteuer)
[DE]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>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="111" T="1176.00" Opr="101" OprN="Mario Rossi">
<PosA>
<Pos PN="1" Dsc="motor exchange" Amt="1160.00" TaxG="A"/>
<Pos PTY="TaxPos" PN="2" RPN="1" Dsc="tax for old parts" Amt="16.00" TaxG="A"/>
</PosA>
<PayA>
<Pay Dsc="Cash" Amt="1176.00" PayG="Cash"/>
</PayA>
<TaxA>
<Tax TaxG="A" Prc="16" Net="1000.00" TAmt="176.00" Amt="1176.00"/>
</TaxA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "111",
"T": "1176.00",
"Opr": "101",
"OprN": "Mario Rossi",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "motor exchange",
"Amt": "1160.00",
"TaxG": "A"
},
{
"_": "Pos",
"PTY": "TaxPos",
"PN": "2",
"RPN": "1",
"Dsc": "tax for old parts",
"Amt": "16.00",
"TaxG": "A"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"Amt": "1176.00",
"PayG": "Cash"
}
],
"TaxA": [
{
"_": "Tax",
"TaxG": "A",
"Prc": "16",
"Net": "1000.00",
"TAmt": "176.00",
"Amt": "1176.00"
}
]
}
}
}
Difference tax rate (Differenzbesteuerung)
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>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="112" T="1150.00" Opr="101" OprN="Mario Rossi">
<PosA>
<Pos PN="1" Dsc="Sell of used item" Amt="1150.00" TaxG="G"/>
</PosA>
<PayA>
<Pay Dsc="Cash" Amt="1150.00" PayG="Cash"/>
</PayA>
<TaxA>
<Tax TaxG="G" Prc="0" Net="1150.00" TAmt="0.00" Amt="1150.00"/>
</TaxA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "112",
"T": "1150.00",
"Opr": "101",
"OprN": "Mario Rossi",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Sell of used item",
"Amt": "1150.00",
"TaxG": "G"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Cash",
"Amt": "1150.00",
"PayG": "Cash"
}
],
"TaxA": [
{
"_": "Tax",
"TaxG": "G",
"Prc": "0",
"Net": "1150.00",
"TAmt": "0.00",
"Amt": "1150.00"
}
]
}
}
}
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.
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="113" T="0.00" Opr="101" OprN="Mario Rossi">
<PosA>
<Pos PN="1" Dsc="Korrektur" Amt="-250.00" TaxG="G"/>
<Pos PN="2" Dsc="Differenzbesteuerung" Amt="250.00" TaxG="A"/>
</PosA>
<TaxA>
<Tax TaxG="G" Prc="0" Net="-250.00" TAmt="0.00" Amt="-250.00"/>
<Tax TaxG="A" Prc="19" Net="210.08" TAmt="39.92" Amt="250.00"/>
</TaxA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "113",
"T": "0.00",
"Opr": "101",
"OprN": "Mario Rossi",
"PosA": [
{
"_": "Pos",
"PN": "1",
"Dsc": "Korrektur",
"Amt": "-250.00",
"TaxG": "G"
},
{
"_": "Pos",
"PN": "2",
"Dsc": "Differenzbesteuerung",
"Amt": "250.00",
"TaxG": "A"
}
],
"TaxA": [
{
"_": "Tax",
"TaxG": "G",
"Prc": "0",
"Net": "-250.00",
"TAmt": "0.00",
"Amt": "-250.00"
},
{
"_": "Tax",
"TaxG": "A",
"Prc": "19",
"Net": "210.08",
"TAmt": "39.92",
"Amt": "250.00"
}
]
}
}
}
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
Consumption Tax
[HR]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 taxTax.Baseis set with the tax base amount (net)Tax.NetandTax.TAmtis not setTax.Amtis set with the consumption tax amount instead of the gross amount
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="1" T="8.38" Opr="101" OprN="Mario Rossi" OprTIN="12345678" TP="Table 1">
<PosA>
<Pos PN="1" IN="1001" SKU="456487" Dsc="Example Item" TaxG="A V1" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Example Category 10" />
<Pos PN="2" IN="1020" SKU="654854" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Lin Dsc="Subtotal" LAmt="5.48" />
<Pos PN="3" IN="1030" SKU="845868" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="10.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-1.62" />
</PayA>
<TaxA>
<Tax TaxG="A" Prc="25" Net="5.43" TAmt="1.36" Amt="6.79"/>
<Tax TaxG="B" Prc="13" Net="1.33" TAmt="0.17" Amt="1.50"/>
<Tax TTY="CT" TaxG="V1" Prc="3" Base="3.11" Amt="0.09"/>
</TaxA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "1",
"T": "8.38",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"SKU": "456487",
"Dsc": "Example Item",
"TaxG": "A V1",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"SKU": "654854",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Lin",
"Dsc": "Subtotal",
"LAmt": "5.48"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"SKU": "845868",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "10.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-1.62"
}
],
"TaxA": [
{
"_": "Tax",
"TaxG": "A",
"Prc": "25",
"Net": "5.43",
"TAmt": "1.36",
"Amt": "6.79"
},
{
"_": "Tax",
"TaxG": "B",
"Prc": "13",
"Net": "1.33",
"TAmt": "0.17",
"Amt": "1.50"
},
{
"_": "Tax",
"TTY": "CT",
"TaxG": "V1",
"Prc": "3",
"Base": "3.11",
"Amt": "0.09"
}
]
}
}
}
Article Registration & Changes
[SE]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")
- Moving a parked article to another terminal
- Resuming a receipt, even if it is parked again
- update recipt and park again (addition, substraction or deletion)
- closing the parked recipt (sell or abort(NFS="ABORT"))
- Discounts are considered changes to the registered items
The EFR reconstructs this history from the position list of the transaction, and additionally reports the resulting articles sold per receipt.
Example
- XML
- JSON
<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"/>
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="5.00" />
<Pay Dsc="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"
}
]
}
}
}
Parking of Receipts
[SE]Parking means a transaction is temporarily paused and not yet finalized. The parked transaction is picked up again later (possibly on another terminal) and is then either finalized as a receipt, parked once more, or aborted.
Parking events change the state of the parking
A parking has a life cycle, and each step of it is a state transition: afterwards the register has something different open. The journal export records these transitions as events.
ATTENTION: Sweden [SE]Closing is a one-shot transition: a parking can be closed once. After the closing receipt (or an abort) the parking is gone and its fiscal number can no longer be used as ESR.ResumeFN.
A parking is resumed with these properties:
| Property | Description | Mandatory |
|---|---|---|
| ESR.ResumeFN | Fiscal number (FN) of the parked transaction that is picked up | Mandatory if a parked transaction is resumed |
| Pos.Resume | Already sent positions must be marked with Resume="1" | Mandatory if a position is resumed |
The parking chain
Every step of a parking is a transaction of its own and gets its own fiscal number, taken from the number series of its transaction type (see Fiscal Number (FN)). All fiscal numbers of one chain share the same registration identifier (the leading RegId segment) so park, resume, re-park, proforma and the closing transaction stay linked as one parking in the journal export:
| Step | Request | Fiscal number returned |
|---|---|---|
| Park | NFS="SUSPEND" | CZ2AveV90Ip:PK:001/1/1-1 |
| Resume and park again | NFS="SUSPEND" with ResumeFN="CZ2AveV90Ip:PK:001/1/1-1" | CZ2AveV90Ip:PK:001/1/1-2 |
| Proforma of the parked articles | NFS="PROFORMA" with ResumeFN="CZ2AveV90Ip:PK:001/1/1-2" | CZ2AveV90Ip:PF:001/1/1-7 |
| Resume and finalize | ResumeFN="CZ2AveV90Ip:PF:001/1/1-7" | CZ2AveV90Ip:SI:001/1/1-43 |
ATTENTION: Sweden [SE]Every parking returns a new fiscal number. Always send back the FN of the most recent response of the chain as ResumeFN – not the FN of the first parking.
A parked transaction may be resumed on a different terminal. Send the TL/TT of the terminal that picks it up together with the unchanged ResumeFN. The EFR detects the change and reports the parked articles as moved to the new terminal.
Examples
The examples below follow one chain: two articles are parked, the transaction is resumed and parked a second time with a third article added, and is finally resumed and paid.
Example: Parking a transaction
- XML
- JSON
<!-- Parking a transaction -->
<Tra>
<ESR NFS="SUSPEND" D="2025-04-24T08:30:15" TL="001" TT="1" T="10.93" Opr="101" OprN="Sofia Eriksson">
<PosA>
<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" />
<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" />
</PosA>
</ESR>
</Tra>
<!-- Response: a parking is not signed - no Fis element is returned -->
<TraC SQ="102">
<Result RC="OK"/>
<ESR D="2025-04-24T08:30:27" TN="71" FN="CZ2AveV90Ip:PK:001/1/1-1"/>
</TraC>
// Parking a transaction
{
"Tra": {
"ESR": {
"NFS": "SUSPEND",
"D": "2025-04-24T08:30:15",
"TL": "001",
"TT": "1",
"T": "10.93",
"Opr": "101",
"OprN": "Sofia Eriksson",
"PosA": [
{
"_": "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"
},
{
"_": "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"
}
]
}
}
}
// Response: a parking is not signed - no Fis element is returned
{
"TraC": {
"SQ": 118,
"Result": {
"RC": "OK"
},
"ESR": {
"TN": "78",
"FN": "CZ2AveV90Ip:PK:001/1/1-1"
}
}
}
Example: Resuming a parked transaction and parking it again
- XML
- JSON
<!-- Resuming the parked transaction and parking it a second time -->
<Tra>
<!-- ResumeFN = FN found in the previous response. -->
<ESR NFS="SUSPEND" ResumeFN="CZ2AveV90Ip:PK:001/1/1-1" D="2025-04-24T08:33:27" TL="001" TT="1" T="12.18" Opr="101" OprN="Sofia Eriksson">
<PosA>
<!-- Already parked articles are marked with Resume="1" -->
<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" Resume="1"/>
<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" Resume="1"/>
<!-- A new article gets registered before the transaction is parked again -->
<Pos PN="3" TS="2025-04-24T08:33:27" IN="5112" Dsc="Product C" TaxG="B" Amt="1.25" Qty="1" Pri="1.25" Cat="20" CatN="Example Category 2"/>
</PosA>
</ESR>
</Tra>
<!-- Response: a new FN of the PK series, with the RegId of the chain (again unsigned) -->
<TraC SQ="126">
<Result RC="OK"/>
<ESR D="2025-04-24T08:33:31" TN="79" FN="CZ2AveV90Ip:PK:001/1/1-2"/>
</TraC>
// Resuming the parked transaction and parking it a second time
{
"Tra": {
"ESR": {
"NFS": "SUSPEND",
// ResumeFN = FN found in the previous response.
"ResumeFN": "CZ2AveV90Ip:PK:001/1/1-1",
"D": "2025-04-24T08:33:27",
"TL": "001",
"TT": "1",
"T": "12.18",
"Opr": "101",
"OprN": "Sofia Eriksson",
"PosA": [
{
"_": "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",
// Already parked articles are marked with Resume="1"
"Resume": "1"
},
{
"_": "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",
"Resume": "1"
},
// A new article gets registered before the transaction is parked again
{
"_": "Pos",
"PN": "3",
"TS": "2025-04-24T08:33:27",
"IN": "5112",
"Dsc": "Product C",
"TaxG": "B",
"Amt": "1.25",
"Qty": "1",
"Pri": "1.25",
"Cat": "20",
"CatN": "Example Category 2"
}
]
}
}
}
// Response: a new FN of the PK series, with the RegId of the chain (again unsigned)
{
"TraC": {
"SQ": 126,
"Result": {
"RC": "OK"
},
"ESR": {
"TN": "79",
"FN": "CZ2AveV90Ip:PK:001/1/1-2"
}
}
}
Example: Proforma of the parked articles
A proforma is sent for the articles parked so far. Nothing is added or changed, so all positions are carried with Resume="1" and the transaction stays parked - now under the fiscal number of the proforma.
- XML
- JSON
<!-- Proforma of the parked transaction -->
<Tra>
<!-- ResumeFN = FN found in the response of the LAST parking. -->
<ESR NFS="PROFORMA" ResumeFN="CZ2AveV90Ip:PK:001/1/1-2" D="2025-04-24T08:34:45" TL="001" TT="1" T="12.18" Opr="101" OprN="Sofia Eriksson">
<PosA>
<!-- The parked articles are carried unchanged and marked with Resume="1" -->
<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" Resume="1"/>
<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" Resume="1"/>
<Pos PN="3" TS="2025-04-24T08:33:27" IN="5112" Dsc="Product C" TaxG="B" Amt="1.25" Qty="1" Pri="1.25" Cat="20" CatN="Example Category 2" Resume="1"/>
</PosA>
</ESR>
</Tra>
<!-- Response: a proforma IS signed - a new FN of the PF series and the Fis element are returned -->
<TraC SQ="129">
<Result RC="OK"/>
<ESR D="2025-04-24T08:34:49" TN="80" FN="CZ2AveV90Ip:PF:001/1/1-7"/>
<Fis>
<Tag Label="Kvittonr" Value="7" Name="FN"/>
<Tag Label="Kontrollsystemet tillverkningsnummer" Value="ISTCSKSVERIFIKATI" Name="SignDevId"/>
<Tag Label="Org. nr" Value="373737-3737" Name="OrgNr"/>
<Tag Label="Kassa" Value="EF15KJTK11033101" Name="RegisterId"/>
<Tag Label="" Value="Ej kvitto" Name=""/>
</Fis>
</TraC>
// Proforma of the parked transaction
{
"Tra": {
"ESR": {
"NFS": "PROFORMA",
// ResumeFN = FN found in the response of the LAST parking.
"ResumeFN": "CZ2AveV90Ip:PK:001/1/1-2",
"D": "2025-04-24T08:34:45",
"TL": "001",
"TT": "1",
"T": "12.18",
"Opr": "101",
"OprN": "Sofia Eriksson",
"PosA": [
// The parked articles are carried unchanged and marked with Resume="1"
{
"_": "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",
"Resume": "1"
},
{
"_": "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",
"Resume": "1"
},
{
"_": "Pos",
"PN": "3",
"TS": "2025-04-24T08:33:27",
"IN": "5112",
"Dsc": "Product C",
"TaxG": "B",
"Amt": "1.25",
"Qty": "1",
"Pri": "1.25",
"Cat": "20",
"CatN": "Example Category 2",
"Resume": "1"
}
]
}
}
}
// Response: a proforma IS signed - a new FN of the PF series and the Fis element are returned
{
"TraC": {
"SQ": 129,
"Result": {
"RC": "OK"
},
"ESR": {
"D": "2025-04-24T08:34:49",
"TN": "80",
"FN": "CZ2AveV90Ip:PF:001/1/1-7"
},
"Fis": {
"Tags": [
{
"Label": "Kvittonr",
"Value": "7",
"Name": "FN"
},
{
"Label": "Kontrollsystemet tillverkningsnummer",
"Value": "ISTCSKSVERIFIKATI",
"Name": "SignDevId"
},
{
"Label": "Org. nr",
"Value": "373737-3737",
"Name": "OrgNr"
},
{
"Label": "Kassa",
"Value": "EF15KJTK11033101",
"Name": "RegisterId"
},
{
"Label": "",
"Value": "Ej kvitto",
"Name": ""
}
]
}
}
}
Example: Resuming a parked transaction and finalizing it
- XML
- JSON
<!-- Resuming and finishing the transaction -->
<Tra>
<!-- ResumeFN = FN found in the response of the LAST step of the chain - here the proforma. -->
<ESR ResumeFN="CZ2AveV90Ip:PF:001/1/1-7" D="2025-04-24T08:36:04" TL="001" TT="1" T="11.69" Opr="101" OprN="Sofia Eriksson" OprTaxId="xxx">
<PosA>
<!-- Already registered articles are marked with Resume="1" -->
<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" Resume="1"/>
<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" Resume="1"/>
<Pos PN="3" TS="2025-04-24T08:33:27" IN="5112" Dsc="Product C" TaxG="B" Amt="1.25" Qty="1" Pri="1.25" Cat="20" CatN="Example Category 2" Resume="1"/>
<!-- Qty of Product A is reduced to 1 -->
<Pos PN="4" TS="2025-04-24T08:36:04" IN="1007" Dsc="Product A" TaxG="A" Amt="-0.49" Qty="-1" Pri="0.49" Cat="10" CatN="Example Category" Void="1"/>
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="20.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-8.31" />
</PayA>
</ESR>
</Tra>
<!-- Response: the closing receipt keeps the RegId of the chain, its number comes from the SI series -->
<TraC SQ="131">
<Result RC="OK"/>
<ESR D="2025-04-24T08:36:08" TN="81" FN="CZ2AveV90Ip:SI:001/1/1-43"/>
</TraC>
// Resuming and finishing the transaction
{
"Tra": {
"ESR": {
// ResumeFN = FN found in the response of the LAST step of the chain - here the proforma.
"ResumeFN": "CZ2AveV90Ip:PF:001/1/1-7",
"D": "2025-04-24T08:36:04",
"TL": "001",
"TT": "1",
"T": "11.69",
"Opr": "101",
"OprN": "Sofia Eriksson",
"OprTaxId": "xxx",
"PosA": [
{
"_": "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",
// Already registered articles are marked with Resume="1"
"Resume": "1"
},
{
"_": "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",
"Resume": "1"
},
{
"_": "Pos",
"PN": "3",
"TS": "2025-04-24T08:33:27",
"IN": "5112",
"Dsc": "Product C",
"TaxG": "B",
"Amt": "1.25",
"Qty": "1",
"Pri": "1.25",
"Cat": "20",
"CatN": "Example Category 2",
"Resume": "1"
},
// Qty of Product A is reduced to 1
{
"_": "Pos",
"PN": "4",
"TS": "2025-04-24T08:36:04",
"IN": "1007",
"Dsc": "Product A",
"TaxG": "A",
"Amt": "-0.49",
"Qty": "-1",
"Pri": "0.49",
"Cat": "10",
"CatN": "Example Category",
"Void": "1"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "20.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-8.31"
}
]
}
}
}
// Response: the closing receipt keeps the RegId of the chain, its number comes from the SI series
{
"TraC": {
"SQ": 131,
"Result": {
"RC": "OK"
},
"ESR": {
"TN": "81",
"FN": "CZ2AveV90Ip:SI:001/1/1-43"
}
}
}
Example: Aborting a parked transaction
Instead of being finalized, a parked transaction can be discarded with NFS="ABORT". All articles carried over from the parking are reported as deleted.
- XML
- JSON
<Tra>
<ESR NFS="ABORT" ResumeFN="CZ2AveV90Ip:SI:001/1/1-43" TL="001" TT="1" T="12.18" Opr="101" OprN="Sofia Eriksson">
<PosA>
<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" Resume="1"/>
<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" Resume="1"/>
<Pos PN="3" TS="2025-04-24T08:33:27" IN="5112" Dsc="Product C" TaxG="B" Amt="1.25" Qty="1" Pri="1.25" Cat="20" CatN="Example Category 2" Resume="1"/>
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "ABORT",
"ResumeFN": "CZ2AveV90Ip:SI:001/1/1-43",
"TL": "001",
"TT": "1",
"T": "12.18",
"Opr": "101",
"OprN": "Sofia Eriksson",
"PosA": [
{
"_": "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",
"Resume": "1"
},
{
"_": "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",
"Resume": "1"
},
{
"_": "Pos",
"PN": "3",
"TS": "2025-04-24T08:33:27",
"IN": "5112",
"Dsc": "Product C",
"TaxG": "B",
"Amt": "1.25",
"Qty": "1",
"Pri": "1.25",
"Cat": "20",
"CatN": "Example Category 2",
"Resume": "1"
}
]
}
}
}
Printing Periodic Reports
The FP-T88FVA and FP-T88FVA Online printers support generating periodic reports. Two types are available:
PERIODIC_REPORT — A fiscal periodic report aggregated from daily reports
PERIODIC_SUM_REPORT — A total summary periodic report
Request Format
Reports are generated using this endpoint:
POST
/register
Example: Periodic Fiscal Report
{
"Tra": {
"ESR": {
"TL": "001",
"TT": "1",
"NFS": "PERIODIC_REPORT",
"Opr": "101",
"OprN": "Mario Rossi",
"FromD": "2025-08-04",
"TillD": "2025-08-05"
}
}
}
Example: Periodic Summary Report
{
"Tra": {
"ESR": {
"TL": "001",
"TT": "1",
"NFS": "PERIODIC_SUM_REPORT",
"Opr": "101",
"OprN": "Mario Rossi",
"FromD": "2025-08-04",
"TillD": "2025-08-05"
}
}
}
| Parameter | Description | Country |
|---|---|---|
NFS | Specifies the report type | |
FromD | Defines the start of the date range for the report | |
TillD | Defines the end of the date range for the report |
ATTENTION: PLIn Poland, reports will always be printed until the current day. As such, no end date has to be defined.
Filtering by Z-Indexes
Both report types also support filtering based on Z-index ranges using FromZI and ToZI
Example
{
"Tra": {
"ESR": {
"TL": "001",
"TT": "1",
"NFS": "PERIODIC_SUM_REPORT",
"Opr": "101",
"OprN": "Mario Rossi",
"FromZI": "1",
"ToZI": "2"
}
}
}
Service Points
Service points are used to specify where a service is booked to. They represent the location or context in which a service is provided, such as a table, room, or other point of service.
SvcPoint, RSvcPoint
A Service Point defines the booking and accounting location. For usage examples please check the business cases ORDER, SVC_POINT_TRANSFER, SVC_POINT_SPLIT further below.
| Property | Description | Note |
|---|---|---|
| Id | Id of the Service Point | Examples: T1, Table 1 |
| Type | Service Point Type | Possible Values:TABLECHAIR *ROOMCUSTOMERON_HOLDKIOSKPLATFORMWEBSHOPOTHER* Only allowed with ParentSvcPoint |
| ParentSvcPoint | Mandatory when SvcPoint. Type Chair is used | |
| Id | Id of the Service Point | |
| Type | Service Point Type | TABLE |
- PLATFORM should be used when orders are received from a linked third party online platform in the case where a signSale is not immediately created.
- WEBSHOP should be used when orders are received from an own linked webshop in the case where a signSale is not immediately created. OTHER should be used for any other way the POS uses to put orders aside and for which the reference value can be used to fill in with the value the POS uses internally to search for the orders or to bundle them.
Order booked on Table 1:
- XML
- JSON
<SvcPoint Id="Table 1" Type="TABLE" />
{
"SvcPoint": {
"Id": "Table 1",
"Type": "TABLE"
}
}
Order booked on Chair 1 of Table 1:
- XML
- JSON
<SvcPoint Id="Chair 1" Type="CHAIR">
<ParentSvcPoint Id="Table 1" Type="TABLE"/>
</SvcPoint>
{
"SvcPoint": {
"Id": "Chair 1",
"Type": "CHAIR",
"ParentSvcPoint": {
"Id": "Table 1",
"Type": "TABLE"
}
}
}
When SvcPoint.Type CHAIR is used it can only be done in combination with ParentSvcPoint.Type TABLE.
NFS="ORDER"
Supplying a SvcPoint is mandatory for the Order case. All transactions resulting from a previous Order must include the Service Point.
Example: Order to Table 1
- XML
- JSON
<Tra>
<ESR NFS="ORDER" TL="001" TT="1" T="8.40" OprSSN="00000000097" OprN="Mario Rossi">
<!-- Specifies where the order is booked to -->
<SvcPoint Id="Table 1" Type="TABLE" />
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="4.00" Qty="2" QtyU="Pc." Pri="2.00" Cat="10" CatN="Example Category 10" />
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Pos PN="3" IN="1030" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "ORDER",
"TL": "001",
"TT": "1",
"T": "8.40",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"SvcPoint": {
"Id": "Table 1",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "4.00",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "2.00",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
}
]
}
}
}
Example: Sale afterwards
- XML
- JSON
<Tra>
<ESR TL="001" TT="1" T="8.40" OprSSN="00000000097" OprN="Mario Rossi">
<!-- Specifies where the order was booked to -->
<SvcPoint Id="Table 1" Type="TABLE" />
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="4.00" Qty="2" QtyU="Pc." Pri="2.00" Cat="10" CatN="Example Category 10" />
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Pos PN="3" IN="1030" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" InputMethod="manual" PayG="cash" Amt="8.40" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"TL": "001",
"TT": "1",
"T": "8.40",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"SvcPoint": {
"Id": "Table 1",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "4.00",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "2.00",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"InputMethod": "manual",
"PayG": "cash",
"Amt": "8.40"
}
]
}
}
}
NFS="SVC_POINT_TRANSFER"
For moving or merging positions from one or more service points to one target service point.
Example: Moving Table 1 to Table 5
- XML
- JSON
<Tra>
<ESR NFS="SVC_POINT_TRANSFER" TL="001" TT="1" T="5.48" OprSSN="00000000097" OprN="Mario Rossi">
<!-- Source(Reference) Svc Point -->
<RSvcPoint Id="T1" Type="TABLE" />
<!-- Target Service Point -->
<SvcPoint Id="T5" Type="TABLE" />
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Test" />
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "SVC_POINT_TRANSFER",
"TL": "001",
"TT": "1",
"T": "5.48",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"RSvcPoint": {
"Id": "T1",
"Type": "TABLE"
},
"SvcPoint": {
"Id": "T5",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Test"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
}
]
}
}
}
Example: Merging Table 1 and Table 35 to Table 5
- XML
- JSON
<Tra>
<ESR NFS="SVC_POINT_TRANSFER" TL="001" TT="1" T="5.48" Opr="00000000097" OprN="Mario Rossi">
<!-- Target Svc Point -->
<SvcPoint Id="T5" Type="TABLE" />
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Test">
<!-- Source(Reference) Svc Point -->
<RSvcPoint Id="T1" Type="TABLE" />
</Pos>
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11">
<!-- Source(Reference) Svc Point -->
<RSvcPoint Id="T35" Type="TABLE" />
</Pos>
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "SVC_POINT_TRANSFER",
"TL": "001",
"TT": "1",
"T": "5.48",
"Opr": "00000000097",
"OprN": "Mario Rossi",
"SvcPoint": {
"Id": "T5",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Test",
"RSvcPoint": {
"Id": "T1",
"Type": "TABLE"
}
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11",
"RSvcPoint": {
"Id": "T35",
"Type": "TABLE"
}
}
]
}
}
}
NFS="SVC_POINT_SPLIT"
Splitting positions from one service point, onto one or more target service points.
Example: Spitting of Table 1 to Table 5 and Table 35.
- XML
- JSON
<Tra>
<!-- The following example splits bookings from T1 onto T5 and T35. -->
<ESR NFS="SVC_POINT_SPLIT" TL="001" TT="1" T="5.48" OprSSN="00000000097" OprN="Mario Rossi">
<!-- Reference Svc Point (Source) -->
<RSvcPoint Id="T1" Type="TABLE" />
<PosA>
<!-- Split to T5 -->
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Test">
<!-- Target Svc Point -->
<SvcPoint Id="T5" Type="TABLE" />
</Pos>
<!-- Split to T35 -->
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11">
<!-- Target Svc Point -->
<SvcPoint Id="T35" Type="TABLE" />
</Pos>
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "SVC_POINT_SPLIT",
"TL": "001",
"TT": "1",
"T": "5.48",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"RSvcPoint": {
"Id": "T1",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Test",
"SvcPoint": {
"Id": "T5",
"Type": "TABLE"
}
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11",
"SvcPoint": {
"Id": "T35",
"Type": "TABLE"
}
}
]
}
}
}
Example: Splitting so each customer gets their own receipt
Split table to Chair 1 and Chair 2
- XML
- JSON
<Tra>
<ESR NFS="SVC_POINT_SPLIT" TL="001" TT="1" T="5.48" OprSSN="00000000097" OprN="Mario Rossi">
<!-- Reference Svc Point (Source) -->
<RSvcPoint Id="T1" Type="TABLE" />
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Test">
<!-- Target: Table 1 - Chair 1 -->
<SvcPoint Id="C1" Type="CHAIR">
<ParentSvcPoint Id="T1" Type="TABLE" />
</SvcPoint>
</Pos>
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11">
<!-- Target: Table 1 - Chair 2 -->
<SvcPoint Id="C2" Type="CHAIR">
<ParentSvcPoint Id="T1" Type="TABLE" />
</SvcPoint>
</Pos>
</PosA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"NFS": "SVC_POINT_SPLIT",
"TL": "001",
"TT": "1",
"T": "5.48",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"RSvcPoint": {
"Id": "T1",
"Type": "TABLE"
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Test",
"SvcPoint": {
"Id": "C1",
"Type": "CHAIR",
"ParentSvcPoint": {
"Id": "T1",
"Type": "TABLE"
}
}
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11",
"SvcPoint": {
"Id": "C2",
"Type": "CHAIR",
"ParentSvcPoint": {
"Id": "T1",
"Type": "TABLE"
}
}
}
]
}
}
}
Receipt for Customer on Chair 1
- XML
- JSON
<Tra>
<ESR TL="001" TT="1" T="3.98" OprSSN="00000000097" OprN="Mario Rossi">
<SvcPoint Id="C1" Type="CHAIR">
<ParentSvcPoint Id="T1" Type="TABLE" />
</SvcPoint>
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Test" />
</PosA>
<PayA>
<Pay PayG="CreditCard" Dsc="creditcard" InputMethod="auto" Amt="3.98" />
</PayA>
</ESR>
</Tra>
{
"Tra": {
"ESR": {
"TL": "001",
"TT": "1",
"T": "3.98",
"OprSSN": "00000000097",
"OprN": "Mario Rossi",
"SvcPoint": {
"Id": "C1",
"Type": "CHAIR",
"ParentSvcPoint": {
"Id": "T1",
"Type": "TABLE"
}
},
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Test"
}
],
"PayA": [
{
"_": "Pay",
"PayG": "CreditCard",
"Dsc": "creditcard",
"InputMethod": "auto",
"Amt": "3.98"
}
]
}
}
}





