If you use the Hosted Receipts API, OpenFiskal renders a compliant receipt for you and you can skip this page.
What a receipt must contain
A German KassenSichV receipt must include the fields below, grouped by where they come from. Commercial fields. Always print these in readable form. They come from the operation and the merchant record you already hold.- Full name and address of the merchant: merchant record (
legal_name,address). - Date of issue: your print time.
- Quantity and type of goods or services: operation
line_items(title,quantity). - Total amount, tax amount, and tax rate (or exemption note): operation totals and
line_items[].taxes[].
fiscal_information on the completed operation. You do not print all of them as text. Either print them as text or carry them in the TSE data QR code. The TSE data QR code contains all of them, so it alone covers this group. See TSE data QR code below.
- Start of the transaction:
start_event.signed_at. - End of the transaction:
end_event.signed_at. - Transaction number:
document_number. - Serial number of the recording system (Kasse):
pos_client_serial_number. - Serial number of the security module (TSE):
tss_serial_number. - Signature (Prüfwert) of the transaction end:
end_event.signature. - Continuous signature counter:
end_event.transaction_counter.
end_event.transaction_counter is the signature counter (Signaturzähler), not the transaction number. The transaction number is document_number.Serial numbers
Two serial numbers are required: the serial number of the recording system (the cash register) and the serial number of the security module (the TSE).pos_client_serial_number is the recording-system serial signed into the TSE. It is returned on every transaction and is stable for the lifetime of the register. tss_serial_number is the serial number of the TSE itself.
TSE data QR code
verification.qr_data is the complete TSE data QR code string defined by the DSFinV-K (the V0;… format in Appendix I). It is ready to print as-is. The value is the content of the code, not a rendered image. Encode it to a QR code in your application logic.
The string is a list of fields separated by semicolons, in this order:
- Format version (
V0) - Recording-system serial (
pos_client_serial_number) - Process type (
Kassenbeleg-V1) - Process data (amounts per tax rate and payment type)
- Transaction number
- Signature counter
- Transaction start time
- Transaction end time
- Signature algorithm
- Time format
- Signature value
- TSE public key
Layout options
You can print the receipt in any of three compliant layouts:- The TSE data QR code only.
- All TSE fields as plain text.
- The TSE data QR code plus any plain-text fields you choose.
With the TSE data QR code. The commercial fields are printed, and the TSE data QR code replaces the TSE text block.
With the TSE fields as plain text. The same commercial fields are printed, with the TSE fields as labelled text instead of the code.