# efsta EFR API and guides > All pages of the EFR API and EFR guides sections of https://docs.dev.efsta.eu, EFR API specification version 2026-09-16. Index: https://docs.dev.efsta.eu/llms.txt --- source: https://docs.dev.efsta.eu/efr/api/additional-functions --- # EFR Additional Functions :::tip[Important Information to the generic Interface] 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. :::

## Transaction Requests
**POST /restart – Restart Transaction** | | | | |-------|-------|---------------------------| | Query | RN | Optional RN, default: def | | | TaxId | Optional TaxId | Formal identically to `/register`, to be used on system restart/recovery. Use it instead of `/register` when re-sending a transaction after a POS crash or restart, because duplicate detection is deliberately broader here. On `/register`, `#DUPLICATE` is only reported for an exact match of the transaction identity. On `/restart` it is reported as well when: * `ESR.TN` is missing, or * `ESR.D` is missing or differs from the stored transaction. That way a re-send is still recognised as the same transaction even if the POS could not preserve the original transaction number or timestamp. An already-registered transaction returns `Result.RC="OK"` with `ErrorCode="#DUPLICATE"` and is **not** recorded a second time.
**POST /register/void – Void Transaction** Supply the original transaction data in the request body. EFR will invert amount and quantity fields, add reference information and register as negative transaction. :::warning The original transaction is not deleted! ::: Voiding the transaction of another EFR or client is basically permitted. TL, TT and TN contained in original data are used as reference (RTL, RTT, RTN), for the current post local TL and TT settings are used, also automatic TN. If TN comes from the sender system, it has to be determined in "Sender ESR" (in addition to the original data): ``` ` only). If required, an `ESR.Rsn` value can be specified with `?rsn=...`
**PUT /repo – Register Configuration Change into Audit trail** | | | | |-----------------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Query | RN | Optional RN, default: def | | | file | Mandatory, \[path\], filename
Upload configuration file, which is analysed for changes relative to a last version of that file, if applicable. Changes are calculated per line, entered into the audit trail \[FR\]
, and returned. | | Request Header | accept | xml (optional)
In this case a XML document is returned instead of a JSON object | | Request Example | | http://localhost:5618/repo?file=test.dat | | Request Body | | plain/txt, UTF-8 | | Response Status | | 200 OK, 400 Bad Request=BAD, 406 Not Acceptable=NO | | Response Body | | XML or JSON transaction, UTF-8 | Response Example JSON: ``` {"AuditC":{ "SQ":8274, "Result":{"RC":"OK"}, "TY":"Repo","Method":"PUT","File":"test.dat", "Diff":\[ "+\[0\]: Aurea prima sata est aetas, quae vindice nullo,", "+\[1\]: sponte sua, sine lege fidem rectumque colebat. ", "+\[2\]: etc.etc."\], "Fis":{"Payload":"141,300,Repo,20170905183326,,0014/0001,N,oeZrvtZkwQX…, "Signature":"\_OodHQgZHeDHj51p…}}} ```
**GET /repo – Register Configuration Change into Audit trail** | | | | | --- | --- | --- | | Query | RN | Optional RN, default: def | | | file | Mandatory, filename
Retrieve current documented configuration state for a given filename. | | Request Header | Accept | xml (optional) | In this case a XML document is returned instead of a JSON object | | Response Status | | 200 OK, 404 No file of this name found | | Response Body | | XML or JSON transaction, UTF8 |
## Informational Requests
**GET /cer – Certificate** Get public certificate from file `/EFR/cer/{Serial}.pem`. Example:
http://localhost:5618/cer/fa814462362ea68d1a0d Content-Type:
application/x-pem-file
**GET /recorder/lastdh – Last Document Handle** Use this request after /register to get the Document Handle to this transaction for download of the Digital Receipt from efsta cloud. If you show this URL as QR code on the POS customer display, the bill can be fetched onto a smartphone. Try out http://localhost:5618/demo/register.html, see "Your Bill" after \[Register\]).
Here, it is implemented as HTML ``. To achieve a small QR code use
http://localhost:5618/recorder/lastdh/qr?small=true&ec_level=L - With the "small" option, the 5 char Transaction Handle TH is omitted, what may cause longer loading time for bill.efsta.net/dh - `ec_level=L` forces an QR code with low error correction - Possible QR options: `ec_level: L|M|Q|H`, `size: default 5`, `margin: default 4`, `fmt: png|pc437|bmp|svc|pdf|eps` - Attention: when using `` response.
**GET /log – Realtime Logging** | | | | |-----------------|-----|-------------------------------------------------------------------------------------------------------------------| | Query | iid | Instance id (e.g. computer name), keep static for one client
used to respond with the latest log lines only | | Request Example | | http://localhost:5618/log?iid=HUGO23 | Response Example: ``` { "Lines":\["16:14:37.083 Checkin {\\"log\\":{\\"TY\\":\\"START_EFR\\",… ``` Used for interactive log viewer.
## Journal
**POST /render – Show Transaction** To render a specific transaction, JSON
`{"\_":"Tra"… or XML … data (fetched using /find or /tra before)`
can be posted.
**GET /retrieve – Retrieve Journal Records** | | | | |-----------------|--------|--------------------------------------------------------------------| | Query | RN | Optional, journal to use, default: 'def' | | | last | Required, SQ to start reading behind
last=0 from beginning | | | endSQ | End point | | | target | Folder to store retrieved #######.json | | | | Further filter options see 5.4.4 GET /find – Find Journal Record | | Request Example | | http://localhost:5618/retrieve?rn=210&_=Tra | | Authentication | | Local operation only (localhost) or Profile.Password authorization | | Response Body | | XML or JSON data stream | This request is intended to do periodical retrieval of records for backup or closure/balance reporting. Retrieval is started with SQ _behind_ the last query parameter, for contiguous processing send the last SQ recently processed.
**POST|GET /jou/reprintcnt – Reprint Count (deprecated)** :::warning[Deprecated] `/jou/reprintcnt` is deprecated and is only documented for reference of existing integrations. Register the reprint as a non-fiscal transaction marked `NFS="DUP"` instead – see the business case [Reprints](/efr/api/business-cases#reprints). ::: | | | | |-----------------|-----------------|----------------------------------------------------------------------------------------------------| | Query | RN | Journal to use, default: 'def'
do not specify if parameter RN_TT is set (see 6 Configuration) | | | TL, TT, TN, ESR | Properties used as identification key | | Request Example | | http://localhost:5618/jou/reprintcnt?tl=001&tt=1&tn=4711 | | Authentication | | None | | Response Body | | Text/plain containing counter only | :::note In some countries each transaction reprint has to be marked with a counter; use this function to GET or POST (=increment) this count. In \[FR\]
a fiscal signature is delivered upon POST, for details see [EFR Guide FR (PDF)](https://public.efsta.net/efr/FR/EFR_Guide_[FR]_v1.50.pdf). ::: :::tip[Good to know] As with version 1.5.2 the counter data is stored locally, a common cloud enumeration will be implemented in a future version of EFR. :::
## Maintenance
**POST /service/restart – Restart App** :::note Despite the name this only **shuts the application down**. It does not start it again itself — coming back up depends on the surrounding service manager (Windows service, systemd unit, container restart policy). If nothing is configured to restart the EFR, it stays down. ::: Request Example:
http://localhost:5618/service/restart?password=mypwd Authentication:
local operation only (localhost) or Profile.Password authorization Response:
http status code 200, empty body
**GET|POST /service/config – Service Configuration** Browser URL:
http://localhost:5618/service/config Web form to configure incremental backup storage path and retrieve last backup result. ![Service-Config](./img/service_cfg.PNG)
**GET /backup – Download Backup .zip** | | | | |-----------------|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Query | RN | Optional, backup for RN, default: 'def' | | | from | Optional date | | | last | Optional, name of last backup file received
Used for incremental backup, default: full backup | | Request Example | | http://localhost:5618/backup?rn=4711&last=0023 | | Authentication | | Local operation only (localhost) or Profile.Password authorization | | Response Header | Content-type | application/zip | | | Content-disposition | attachment; filename=####.zip
The filename is derived from the latest .jou file used. Therefore identical filenames may be delivered for subsequent backup jobs, files may be replaced on target directory. | | Response Body | | binary .zip file | For retrieving EFR log files http://localhost:5618/backup/log or set flag `/backup?log`.
**GET /backup/incremental – Incremental Backup onto Storage Directory** | | | | |-----------------|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Query | RN | Optional, backup for RN, default: 'def' | | | | Path specify path to backup storage root directory, where backup .zip files are stored under the corresponding RN subdirectory; example:
`path=D:/mybackup => D:/mybackup/def/0000.zip`
May be preset using /service/config API. | | Request Example | | http://localhost:5618/backup/incremental?path=D:/mybackup | | Authentication | | Local operation only (localhost) or Profile.Password authorization | Response Header | Content-type | text/plain | | Response Body | | Processing info
Processing time depends on data volume stored and storage access speed. |
**GET|POST /backup/restore – Restore onto new (unused) EFR Installation** | | | | |-------------|------|---------------------------------------| | Query | RN | Name of RN to restore, default: 'def' | | | path | Path to backup storage | | Browser URL | | http://localhost:5618/backup/restore | ![Backup-Restore](./img/backup_restore.PNG) :::info **ONLINE**
Restore may be used on offline systems (not connected to efsta cloud) only. **IN_USE**
RN folders in use may not be overwritten. ::: :::note After hitting the \[RESTORE\] backup .zip files from path are restored.
Progress of restauration is displayed on screen or may be fetched using GET /backup/info. :::
**GET /backup/log – Download Logging .zip** | | | | |-----------------|--------------|---------------------------------------------------------------------------------------------| | Query | RN | Optional, backup for RN, default: def | | | from | Optional, JSON date, deliver .log from date | | | till | Optional, JSON date, deliver .log to date | | Request Example | | http://localhost:5618/backup/log?rn=4711&last=0023 | | Authentication | | No permission required, only .log processing information without business data is delivered | | Response Header | Content-type | application/zip | | Response Body | | binary .zip file | :::note This request may be used to fetch logs from an EFR for support purposes. In online configurations an uploadlog request may be triggered from cloud. :::
**GET /disk – Storage Information** Request Example:
http://localhost:5618/disk Response Example: ``` {"Usage":5.215046, "Path":{ "cer":{"dirs":3,"files":33,"size":2929363}, "gbl":{"dirs":1,"files":7,"size":11084}, "log":{"dirs":0,"files":59,"size":2039365}, "rn/def":{"dirs":4,"files":120,"size":235234}}} ``` Usage states the total storage used in MB.
**GET /disk/dir – Remote DIR Request** Request Example:
http://localhost:5618/disk/dir Delivers a directory list (text/plain) with last modification timestamp and size in bytes.
**POST /disk/clean – Clean Storage** | | | | |-----------------|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Query | quota | Disk quota allowed in MB
in case of overrun cleaning is done to 80% of this value
does not affect DiskQuota Profile setting | | | keep | Date, from which files have to be kept
3 full months by default, i.e. on 2017-12-24 keep=2017-09-01 is used
a numeric value is interpreted as days, e.g. keep=90 | | Request Example | | http://localhost:5618/disk/clean?quota=800 | | Response Body | | XML or JSON
Storage Information according to GET /disk |
**POST /lic – Activate License** | | | | |-----------------|-----|----------------------------------------------------------| | Query | rn | Target client (by default "def") | | | key | License key retrieved from efsta Portal | | Request Example | | http://localhost:5618/lic?key=%20demo.cde.e202005.mzk5iv |
## Utility
**GET /authorization – Authorization for Third Party Cloud Access** | | | | |-----------------|--------------|--------------------------------------------------------------| | Request Example | | http://localhost:5618/authorization | | Response | JWT | Signed using EFR communication certificate | | | Content-type | text/plain | | Authentication | local | Operation only (localhost) or Profile.Password authorization |
**GET /qr – QR Image** | | | | |-----------------|--------------|-------------------------------------| | Query | text | QR source data (encodeURIComponent) | | | type | png (default), bmp, svg, pc437 | | | size | Module size in pixels | | | margin | In modules, default: 1 | | Request Example | | http://localhost:5618/qr?text=... | | Response Header | Content-type | image/png for image types | | | Content-type | text/plain for type=pc437 | Windows PowerShell example: ``` PS C:\\> curl Uri: StatusCode : 200 StatusDescription : OK Content : {137, 80, 78, 71...} ``` JavaScript example (simplified, text in URL): ``` C:\\> node \> var http = require('http') \> var req = http.request({ host:'localhost', port:5618, path:'/qr/'+encodeURI('hello world') }, res=>{ res.on('data', data=>{ console.log(data) }) // expected: }) \> req.end() ``` PC437 can be used to print a QR within HTML or a text file. For this PC437 block characters ' ▀▄█' (unicode ` ▀▄█`) are used. For negative rendering (e.g. on screen) invert to \[219, 220, 223, 32\]. VB-Script example (querystring parameters): ``` Set Http = CreateObject("Msxml2.ServerXMLHTTP") Http.open "GET", "" & Fis_Code, True Http.send "" Do While Http.readyState <> 4 Http.waitForResponse 10 Loop If Http.Status = 200 Then Printer.Font.Name = "Courier New" Printer.Font.Size = 3 Printer.Font.Charset = 255 ' OEM_CHARSET PC437 Printer.Print Http.responseBody End If ```
## Manage Custom Layout Files Custom layout files (EJS or PUG templates) can be managed through the `/peri/layout` endpoint.
**GET /peri/layout – Retrieve Custom Layout(s)** | | | | |-----------------|--------|--------------------------------------------------------------------------------------------------| | Query | name | Optional, name of a specific layout to retrieve (without file extension) | | | RN | Optional RN, default: def | | | type | Optional, filter by layout type: `pug` or `ejs` | | | | If no query parameters are provided, all available layouts are returned | | Request Example | | http://localhost:5618/peri/layout?name=TRAINING | | Response Status | | 200 OK, 404 Not Found | | Response Body | | XML or JSON layout information, UTF-8 | **Response Fields:** | Field | Description | |--------------|----------------------------------------------------------------| | RN | Register Number the layout belongs to | | layouts | Array of matching layout entries | | layouts.name | Layout name (without file extension) | | layouts.filePath | File system path to the layout template file | | layouts.layoutType | Template engine type: `EJS` or `PUG` | **Response Examples:** ```xml def TRAINING path/to/TRAINING.ejs EJS ``` ```json { "RN": "def", "layouts": [ { "name": "TRAINING", "filePath": "path/to/TRAINING.ejs", "layoutType": "EJS" } ] } ``` :::note When no `name` or `type` filter is specified, all custom layouts across the given RN are returned. The `layouts` array will contain one entry per layout file found. ::: **Error Response (404 Not Found):** ```xml BAD #FILE_NOT_FOUND Layout file not found ``` ```json { "Result": { "RC": "BAD", "ErrorCode": "#FILE_NOT_FOUND", "Message": "Layout file not found" } } ```
**POST /peri/layout – Upload Custom Layout File** | | | | |-----------------|--------------|----------------------------------------------------------------------------------------------| | Query | RN | Optional RN, default: def | | Request Example | | http://localhost:5618/peri/layout | | Content-Type | | `multipart/form-data` | | Request Body | file | Form-data file upload — the layout template file (`.pug` or `.ejs`)
The layout name and type are derived from the uploaded filename | | Response Status | | 201 Created, 400 Bad Request, 409 Conflict | | Response Body | | XML or JSON confirmation, UTF-8 | Upload a custom layout template file using `multipart/form-data`. The file is stored under the RN configuration directory. The layout name and type are determined from the uploaded filename (e.g. `TRAINING.pug`). **Success Response (201 Created):** ```xml training PUG def path/to/training.pug ``` ```json { "name": "training", "layoutType": "PUG", "RN": "def", "filePath": "path/to/training.pug" } ``` **Error Responses:** 400 – Missing file upload: ```xml BAD #MISSING_FILE Missing required file upload ``` 400 – Template syntax error: ```xml BAD #PUG_SYNTAX_ERROR Unexpected token (2:15) ``` 409 – File already exists: ```xml BAD #FILE_EXISTS File already exists. ``` 400 – Missing file upload: ```json { "Result": { "RC": "BAD", "ErrorCode": "#MISSING_FILE", "Message": "Missing required file upload" } } ``` 400 – Template syntax error: ```json { "Result": { "RC": "BAD", "ErrorCode": "#PUG_SYNTAX_ERROR", "Message": "Unexpected token (2:15)" } } ``` 409 – File already exists: ```json { "Result": { "RC": "BAD", "ErrorCode": "#FILE_EXISTS", "Message": "File already exists." } } ``` :::tip[Good to know] Use the PUG Editor (`/peri/pugedit`) for interactive editing and previewing of PUG layout templates directly in the browser. :::
**PUT /peri/layout – Update Custom Layout File** | | | | |-----------------|--------------|----------------------------------------------------------------------------------------------| | Query | RN | Optional RN, default: def | | Request Example | | http://localhost:5618/peri/layout | | Content-Type | | `multipart/form-data` | | Request Body | file | Form-data file upload — the updated layout template file (`.pug` or `.ejs`)
The layout name and type are derived from the uploaded filename | | Response Status | | 200 OK, 400 Bad Request, 404 Not Found | | Response Body | | XML or JSON confirmation, UTF-8 | Update an existing custom layout template file using `multipart/form-data`. The layout to update is identified by the uploaded filename (e.g. `training.pug`). **Success Response (200 OK):** ```xml training PUG def path/to/training.pug ``` ```json { "name": "training", "layoutType": "PUG", "RN": "def", "filePath": "path/to/training.pug" } ``` **Error Responses:** 400 – Missing file upload: ```xml BAD #MISSING_FILE Missing required file upload ``` 400 – Template syntax error: ```xml BAD #PUG_SYNTAX_ERROR Unexpected token (2:15) ``` 404 – Layout not found: ```xml BAD #FILE_NOT_FOUND Layout file not found ``` 400 – Missing file upload: ```json { "Result": { "RC": "BAD", "ErrorCode": "#MISSING_FILE", "Message": "Missing required file upload" } } ``` 400 – Template syntax error: ```json { "Result": { "RC": "BAD", "ErrorCode": "#PUG_SYNTAX_ERROR", "Message": "Unexpected token (2:15)" } } ``` 404 – Layout not found: ```json { "Result": { "RC": "BAD", "ErrorCode": "#FILE_NOT_FOUND", "Message": "Layout file not found" } } ```
**DELETE /peri/layout – Delete Custom Layout File** | | | | |-----------------|--------|--------------------------------------------------------------------------------------------------| | Query | name | Required, name of the layout to delete (without file extension) | | | RN | Optional RN, default: def | | Request Example | | http://localhost:5618/peri/layout?name=training | | Response Status | | 200 OK, 404 Not Found | | Response Body | | XML or JSON, UTF-8 | **Success Response (200 OK):** ```xml training PUG def true ``` ```json { "name": "training", "layoutType": "PUG", "RN": "def", "deleted": true } ``` **Error Response (404 Not Found):** ```xml BAD #FILE_NOT_FOUND Layout file not found ``` ```json { "Result": { "RC": "BAD", "ErrorCode": "#FILE_NOT_FOUND", "Message": "Layout file not found" } } ```
## File Interface Instead of using a webservice, transactions can be registered using a file interface. In this case a request file is provided on the request directory, with the response being delivered as response file. As first step, the communication directories have to be created. The FileWatch operation will only be started if the following exists on EFR startup: `C:\\> mkdir C:\\ProgramData\\EFR\\req`
`C:\\> mkdir C:\\ProgramData\\EFR\\res` :::note Directory req serves as 'request' container, res is for response files. ::: As soon as a file `req\1234.req` is created (XML or JSON formatted), the response is provided in `res\1234.res` and the .req is deleted. After processing, the .res file has to be removed by the foreground application. The files have to be uniquely named (e.g. corresponding to Transaction Number TN, UUID, time stamp), if multiple clients are handled in one EFR, also add client ID 'RN'. Query parameters usually set in `/register` webrequest (RN, TaxId) can be set within request data, e.g.: ``` > Attributes p.), a file 1234.bmp is created in `\res`. The proper function of FileWatch depends on the underlying file system. If this does not support native watching, the program will switch to directory polling (300ms interval). On some systems, files are not locked during writing and parser errors may occur. In this case, creating a temporary file 1234.tmp and renaming it to 1234.req is recommended. ## Attributes In `profile.cfg` Attributes field flags can be set for transaction processing. Attributes is parsed as space delimited list according to HTML element definition, Attr names are case insensitive. Formally valid declarations: ``` myattr myattr=hello myattr="hello world" myattr='hello "world"' ``` Declaration without attribute value is interpreted as true. :::tip[Good to know] Attributes affecting general program behaviour may require EFR restart to get into action. :::
**Table of Attributes** | Attribute |    Countries    | Module | Remarks | |---------------------------|:------------:|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | App_restartAt | | app | Perform automatically a daily restart at hh:mm:ss (default 3:00) | | Device_Auth | | | Authorization with external devices with username and password e.g.: `Device_Auth=username:password` | | eDoc_test | | Normalize | Deliver e-invoices to the country's test platform a plain 2-letter `ESR.DD` is extended by `-TEST`, e.g. `FR` becomes `FR-TEST` an explicit DD like `PL-DEMO` is left unchanged not the same as `Fiscal_Test` (training mode) see [E-Invoicing](/e_invoicing/api/general) | | EFR_test | | Cloud | Handle EFR instance as test system reports are not forwarded to the Fiscal Authority (or marked as 'test' resp.) | | FileWatch_path | | FileWatch | Network path to watched folder example: `FileWatch_path=\\share\EFR` | | Fiscal_ApiKey |
[PT] Flag Portugal
| Fiscal | Fiscal partner reference restart EFR for activation | | Fiscal_BackupAt |
[DE] Flag Germany
| Fiscal | Time at which the daily TSE backup should be performed default: 04:00 | | Fiscal_acceptUnauthorized |
[CZ] Flag Czechia
| Messenger | Not to be used generally, workaround for Error: unable to verify the first certificate This occurs, if the Fiscal System does not supply the whole SSL certificate chain on startup of a TLS connection. | | Fiscal_Log | | Fiscal, Messenger | Write `/rn/def/log/yyyymmdd_hhmmss.log` files (containing fiscal XML) for _all_ transactions, not only in case of error use this option to check the fiscal representation of special business cases | | Fiscal_Rules |
[FR] Flag France
[SK] Flag Slovakia
| Fiscal | Fiscalization rules to follow, e.g. `Fiscal_Rules=LNE` | | Fiscal_Test |
[AT] Flag Austria
| Fiscal | Interpret transactions as `NFS="Training"` transactions are processed as "Training" according to fiscal law | | Fiscal_Test |
[CZ] Flag Czechia
[DE] Flag Germany
[FR] Flag France

[HR] Flag Croatia
[SI] Flag Slovenia
[SK] Flag Slovakia
| Fiscal | Report transaction to Fiscal Authority's playground system< set this attribute during test phase | | Fiscal_Timeout |
[AT] Flag Austria
[CZ] Flag Czechia
[DE] Flag Germany

[HR] Flag Croatia
[IT] Flag Italy
[SI] Flag Slovenia

[SK] Flag Slovakia
| Fiscal, Messenger, TSE_\* | Timeout in ms for fiscal processing (request to fiscal system, local signature creation or remote sign request) timeout testing: `fiscal_timeout=1` | | Fiscal_YearEnd |
[FR] Flag France
| Fiscal | Specify month, when audit code 60 "Clôture d’exercice" shall be reported (01-12, default: 12) | | Fiscal_Z | | Launch | If set, a Z-Report / End of Day is inserted before registration of a transaction for the new date (ESR.D). In countries with a fiscal printer, a daily closing statement is printed as a receipt. | | Fis_Certification |
[FR] Flag France
| Fiscal | Certification number printed in the `Code:` tag (issued by INFOCERT). Default: `B0000` (NF525) or `00000-0` (LNE). Set to `none` to omit the tag. | | Fis_Sec |
[FR] Flag France
| Fiscal | Alias for `Fis_Certification`; takes precedence if both are set. | | Fis_Code |
[CZ] Flag Czechia
| Fiscal | Deliver PKP in `` | | Fis_OCR |
[AT] Flag Austria
| Fiscal | Add OCR string to `` element in response (BASE32 coded) | | Fis_QR |
[AT] Flag Austria
[DE] Flag Germany
[SI] Flag Slovenia
| Fiscal | Add QR image (base64) to `` element in response specify type and size according to `/control/qr` example: `fis_qr=type=png&size=2&ec_level=L` | | Fis_Tot | | Checkout | Include fiscal grand totals in responses `` element | | FN_series |
[PT] Flag Portugal
| Fiscal | Series ("A"-"Z", excluding "M") to be used after replacement and initialization of a POS system to avoid duplicates with previously issued documents | | HttpServer_Disable | | app | Do not start webserver, transaction registration may be done using the file interface directories `/req` and `/res` | | HttpServer_IPv4 | | HttpServer | Use IPv4 addressing instead of IPv6 Windows XP: automatically set to true, reset with `httpserver_ipv4=6` | | HttpServer_respond102 | | HttpServer | During request processing (e.g. completion of fiscal printout) respond intermediate HTTP-Status 102 (after ms specified, default 9000) | | HttpServer_respond200 | | HttpServer | Respond HTTP-Status 200 also in case of BAD and NO some requestors can parse a success response only | | HttpServer_AllowOrigin | | HttpServer | Set HTTP-Header Access-Control-Allow-Origin on all requests (CORS) example: `HttpServer_AllowOrigin=localhost` | | HttpServer_AllowCredentials | | HttpServer | Set HTTP-Header Access-Control-Allow-Credentials on all requests (authenticated CORS) example: `HttpServer_AllowCredentials=true` | | IO_debug | | IO | Request additional IO logging | | IO_nosync | | IO | Do not sync onto hard disk setting this attribute on systems with UPS improves transaction throughput | | IO_DeferTimeout | | IO | Defer .jou writing (in ms, default 1000) | | Log_debug | | Log | Log without .log file size limits | | Log_length | | Log | Length of log lines into `/EFR/log/\*.log` | | Log_remove | | Log | RegExp to specify items to be removed from log lines example to remove amounts: `Log_remove=[=:]"?\d*\.\d+"?` | | Normalize_D | | Normalize | Number of days for ESR.D date validation (default 7) example approx. 1 month: `Normalize_D=31` | | Print_Log | | Print | Creates check file `/EFR/rn/def/print.log` (intermediate html) | | Printer | | Deliver | Specify printer driver (in directory `/Peri/driver`) for transaction printing example: `Printer=Epson_TM` | | Printer_Port | | Fiscal printer modules | Connection port assignment example: `COM1:9600 ETH:192.168.0.2` | | Printer_Log | | fiscal printer modules | Printer communication is traced into `/EFR/log/yyyymmddp.log` | | Recorder_init | | Recorder | Delay for initialization of cloud connection in ms (default 10000) adjust this parameter in case of specific system startup behaviour example: `recorder_init=60000` (1 minute) | | Recorder_Log | | Recorder | Log online cloud communication into `/log/{date}r.log` | | Recorder_staging | | Recorder | efsta internal: use cloud staging instance
restart EFR to take effect | | Register_disable |
[AT] Flag Austria
| app | Not a registration EFR instance set on SignServer instances | | SC_disable | | app | Do not use local smartcards | | SC_ignore |
[AT] Flag Austria
| SC | Do not connect the smartcard reader specified, so it can be used by other applications – specify reader name (RegExp, cas insensitive) example: `SC_ignore=gemplus` | | SC_Log |
[AT] Flag Austria
| SC | Smartcard APDU command tracing into `/log/{date}s.log` | | Sign_debug |
[AT] Flag Austria
| A-Trust Prime-Sign | Additional web request logging | | SignServer |
[AT] Flag Austria
[DE] Flag Germany
| SignServer TSE | EFR SignServer operation, other EFRs in the same LAN may use the smartcards or TSEs of this server | | SoftwareProvider | | Cloud | Provider of POS software used in efsta cloud for hierarchial EFR management, if a company is served by different software providers | | TEST_Verify_err |
[CZ] Flag Czechia
[SI] Flag Slovenia
[SK] Flag Slovakia
| Messenger | For testing an invalid signed response from fiscal system | | TEST_RC | | Normalize | For testing a BAD or NO response example: test_rc=NO | | Tra_DH | | Checkout | Include Document Handle DH in /register `` response for bill.efsta.net access (EFR in Online mode required) | | TSE_AdminPin |
[DE] Flag Germany
| TSE | Set the AdminPin for the TSE. See [EFR Guide DE](/efr/DE) | | TSE_AdminPuk |
[DE] Flag Germany
| TSE | Set the AdminPuk for the TSE. See [EFR Guide DE](/efr/DE) | | TSE_BackupAt |
[DE] Flag Germany
| TSE | Configure TSE backup time for local and remote TSE (default randomized between 03:10:00 and 04:10:00) set `TSE_BackupAt=NO` to disable automatic backup | | TSE_BackupDelete |
[DE] Flag Germany
| TSE | Set this flag to enable TSE export backup for manufacturer TSE server drivers like Diebold-Nixdorf or Epson (local and network): export/backup and delete is performed after each Z Report (NFS=Z) | | TSE_install |
[DE] Flag Germany
| TSE_DF, TSE_SBC | Set `TSE_install=NO` to block automatic driver installation from efsta cloud, the driver manually installed is used valid for Deutsche Fiskal cloud TSE | | TSE_KeepAlive |
[DE] Flag Germany
| TSE_SB | Set device polling interval in sec (default 10), which may be required to block automatic USB power off by system’s energy management valid for Swissbit local TSE | | TSE_MountPoint |
[DE] Flag Germany
| TSE | Set path to TSE mount points on Linux, e.g. `TSE_MountPoint=/mnt/` or specify devices to scan on Windows, e.g. `TSE_MountPoint=D:,E:` | | TSE_PortScan |
[DE] Flag Germany
| TSE | Example: `TSE_PortScan=10.0.0.10-20:10001,10.0.0.255:20001` see “TSE Assignment” for details | | TSE_SelfTestAt |
[DE] Flag Germany
| TSE_SB | Configure auto selfTest time (default 03:05:00) valid for Swissbit local TSE | | TSE_TimePin |
[DE] Flag Germany
| TSE | Set the TimePin for the TSE. See [EFR Guide DE](/efr/DE) | | TSE_TimePuk |
[DE] Flag Germany
| TSE | Set the TimePin for the TSE. See [EFR Guide DE](/efr/DE) | | UdpServer_disable |
[AT] Flag Austria
| app | Block SignServer action (as server) and signature (as client) |
## EFR as HTTPS Server ### Server Identity The EFR runs as an HTTPS server as soon as a server certificate is available. You can provide the certificate in one of the following ways – if more than one is present, the EFR uses the first match from the top of this list: | Priority | How to provide the certificate | |----------|--------------------------------| | 1 | A certificate file at a path you set with the environment variable `EFSTA_EFR_SSL_CERT` | | 2 | The certificate file `/EFR/cer/ssl.pfx` (uploaded via API or copied manually) | If no certificate is available, the EFR runs as a plain HTTP server. If a certificate is found but cannot be used (for example because of an incorrect password), the EFR also falls back to HTTP instead of failing to start. If HTTPS is enabled, it is effective also for web requests (e.g. https://localhost:5618/control). If (for inhouse communication only) a self signed certificate is used, this will cause a security alert from the browser: 1. in Google Chrome navigate here and click `[Enabled]` (source: stackoverflow.com) 2. in Mozilla Firefox, upon security warning click on `[Extended]`, `[Add Exception]` and confirm the certificate. #### Certificate file (ssl.pfx) Place your certificate as the file `/EFR/cer/ssl.pfx`. Depending on how the client verifies the server, the file should also contain the intermediate certificates of the chain. Password-protected certificates are supported. You can supply the password when [uploading the certificate via API](#uploading-certificates-via-api), or set it in the environment variable `EFSTA_EFR_SSL_PASSWORD`. A password supplied with the upload is stored encrypted in the file `/EFR/cer/ssl.json` next to the certificate, so it does not have to be configured anywhere else. The EFR reads it on every start. Uploading a certificate without a password removes this file again. If `EFSTA_EFR_SSL_PASSWORD` is set, it takes precedence over the stored password. :::note Earlier EFR versions required `ssl.pfx` to have an empty password. This is no longer the case – password-protected certificates can now be used. ::: #### Certificate via environment variable Set `EFSTA_EFR_SSL_CERT` to the full path of your certificate file. If the certificate is password-protected, set the password in `EFSTA_EFR_SSL_PASSWORD`: ``` EFSTA_EFR_SSL_CERT=C:\certs\myservercertificate.pfx EFSTA_EFR_SSL_PASSWORD=secret ``` ### Client Verification Enablling HTTPS forces encrypted communication, but does not secure EFR against third party access. This can be achieved by TLS client certificate authentication. Here, the browser (e.g. https://.../control) and programmatic (e.g. https://.../register) requests need to be authenticated by a client certificate. Client certificate authentication is enabled automatically as soon as the folder `/EFR/cer/client` exists. Requests without a trusted client certificate are then rejected. #### Whitelist Method Provide the respective public certificates in the folder `/EFR/cer/client` (as .pem, .crt, .cer or .der, PEM or DER format). #### CA Certificate More elegant client certificates can be derived from a common 'CA' certificate, which is declared as `/EFR/cer/client/ca\*.pem`. Client certificates are then verified to be issued by that CA certificate. The CA certificate can be placed in the folder manually or uploaded via `POST /cer/ca` (see [Uploading Certificates via API](#uploading-certificates-via-api)).
**Example** Example of generating CA and client certificates using openssl (openssl.org"): ``` openssl req -x509 -newkey rsa:4096 -days 3650 –nodes -keyout ca.key -out ca.pem -subj "/O=efsta/OU=EFR/CN=EFR SSL client CA" openssl genrsa -out client.key 1024 openssl req -new -key client.key -out client.csr -subj "/O=efsta/OU=EFR/CN=EFR SSL client" openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -set_serial 01 -out client.pem openssl verify -CAfile ca.pem client.pem openssl pkcs12 -export -in client.pem -inkey client.key -password pass: -out client.pfx ``` Setting it into action: ``` COPY myservercertificate.pfx C:\\ProgramData\\EFR\\cer\\ssl.pfx MD C:\\ProgramData\\EFR\\cer\\client COPY ca.pem C:\\ProgramData\\EFR\\cer\\client\\ca.pem ```
For requests (browser and program), client.pfx is used as client certificate. #### Network Configuration Of course, access restriction can be configured using the server's firewall. ### Uploading certificates via API Instead of copying the certificate files manually, both the HTTPS server certificate and the client CA certificate can be uploaded to a running EFR. This works the same way signing certificates are provided and is convenient for a remote or automated setup.
**POST /cer/ssl – Upload HTTPS Server Certificate** Uploads your server certificate (`.pfx`/`.p12`) and saves it as `/EFR/cer/ssl.pfx`. The EFR decodes the certificate before saving it, so an invalid file or a wrong password is rejected and the certificate already in use stays untouched. The new certificate becomes active after the next EFR restart. | Part | Description | |------------------|----------------------------------------------------------------------------------------------------------------------------| | Query `password` | Optional, the password of a password-protected certificate (`passphrase` is accepted as well) | | Request Body | The certificate file – as raw file, as base64 in the JSON field `sslCert`, or as the `ssl` field of a multipart form | | Response Status | 200 OK, 400 if the certificate or the password is invalid | The password can also be sent in the request body instead of the query string, as the field `password` of the JSON body or of the multipart form. A password in the body takes precedence over the query parameter. It is stored encrypted in `/EFR/cer/ssl.json` and applied automatically on the next start – uploading a certificate without a password deletes that file again. ``` curl -X POST "http://localhost:5618/cer/ssl?password=secret" \ -H "Content-Type: application/x-pkcs12" \ --data-binary "@myservercertificate.pfx" ``` A rejected upload answers with 400 and a short reason, for example `cannot decode SSL certificate, wrong password?` or `invalid SSL certificate file (expected a PKCS#12 .pfx)`.
**POST /cer/ca – Upload Client CA Certificate** Uploads a client CA certificate and saves it as `/EFR/cer/client/ca.pem`. EFR then uses it to verify client certificates (see [Client Verification](#client-verification)). | Part | Description | |-----------------|-----------------------------------------------------------------------------------------------------------------------------------| | Request Body | The CA certificate – sent as raw file (PEM or DER), or as base64/PEM in a JSON field `caCert`, or as the `caCert` field of a multipart form | | Response Status | 200 OK, 400 if no certificate was provided | ``` curl -X POST "http://localhost:5618/cer/ca" \ -H "Content-Type: application/x-x509-ca-cert" \ --data-binary "@ca.pem" ```
## Browser Authentication ### Basic Authentication Sensible parts of EFR configuration like http://localhost:5618/control can be protected by setting an EFR system password in profile form: ![ESR-Passwort](./img/password.PNG) Upon browser access, username and password have to be entered, then only the password is verified. To have a password upon installation, you can provide an initial configuration file `/EFR/gbl/profile.cfg`. :::warning Please be aware, when accessing EFR over network using HTTP protocol, the entered password is transferred unencrypted – instead switch to HTTPS or use Digest Access Authentication. ::: ### Digest Access Authentication For appropriate username/password configuration according to RFC 2617, a userlist file `/EFR/gbl/.htdigest` can be provided. This is a text file according to Apache WebServer specification, containing `${username}:${realm}:${hash}` per line.
**Example** ``` user1:EFR:2f72912bba017d9352a753df2fdf946d user1:EFR.001_1:a498cdc760ca554cf44b85c846a1bef5 user2:EFR.001_2:73946a4756fdaff0c0d24e66c28357d3 ``` The second field 'realm' is "EFR" by default, but for multi client operation a separate username/password combination can be set for each realm `"EFR.${RN}"`. In the example above, user1 could access RN 001_1 (line 2) and e.g. 001_3, as for this RN no specific user is assigned. 001_2 can be accessed by user2 only. The third field 'hash' is defined as `hash = md5(username+":"+realm+":"+password)` For convenience, the Apache password manager htdigest may be used to create a .htdigest file on Linux. ``` $ htdigest .htdigest EFR user1 Adding user user1 in realm EFR New password: ```
--- source: https://docs.dev.efsta.eu/efr/api/ai-agent-integration --- # AI & Agent Integration efsta provides an [MCP](https://modelcontextprotocol.io) server that lets AI coding assistants answer EFR integration questions from efsta's own specification and documentation instead of guessing. Your assistant can look up which fields a business case needs in a given country, get a complete request example, and check a `/register` payload before you send it to an EFR. | | | |---|---| | Server URL | `https://mcp.docs.efsta.eu/mcp` | | Transport | Streamable HTTP | | Authentication | None. The server only serves public documentation. | | Rate limit | 120 requests per minute per IP address | ## What the assistant can do | Tool | Use it for | |---|---| | `get_register_case_requirements` | Which fields a business case (sale, refund, void, invoice, Z-report, …) needs, optionally for one country: fields required everywhere, fields mandatory only in that country, and fields that do not apply there | | `get_case_example` | A complete, valid `/register` request for a business case, in JSON or XML | | `validate_register_payload` | Checks a JSON request body against the specification. Errors name the business case whose rule failed; country-specific rules come back as warnings | | `search_efsta_docs`, `fetch_doc` | Finds and reads the relevant documentation pages | | `list_endpoints`, `get_endpoint_schema` | The published EFR endpoints and their request and response schemas | The EFR has one API for all countries: every transaction goes through `POST /register`, and the business case follows from the fields you send (see [Business Cases](/efr/api/business-cases)). The answers come from the same model that generates the [OpenAPI reference](/efr-api/), so they always match the published specification. ## Connect your assistant ### Claude Code ```bash claude mcp add --transport http efsta-docs https://mcp.docs.efsta.eu/mcp ``` To share the configuration with your team, add it to `.mcp.json` in your repository instead: ```json { "mcpServers": { "efsta-docs": { "type": "http", "url": "https://mcp.docs.efsta.eu/mcp" } } } ``` ### Cursor Add the server to `.cursor/mcp.json` in your project (or `~/.cursor/mcp.json` for all projects): ```json { "mcpServers": { "efsta-docs": { "url": "https://mcp.docs.efsta.eu/mcp" } } } ``` ### GitHub Copilot (VS Code) Add the server to `.vscode/mcp.json` in your project, then start it from the file or the MCP view and use Copilot Chat in agent mode: ```json { "servers": { "efsta-docs": { "type": "http", "url": "https://mcp.docs.efsta.eu/mcp" } } } ``` ## Example questions - "Which fields does a refund need in Portugal?" - "Show me a complete XML request for a void." - "Validate this `/register` payload for a German EFR: …" - "How do I re-send a transaction after the POS crashed?" - "Which fields are mandatory for invoices?" ## Without MCP: llms.txt For assistants that cannot connect to an MCP server, the documentation is also available in plain Markdown, following the [llms.txt](https://llmstxt.org) convention: | File | Content | |---|---| | [`/llms.txt`](pathname:///llms.txt) | Index of all pages with a short description, linking to Markdown copies | | [`/llms-full.txt`](pathname:///llms-full.txt) | All EFR API and EFR guide pages in one file, with the request examples | Point your assistant to one of these URLs or paste the file into the conversation. Both are generated from the same sources as this site whenever it is deployed. ## Data and privacy The server is read-only and has no access to customer, tenant or transaction data. It answers from the public documentation only. Payloads you validate are checked in memory and are not stored or logged. We record which tool was called, the argument names and types, and the response time, never the argument values, to learn which questions integrators ask. Still, use test data rather than real customer data in payloads you validate. --- source: https://docs.dev.efsta.eu/efr/api/api --- # EFR API :::tip[Important Information to the generic Interface] 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. :::

This collection of EFR API requests are all the API requests needed to send transaction data, add/edit company data, or administer the EFR. [REGISTER](#register) and [CFG](#cfg---base-datacompany-header-data) are mandatory to use the EFR. In fiscal printer countries, [PERI](#peri) is required to directly print and request printer related data required for these countries. All other API requests can be used as additional functionality for your system. The recommanded workflow can be found at [Communication Workflow](rule-set#communication-workflow). If you have any comments or questions to this document please contact us at: [ticket@efsta.eu](mailto:ticket@efsta.eu) :::tip[Machine-readable reference] The [EFR Unified API Reference](/efr-api/) provides an OpenAPI 3.1 specification with endpoint descriptions, field definitions, country requirements, and JSON and XML examples. You can import it into tools such as Postman or Insomnia. The download filename includes the specification's version date. For a fixed URL to the current version, use efr-openapi.yaml. For business-case requirements, see [Business Cases](/efr/api/business-cases) and [Country Specific Business Cases](/efr/api/country-specific). ::: :::warning[Important] If the EFR is used for multiple companies (see [EFR Architecture](/efr/architecture)) the ESR.TaxId must be sent in all /register requests. If the EFR is used for muliple POS systems the query parameter "rn" must be sent for all request (except /register). The rn consists of TaxId$TL_TT
e.g.: `GET localhost:5618/cfg?rn=DE123456789$1_1` ::: ## Register This route is used to register transactions (e.g. sales, invoices, payment transactions,...) to the EFR journal. The Format for all business cases can be found at [Business Cases](business-cases). ``` POST /register ``` #### Body Content-Type: `text/xml` or `application/json` :::note The strucure of the ESR format can be found at [ESR format](rule-set#esr--efsta-simple-receipt-format) and the values for the payment group are descript at [Payment groups](rule-set#payment-groups---paypayg). :::
**First Sample Transaction** ```xml ``` ```json { "Tra":{ "ESR":{ "D":"2024-06-01T08:30:15", "TL":"001", "TT":"1", "TN":"1", "T":"8.38", "PosA":[ {"_":"Pos","PN":"1", "IN":"1001", "Dsc":"Example Item", "TaxG":"A", "Amt":"3.98"}, {"_":"Pos","PN":"2", "IN":"1020", "Dsc":"Example Item", "TaxG":"B", "Amt":"1.50"}, {"_":"Pos","PN":"3", "IN":"1030", "Dsc":"Example Item", "TaxG":"A", "Amt":"2.90"} ], "PayA":[ {"_":"Pay", "Dsc":"Example Payment", "PayG":"cash", "Amt":"10.00"}, {"_":"Pay", "Dsc":"Example Change", "PayG":"change", "Amt":"-1.62"} ], "TaxA":[ {"_":"Tax", "TaxG":"A", "Prc":"19", "Net":"5.78", "TAmt":"1.10", "Amt":"6.88"}, {"_":"Tax", "TaxG":"B", "Prc":"7", "Net":"1.40", "TAmt":"0.10", "Amt":"1.50"} ] } } } ```
**Response Example** The structure of the EFR response can be found at [Response TraC](rule-set#response-trac-tra-completion) ```xml V0;001/1;Kassenbeleg-V1;Beleg^6.88_1.50_0.00_0.00_0.00^8.38:Bar;3;7;2024-08-01T08:50:30.000Z;... ``` ```json { "TraC": { "SQ": "1537030", "Result": { "RC": "OK" }, "ESR": { "D": "2024-08-01T10:50:30", "FN": "001/1/1" }, "Fis": { "TID": "3", "Code": "V0;001/1;Kassenbeleg-V1;Beleg^6.88_1.50_0.00_0.00_0.00^8.38:Bar;3;7;2024-08-01T08:50:30.000Z;..." "Tag": [ { "Label": "TrNr:", "Value": "3", "Name": "TID" }, { "Label": "Beg.:", "Value": "2024-08-01 10:50:30", "Name": "StartD" }, { "Label": "Ende:", "Value": "2024-08-01 10:50:30", "Name": "FinishD" }, { "Label": "TSE :", "Value": "0123456789abcdef0...", "Name": "Serial" }, { "Label": "SigZ:", "Value": "7", "Name": "SignCnt" }, { "Label": "Sign:", "Value": "aT775OTya1SXEGceVO2raDlRHv...", "Name": "Sign" } ] } } } ```
### E-Invoicing To send an invoice as e-Invoice as well, you have to trigger the electronic delivery with the (Document Delivery) DD field (e.g., `DD="IT"`). \ The `DD` value determines the System through which the E-Invoice is transmitted. In the example above, setting DD="IT" triggers the E-Invoicing process for Italy. If you want to use the test system just append -TEST, f.e: `IT-TEST`. If required, also provide the (Document Delivery To) `DDto` field. That defines the Country-specific recipient identifier for the E-Invoice. [More infos here](/e_invoicing/api/general)
**Example Request for Italy Testsystem** ```json {"Tra": {"ESR": // highlight-next-line {"DT": "INVOICE", "DD": "IT-TEST", "DDto": "WSRLPXY", "Ctm": {"TaxId": "IT02348690211", "Nam": "The Buyercompany S.p.A", "Adr": "Via Roma 1", // highlight-next-line "Zip": "12345", "City": "Milano (MI)" }, "PosA": { "Pos": { "PN": "1", "Dsc": "test", "TaxG": "B", "Amt": "1.00"}}, "PayA": { "Pay": { "Dsc": "Contanti", "PayG": "cash", "Amt": "1.00"}} } } } ``` ```xml // highlight-next-line // highlight-next-line ```
:::warning[Important] If the EFR return the value of Fis.Code, it must be printed on the receipt as QR-code / barcode. If the EFR return Fis.Tag elements, all elements must be printed on the receipt (Label + Value). ::: --- ## Cfg - Base data/company header data Before sending the first transaction the company header sales data should be configured. This can be done manually, via request or certralized via efsta portal. :::tip[Good to know] For centralized administration configuration data can be set using the [efsta portal](https://portal.efsta.net), data is replicated to the EFR instances. If the central configuration is used, neither manual configuration nor programmatic configuration is necessary. ::: ### Manual configuration Navigate to http://localhost:5618 in your browser and open “Basisdata” (base data). Enter the field values required, data is replicated to efsta cloud. ### Programmatic configuration This request should be issued once on startup of the frontend application to update receipt header fields like company name or location address. If values are unchanged, the request is without effect. It is mandatory to set this data before registering the first transaction. The strucure of the ESR format can be found at [Cfg - Configuration](rule-set#cfg---configuration) Get cfg data: ``` GET /cfg ``` Set cfg data: ``` POST /cfg ``` #### Query | Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |
**Body** ```json { "Cfg": { "Cmp": { "Nam": "My Company", "label": "MyComp", "Adr": "Street", "AdrNr": "3", "Zip": "1000", "City": "City", "Ctry": "XY", "TaxId": "XY99999999999", "TIN": "123456789", "Org": "", "VATonPayment": 0, "FR_NAF": "47.11D", "FR_SRN": "732 829 32", "FR_RCS": "PARIS A", "FR_TYPE": "XXX", "FR_CAPITAL": "XXX", "FR_METIER": "XXX" }, "Loc": { "TL": "001", "Nam": "My Location", "label": "MyLoc", "Adr": "123 Long Road", "Zip": "12345", "City": "Metropolis", "State": "XXX", "Ctry": "XY", "TaxId": "XY99999999999", "FR_SIR": "732 829 320 0007" }, "Trm": { "TT": "1", "SW": "super-POS", "SWVersion": "3.4.5", "HW": "POS Brand", "HWModel": "POS model name", "Serial": "POS serial number" }, "Dev": [ { "Id": "1", "HW": "Dev Brand", "HWModel": "Dev Model", "SW": "My Dev Software", "SWVersion": "1.5.7", "Serial": "POS serial number" }, { "Id": "2", "HW": "Dev Brand", "HWModel": "Dev Model", "SW": "My Dev Software", "SWVersion": "1.5.7", "Serial": "POS serial number 2" } ], "DE_Agentur": [ { "Id": "1", "Nam": "Test Company", "Adr": "177 Long Road", "Zip": "12345", "City": "Metropolis", "Ctry": "XY", "TaxId": "XY99999999999" }, { "Id": "2", "Nam": "Test Company 2", "Adr": "256 Long Road", "Zip": "12345", "City": "Metropolis", "Ctry": "XY", "TaxId": "XY99999999998" } ], "Doc": { "ContactName": "John Doe", "ContactTelephone": "123456789", "ContactElectronicMail": "j.doe@efsta.eu", "PaymentTerms": "30 days net", "PaymentPeriod": 30, "AccountName": "my company", "AccountIBAN": "AT00000000000000000000", "AccountBIC": "ASPAKAT2LXXX" } } } ``` ```xml ```
:::tip[Good to know] Cfg field values also are used for bill.efsta.net Digital Receipt display, the "label" fields should contain abbreviations (10 char max.) to be used as denomination in lists. ::: --- ## EFR State Get state information about running EFR installation. ``` GET /state ``` #### Request Header | Name | Value | |--------|----------------------------------| | Accept | `application/json` or `text/xml` |
**Response** ```json { "pid": 32756, "arch": "x64", "uptime": 12563, "name": "EFR", "version": "2.5.0", "manifest": "...", "Country": "XY", "Online": true, "Recorder": "online", "RN": "def", "RecSent": 0, "RecQueued": 0, "RetryQueued": 0, "TimeOffset": 0, "D": "2024-06-28T09:54:26+02:00", "DiskUsage": 0.038301, "DiskQuota": 1000, "Company": "XY123456789" } ``` ```xml 32756 x64 12563 EFR 2.5.0 XY true online XY123456789 0000000XXXX def 0 0 0 0 2024-06-28T09:54:26+02:00 0.038301 1000 XY123456789 ``` | Name | Value | Example | |------|------------|---------| | pid | Process Id | `32756` |
--- ## Export From EFR V2.5 ``` GET /export ```
**Query & Type**

Query

| Name | Value | Example | |--------|-------------------------------------------------------------------------------------------|--------------| | RN | Optional Register Number, default: 'def' | `1_1` | | type | Export type | `dsfinvk` | | from | From date `YYYY-MM-DD` | `2024-01-15` | | till | Till date `YYYY-MM-DD` | `2024-12-31` | | target | Optional. Target folder-path to save export file to. | `C:/exports` | | open | Optional. Include data of the currently not closed day. Only available for type `dsfinvk` | `on` |

Type

| Type | Description | Response | Countries | |----------------|-------------------------------------------|-----------------------|----------------| | `jou` | EFR journal export | File `jou*.zip` | * | | `dep` | Datenerfassungsprotokoll | File `dep-export.zip` | AT | | `tse` | TSE export | File `export.tar` | DE | | `gobd` | GoBD export | File `gobd.zip` | DE | | `dsfinvk` | DSFinV-K export | File `export.zip` | DE | | `saft` | SAF-T export | File `export.zip` | DK, NO, PT, SE | | `nf525-export` | NF525 export to verify signature chain | File `export.xml` | FR | | `nf525-total` | NF525 export to verify grand totals | File `total.xml` | FR | | `nf525-jet` | NF525 Journal des Évènements Techniques | File `audit.csv` | FR | | `nf525-jou` | EFR journal export including proof-script | File `jou.zip` | FR |
--- ## Profile
**Query & Body**

Query

| Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |

Body

```json { "Badge": "XXXXXXXXXX" , "TaxId": "XX123456789", "RN_TT": false } ``` ```xml XXXXXXXXXX XX123456789 false ```
**ENV-based EFR Profile Configuration (Advanced)** The EFR Profile settings can be configured through environment (ENV) variables. These settings are applied during system startup and, once active, block changes to the same configuration via the UI or API in order to avoid conflicts. #### Structure - Environment variables must follow this format where `__DOT__` is used as a separator between the different properties of the setting object: `EFSTA_EFR_PROFILE_CFG__DOT__{RN}__DOT__{setting_name}={value}` - If the structure is not respected, the setting will not be applied - The RN must be defined so the system knows which register to apply the setting to - On single-RN systems, def can be used instead of a specific RN - Since some RNs may contain the `$` symbol, which is not supported in ENV variable names, use `__DOLLAR__` instead. The EFR automatically converts it back to `$` - Boolean values must be lowercase (true, false)
**Example (using PL specific settings)** ```bash EFSTA_EFR_PROFILE_CFG__DOT__def__DOT__RN_TT=true EFSTA_EFR_PROFILE_CFG__DOT__001_1__DOT__Sign_require="FP_T88FVA" EFSTA_EFR_PROFILE_CFG__DOT__001_1__DOT__Sign_Cfg="COM7:115200" EFSTA_EFR_PROFILE_CFG__DOT__001_2__DOT__Sign_require="FP_T88FVA" EFSTA_EFR_PROFILE_CFG__DOT__001_2__DOT__Sign_Cfg="COM5:115200" EFSTA_EFR_PROFILE_CFG__DOT____DOLLAR__001_456__DOT__Sign_Cfg="COM5:115200" ```

#### Blocking of Settings If a configuration is applied through ENV variables, it cannot be modified via the UI or API. The API will return the following message if a blocked setting is changed: `Setting of {setting_name} for {RN} is blocked` ##### To re-enable UI/API configuration - Remove the corresponding ENV variable(s) - Restart the EFR
#### Querying ENV Settings The EFR provides a way to query which settings have been applied through ENV variables. Use the following endpoint to view them: > GET `/state` :::note This does not list all Profile settings, only those from ENV. :::
**Example response (EnvSettings section highlighted)** ```json { "uptime": 162815, "name": "EFR", "version": "2.6.1.1", "Country": "ZZ AT BE CZ DE DK ES FR HR HU IT LT NO PL PT SE SI SK", "Online": false, "Recorder": "inactive", "RN": "def $001_456 001_1 001_2", ... "EnvSettings": { "def": { "RN_TT": true }, "001_1": { "Sign_require": "FP_T88FVA", "Foo": "Bar", "Sign_Cfg": "COM7:115200" }, "001_2": { "Sign_require": "FP_T88FVA", "Sign_Cfg": "COM5:115200" }, "$001_456": { "Sign_Cfg": "COM5:115200" } } } ```
#### System Restart Triggers If the following settings are applied via ENV variables, the EFR will automatically restart: - HttpServer_Port - UdpServer_Port - DiskQuota - Proxy
### Badge This request can be used to set the `Badge` field in the EFR profile to connect the instance to the efsta Cloud.
**Locating the badge in the Portal** The Badge can be found in the portal by following these steps: 1. Navigate to “Companies” on the left side menu ![Sidebar Company](@site/efr/img/onboarding/1_companies.png) 2. Open the properties of your company ![Options](@site/efr/img/onboarding/13_options.png) 3. Locate and copy the badge number ![Badge](@site/efr/img/onboarding/14_badge.png)
#### EFR Modes The EFR service can be operated in different modes and depending on this, a different badge must be entered. For more details, see [Architecture EFR Modes](/efr/architecture#efr-modes). ##### Single POS For "Single POS" mode, the **company badge** should be used. You can also specify the Transaction Location (TL) and Transaction Terminal (TT) within the badge. This means the POS identification is already known during activation, and a configuration can be automatically downloaded from the cloud. Additionally, a fiscal unit can be automatically assigned. e.g: `AAAAAAAAAA.001/1` :::tip[Good to know] You can also specify an organization's badge and additionally the company's TaxID with TL/TT. This way, you know the badge before the rollout. e.g: `AAAAAAAAAA.DE123456789$001/1` ::: ##### Multi POS For "Multi POS" mode, the **company badge** should be used. The RN_TT option must also be set to true for "Multi POS" to be used on the EFR service and TL/TT must be included with every request. ##### Multi Company For "Multi Company" mode, the **badge of an organisation** must be used. The RN_TT option must also be set to true for "Multi Company" mode to be used on the EFR service and TaxId with TL/TT must be included with every request. :::tip For setting up new registers (RNs) up front, before any configuration or transaction, see the [Register Creation](/efr/api/business-cases#register-creation) business case. ::: ### Tax IDs for testing In the following table are Tax IDs for testing for each country | Flag | Country | Test Tax Id | |:---------:|-----------|----------------| | | Austria | ATU57780814 | | | Belgium | BE0123456749 | | | Czechia | CZ123456789 | | | Germany | DE123456789 | | | Denmark | DK99999993 | | | Spain | ES123456789 | | | France | FRXX999999998 | | | Croatia | HR123456789 | | | Hungary | HU123456789 | | | Italy | IT123456789 | | | Lithuania | LT123456789 | | | Norway | NO999999999 | | | Poland | PL9999999999 | | | Portugal | PT999999990 | | | Sweden | SE999999999901 | | | Slovenia | SI123456789 | | | Slovakia | SK123456789 | --- ## Journal ### Find This request can be used to find and retrieve transaction data of the EFR journal. ``` GET /find ```
**Query & Request Header**

Query Parameter

| Name | Value | Example | |--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------| | rn | Optional Register Number, default: `def`. Alternatively, TaxId (optional), TL and TT can be specified as parameter | `1_1` | | from | From date (optional) | `2024-11-06` | | till | Till date (optional) | `2024-11-06` | | limit | Optional limitation of volume and runtime in the format `XrowsYms` with:
X = receipt count
Y = max runtime in ms
default: `1000rows5000ms` | `10rows10000ms` | | sort | Sort order, default: `desc` | `asc` | | continuation | Continuation string (optional) | `51856974` | Additional query parameters can be added for transaction search criteria. | Name | Value | Example | |------|------------------------------------------------------------------------------------------------------------------|--------------| | fn | Fiscal number (can be used instead of tl/tt/tn) | `001/1/10` | | tn | Transaction number | `5` | | d | Date | `2024-11-05` | | sq | Sequence number | `10` | | _ | Record Type. Tra...Transaction, TraS...Start Transaction, Rep... Reports, Cfg... Configuration, log... Logs, etc. | `Tra` | | t | Total | `8.38` | | nfs | Non fiscal transactions (see Business Cases) | `Z` | :::tip[Good to know] You can search for all properties that are in the ESR object (see journal files). :::

Request Header

| Name | Value | |--------|----------------------------------| | Accept | `application/json` or `text/xml` |
### Get Last Transaction Fetches the last data object registered (POST /register). To be used on system restart or for informational purposes. ``` GET /last ```
**Query, Request Header & Response**

Query

| Name | Value | Example | |------|------------------------------------------|----------------------| | RN | Optional Register Number, default: 'def' | `1_1` | | _ | optional rec type filter | `Tra`, `TraS`, `Cfg` |

Request Header

| Name | Value | |--------|----------------------------------| | Accept | `application/json` or `text/xml` |

Response

XML or JSON transaction data, utf-8
--- ### Render Use to show last transaction on a (customer) display, or to fetch a formatted PDF file for saving/printing. Formatting in both cases is using fiscal.pug, which can be customized for the intended purpose. | Request | Response | |----------------------|--------------------------------------------------------------| | `GET /render` | HTML rendering of the receipt | | `GET /render/pdf` | PDF rendering of the receipt | | `GET /render/text` | Plain text rendering of the receipt | | `GET /render/escpos` | ESC/POS commands line by line for use with a receipt printer |
**Query** | Name | Value | Example | |------|-----------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` | | FN | Optional fiscal number, default: last receipt | `4711` |
--- ## Peri Available when a fiscal printer is connected to the EFR. ### Direct Printing Prints text directly on the connected printer without registering any transaction to the EFR journal. ``` POST /peri/print ```
**Query & Body**

Query

| Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |

Body

Content-Type: `text/plain` ``` sdfjk dsjfkls dsjfkl ```
### Printer State Get information about the printer and/or fiscal module. ``` GET /peri/print/state ```
**Query, Request Header & Response**

Query

| Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |

Request Header

| Name | Value | |--------|----------------------------------| | Accept | `application/json` or `text/xml` |

Response

```json { "ModuleName": "[printer module name]", "ID": "[printer serial]", "ZI": 1, "SimpleState": { "DayOpen": true, "ZRequired": false, "NextZRequired": "2024-10-05T00:00:00", "DrawerOpen": false, "PaperNearEnd": false, "PaperEnd": false, "CoverOpen": false, "MemAlmostFull": false, "MemFull": false, "CertExpires": "2028-10-05T00:00:00" } } ``` ```xml [printer module name] [printer serial] 1 true false 2024-10-05T00:00:00 false false false false false false 2028-10-05T00:00:00 ``` | Name | Value | Example | |---------------------------|---------------------------------------------------------|-------------------------| | ModuleName | Printer module name | `"Epson_FP"` | | ID | Printer serial number | `"99MEY022311"` | | ZI | Current Z-Index | `1` | | SimpleState.DayOpen | Nullable boolean, `null` if printer does not provide it | | | SimpleState.ZRequired | Nullable boolean, `null` if printer does not provide it | | | SimpleState.NextZRequired | Nullable string, `null` if printer does not provide it | `2024-10-05T00:00:00` | | SimpleState.DrawerOpen | Nullable boolean, `null` if printer does not provide it | | | SimpleState.PaperNearEnd | Nullable boolean, `null` if printer does not provide it | | | SimpleState.PaperEnd | Nullable boolean, `null` if printer does not provide it | | | SimpleState.CoverOpen | Nullable boolean, `null` if printer does not provide it | | | SimpleState.MemAlmostFull | Nullable boolean, `null` if printer does not provide it | | | SimpleState.MemFull | Nullable boolean, `null` if printer does not provide it | | | SimpleState.CertExpires | Nullable string, `null` if printer does not provide it | `"2028-10-05T00:00:00"` |
### Line Display Displays text directly on the connected line display of the printer. During position and payment entry the cash register application should send referring description and price/amount information immediately to the customer display. ``` POST /peri/display ```
**Query & Body**

Query

| Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |

Body

Content-Type: `text/plain` ``` Arrotondato 30,00 € Totale 30,01 € ```
### Open Drawer Opens the cash drawer. By default the cash drawer should be managed by the cash register application. ``` POST /peri/drawer ```
**Query** | Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |
### Open Drawer and Wait Opens the cash drawer and sends the response when the cash drawer is closed. As the drawer might be left open for a longer time, a HTTP status 102 Processing may be sent after 30 seconds. ``` POST /peri/drawer/wait ```
**Query** | Name | Value | Example | |------|------------------------------------------|---------| | RN | Optional Register Number, default: 'def' | `1_1` |
--- source: https://docs.dev.efsta.eu/efr/api/business-cases --- # Business Cases :::tip[Important Information to the generic Interface] 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. :::

This collection of business cases, comprises of all transactional business cases that need to be implemented and tested with the EFR to comply with fiscalization requirements throughout Europe. Some business cases may not apply to your business. The current applicable countries to the business case is visible via the country flag beneath the business case title. If no flags are beneath the business case title, then this applies to all countries. By implementing all of these business cases and their variants, your system will be fiscalization ready in all of the current and future country solutions from efsta. efsta recommends that all business cases, if applicable, be implemented and sent to the EFR for every country, so that your system is future-proof when some countries expand their fiscalization requirements. This will prevent your development team from having to expand or re-develop to the EFR in the future. 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](mailto:ticket@efsta.eu) ## Register Creation In **Multi POS** and **Multi Company** mode a register (subregister) can be created up front, before any configuration or transaction is sent. For more information on how to set up Multi POS and Multi Company systems (via the `RN_TT` flag), see [EFR Modes](/efr/api#multi-pos). The register is created by sending a non-fiscal transaction marked with `NF="CREATERN"`, containing only the `TL` and `TT` values (and `TaxId` in Multi Company mode). As a non-fiscal transaction it requires no positions, operator or signature. :::note In Multi POS mode the register is identified by `TL/TT`; in Multi Company mode by `TaxId$TL/TT`. In single-register mode the request is recorded under the default `def` register. :::
**Example** ```xml // highlight-next-line ``` ```json { "Tra": { "ESR": { // highlight-next-line "NF": "CREATERN", "TL": "001", "TT": "1" } } } ```
--- ## Sale of Items The EFR service calculates the tax amounts automatically, if they are not sent. However, we recommend that the POS sends the tax groups with every fiscal receipt. For a detailed explanation of tax assignment, see [Tax Group Assignment](/efr/api/rule-set#tax-group-assignment---taxg). For simplicity, the taxes are only given in one example and omitted from all other business cases. :::tip We recommand to use the predefined tax groups from efsta. Otherwise, various 0% tax rates cannot be represented and the default 0% tax group is used instead. ::: :::note A sale can also be labelled as "simplified invoice". These are typically used for smaller transactions or when the buyer's identity is not required to be fully detailed, since the simplified invoice contains less information than a full invoice. :::
**Thresholds for simplified invoices per country** | Country | Threshold
(EUR) | Threshold
(local currency) | | --------- | -------------------: | -------------------------: | | Austria | 400 | | | Belgium | 100 | | | Croatia | 92 | HRK 700 | | Czechia | 370 | CZK 10.000 | | Denmark | 400 | DKK 3.000 | | France | 100 | | | Germany | 250 | | | Hungary | 100 | | | Italy | 400 | | | Lithuania | 100 | | | Poland | 100 | PLN 450 | | Portugal | 100 | | | Slovakia | 100 | | | Slovenia | 100 | | | Spain | 400 | | | Sweden | 380 | SEK 4.000 |
### With TaxA
**Example** ```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", "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": "19", "Net": "5.78", "TAmt": "1.10", "Amt": "6.88" }, { "_": "Tax", "TaxG": "B", "Prc": "7", "Net": "1.40", "TAmt": "0.10", "Amt": "1.50" } ] } } } ``` ```xml ```
### Without TaxA If the tax array is omitted, the EFR service calculates the tax amounts automatically.
**Example** ```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", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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" }, { "_": "Lin", "Dsc": "Subtotal", "LAmt": "5.48" }, { "_": "Pos", "PN": "3", "IN": "1030", "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" } ] } } } ``` ```xml ```
#### Country Specific Properties | Properties | Description |        Countries       | Mandatory | |-------------------|--------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------:|--------------------------| | Pos.SKU | Stock Keeping Unit/article number |
[DE] Flag Germany
| If available in POS data | | Pos.Cat, Pos.CatN | Category, Category name |
[DE] Flag Germany
[BE] Flag Belgium
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
| If available in POS data | | Pos.IN | Article specific id. Used to track changes to an article's registration. |
[SE] Flag Sweden
[BE] Flag Belgium
| Yes | | Pos.Resume | When a receipt was parked before all positions which are resumed need to be marked with Resume=1 |
[SE] Flag Sweden
| Yes | | Pos.TS | Article registration timestamp |
[SE] Flag Sweden
| Yes | | ESR.OprN | Operator Name |
[DE] Flag Germany
[DK] Flag Denmark
[NO] Flag Norway
[PL] Flag Poland
[PT] Flag Portugal
[SE] Flag Sweden
| If available in POS data | | ESR.TP | Transaction point |
[DE] Flag Germany
| If the transactions can be assigned to different areas
(e.g. table number) | | ESR.OprTIN | Operator Tax Number (8-10 digits, read more below) |
[HR] Flag Croatia
[SI] Flag Slovenia
| Yes | | ESR.OprSSN | Operator Social Security Number (11 digits) |
[BE] Flag Belgium
| Yes | | ESR.ResumeFN | If a receipt was previously parked ([Parking of Receipts](/efr/api/country-specific#parking-of-receipts)) this property must be included and set to the fiscal number (FN) of the previously parked receipt |
[SE] Flag Sweden
| Yes
*If a parked receipt is continued | | ESR.TID | TSE Transaction ID |
[DE] Flag Germany
| See [Start Transaction](/efr/api/country-specific#start-transaction) | | Pay.InputMethod | Input Method of the payment amount: `manual` or `auto` |
[BE] Flag Belgium
| Yes | | Pay.UID | Unique payment identifier; Electronic payment or document reference |
[DK] Flag Denmark
| Mandatory for specific [Payment Groups](/efr/api/rule-set#payment-groups---paypayg) | In Croatia and Slovenia there is a strict length check of the TIN value and if discrepancies are detected, the request will be rejected. These are the necessary value lengths (prefix not included): * Croatia: 10 characters * Slovenia: 8 characters When the OprSSN is not valid (correct length and checksum), the transaction is rejected. --- ## Sale of Services A sale of a service is sent as a position and is marked with an attribute `PTY="Svc`
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "2", "T": "34.90", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PTY": "Svc", "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" } ] } } } ``` ```xml ```
--- ## Discount * Discounts are sent as a modifier element `Mod` with a negative amount `Mod.Amt`. * Discounts must indicate which position numbers `Mod.PN` they refer to. Position number `*` means that the discount refers to all previous positions.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "3", "T": "6.88", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Mod", "PN": "1", "Dsc": "Example line discount", "Amt": "-0.50" }, { "_": "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" }, { "_": "Mod", "PN": "*", "Dsc": "Example receipt discount", "Amt": "-1.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "10.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-3.12" } ] } } } ``` ```xml ```
--- ## Surcharge * Surcharge are sent as a Modifier element `Mod` with a positive amount `Mod.Amt` * Surcharge must indicate which position numbers `Mod.PN` they refer to. Position number `*` means that the surcharge refers to all previous positions.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "4", "T": "4.48", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Mod", "PN": "1", "Dsc": "Example line surcharge", "Amt": "0.50" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "10.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-5.52" } ] } } } ``` ```xml ```
--- ## Refund / Return of Goods * Returns are sent with negative quantities `Pos.Qty` and negative amounts `Pos.Amt`. * Discounts/Surcharges must also be taken into account when returning items * Returns must reference the original transaction by `ESR.RFN` or `ESR.RTL` & `ESR.RTT` & `ESR.RTN`, see [country-specific properties](#country-specific-properties-for-refundsreturns)
**Example** ```json { "Tra": { "ESR": { "RD": "2024-06-01T08:10:15", "RTL": "003", "RTT": "2", "RTN": "2080", "RFN": "NY/Y07900042/0110/00002", "Rsn": "V1", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "5", "T": "-3.48", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "-3.98", "Qty": "-2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Mod", "PN": "1", "Dsc": "Example line discount", "Amt": "0.50" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-3.48" } ] } } } ``` ```xml ```
In Hungary the customer data is required for returns/voids. See Ctm object in example [invoice](#invoices) #### Country Specific Properties for Refunds/Returns | Properties | Description | Countries | |-------------|--------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | ESR.RFN | Reference fiscal number |
[DK] Flag Denmark
[BE] Flag Belgium
[ES] Flag Spain
[FR] Flag France
[HU] Flag Hungary
[IT] Flag Italy
[NO] Flag Norway
[PT] Flag Portugal
[SE] Flag Sweden
[SK] Flag Slovakia

**[SE]**: Only mandatory if the return is linked to the original receipt. | | ESR.RD | Reference date |
[ES] Flag Spain
[HU] Flag Hungary
[PT] Flag Portugal
| | ESR.RTL | Reference transaction location |
[DE] Flag Germany
[DK] Flag Denmark
| | ESR.RTT | Reference transaction terminal |
[DE] Flag Germany
[DK] Flag Denmark
| | ESR.RTN | Reference transaction number |
[DE] Flag Germany
[DK] Flag Denmark
| ### Refunds in VERI\*FACTU and IGIC #### General rules - Every refund must reference an existing transaction that has already been sent to the EFR - The original transaction is identified by the `RFN` - Only one transaction is handled per refund - The total amount must always be less than 0, except for full refunds of legacy transactions, where the total amount may also be 0 - `RD` (reference date) is only needed for legacy transactions, otherwise this information is directly taken from the journal - The referenced transaction must still be valid (i.e. not voided and not already fully refunded)
:::warning - To issue a factura rectificativa, the refund operation must be carried out on the same POS terminal where the original transaction was processed. - Multiple invoices cannot be handled in one rectificativa :::
**Example: Original transaction** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "T": "8.38", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item 1", "TaxG": "F", "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 2", "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 3", "TaxG": "A", "Amt": "2.90", "Cat": "12", "CatN": "Example Category 12" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "8.38" } ] } } } ``` ```xml ```
#### Further information
**Types of refunds** A refund transaction can be either full or partial.

Full refund


- All original items are refunded - Amounts and quantities are sent as negative values - Discounts or surcharges applied in the original transaction must be reflected accordingly
**Example: Full refund** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "RTL": "003", "RTT": "2", "RTN": "2080", "RFN": "2026.1-001-1-23", "Rsn": "Full refund of items", "TL": "001", "TT": "11345", "Opr": "101", "OprN": "Mario Rossi", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item 1", "TaxG": "F", "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 2", "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 3", "TaxG": "A", "Amt": "-2.90", "Cat": "12", "CatN": "Example Category 12" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-8.38" } ] } } } ``` ```xml ```

Partial refund


- Only a subset of the original items is refunded - Only the refunded positions must be included - Payment amount must match the refunded total
**Example: Partial refund** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "RTL": "003", "RTT": "2", "RTN": "2080", "RFN": "2026.1-001-1-23", "Rsn": "Partial refund of items", "TL": "001", "TT": "11345", "Opr": "101", "OprN": "Mario Rossi", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item 1", "TaxG": "F", "Amt": "-3.98", "Qty": "-2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-3.98" } ] } } } ``` ```xml ```
**Specific reasons for refunding invoices** Refunds for invoices can have specific reasons which can be passed trough the `ESR.Rsn` value to the EFR.

Customer declared insolvency

Specifying the refund reason to reflect that the customer declared insolvency can be done by setting the `ESR.Rsn` to `INSOLVENCY`.

Customer's debt is uncollectible

Specifying the refund reason to reflect that the customers debt cannot be collected can be done by setting the `ESR.Rsn` to `UNCOLLECTIBLE`.
**Validation errors**

Mismatching positions


- If the refund contains Pos elements that do not match the original transaction, the EFR will reject the refund - The error message specifies the first non-matching position
**Example: Mismatching positions** ```json { "TraC": { "Result": { "RC": "BAD", "ErrorCode": "#PARSE", "Warning": [ "e-#PARSE #FORMAT referenced Pos not found or already refunded: {\"_\":\"Pos\",\"PN\":\"1\",\"Dsc\":\"Example Item\",\"Amt\":\"-399.00\",\"TaxG\":\"A\",\"QtyU\":\"Pc.\",\"Cat\":\"10\",\"CatN\":\"Example Category 10\"}" ] } } } ```

Refunding a voided transaction


- If the original transaction has been previously voided, any refund attempt will fail
**Example: Refunding a voided transaction** ```json { "TraC": { "Result": { "RC": "BAD", "ErrorCode": "#INVALID", "Warning": [ "e-#INVALID Transaction has been previously voided" ] } } } ```
**Refunds on legacy transactions** Refunds for transactions recorded before VERI\*FACTU was introduced are handled differently.

Reference format


- Use the following format for RFN: `PRE-${YEAR}.${SERIES}-${TL}-${TT}-${COUNTER}` - Example: `PRE-2026.1-001-1-1`

Special behavior


- When using the PRE- prefix and providing a reference date (RD): All matching and existence validations are disabled - This is required because the original transaction is not present in the EFR journal - If negative values are sent, the transaction is treated as a **partial refund** - **Legacy refunds only**: To book a **full refund** for a legacy transaction, amounts and quantities of the Pos elements must be set to **0**
**Example: Full refund of a legacy transaction** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "RTL": "003", "RTT": "2", "RTN": "2080", "RFN": "PRE-2026.1-001-1-23", "RD": "2025-01-01T10:30:30", "Rsn": "Full refund of items", "TL": "001", "TT": "11345", "Opr": "101", "OprN": "Mario Rossi", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item 1", "TaxG": "F", "Amt": "0.00", "Qty": "0", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "0.00" } ] } } } ``` ```xml ```
**Example: Partial refund of a legacy transaction** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "RTL": "003", "RTT": "2", "RTN": "2080", "RFN": "PRE-2026.1-001-1-23", "RD": "2025-01-01T10:30:30", "Rsn": "Full refund of items", "TL": "001", "TT": "11345", "Opr": "101", "OprN": "Mario Rossi", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item 1", "TaxG": "F", "Amt": "-3.98", "Qty": "-2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-3.98" } ] } } } ``` ```xml ```
--- ## Void * Voided transaction are marked with an attribute `Void="1"` * The signs of quantity and amount must be sent reversed (negative values). * Voids must reference the original transaction by `ESR.RFN` or `ESR.RTL` & `ESR.RTT` & `ESR.RTN`, see [country-specific properties](#country-specific-properties-for-void)
**Example** ```json { "Tra": { "ESR": { "Void": "1", "RD": "2024-06-01T08:10:15", "RTL": "003", "RTT": "2", "RTN": "125", "RFN": "NY/Y07900042/0110/00002", "Rsn": "V1", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "6", "T": "-3.48", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "-3.98", "Qty": "-2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Mod", "PN": "1", "Dsc": "Example line discount", "Amt": "0.50" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-3.48" } ] } } } ``` ```xml ```
In Hungary the customer data is required for refunds/voids. See Ctm object in example [invoice](#invoices) #### Country Specific Properties for Void | Properties | Description | Countries | |------------|----------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | ESR.RFN | Reference fiscal number (response from fiscal authority) |
[DK] Flag Denmark
[BE] Flag Belgium
[ES] Flag Spain
[FR] Flag France
[HU] Flag Hungary
[IT] Flag Italy
[NO] Flag Norway
[PT] Flag Portugal
[SE] Flag Sweden
[SK] Flag Slovakia

**[SE]**: Only mandatory if the refund is linked to the original receipt | | ESR.RD | Reference date |
[ES] Flag Spain
[HU] Flag Hungary
[PT] Flag Portugal
| | ESR.RTL | Reference transaction location |
[DE] Flag Germany
[DK] Flag Denmark
| | ESR.RTT | Reference transaction terminal |
[DE] Flag Germany
[DK] Flag Denmark
| | ESR.RTN | Reference transaction number (associated transaction) |
[DE] Flag Germany
[DK] Flag Denmark
| | ESR.Rsn | Reason for cancellation/return |
[FR] Flag France
[HU] Flag Hungary
[NO] Flag Norway
[PT] Flag Portugal
| --- ## Line Void * A voided position is marked with an attribute `Void="1"` * The signs of quantity and amount for this position must be sent reversed (negative). * `Pos.RPN` (Reference Position Number) can optionally be set to the `PN` of the original position being voided. This creates an explicit link and ensures unambiguous matching. * When `Pos.RPN` is omitted, the EFR uses fallback matching: it searches backward through the positions for a match using item identity (`IN`, `ID`, `SKU`) and properties (`TaxG`, `Amt`, `Qty`, `Cat`, `CatN`, etc.). This may be ambiguous when multiple positions share the same item number or tax group.
:::tip efsta recommends always providing `Pos.RPN` on line void positions when the POS system tracks position numbers. Explicit references prevent ambiguity and significantly improve matching accuracy — especially on tickets with repeated items. :::
**Example: Line void** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "7", "T": "6.88", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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": "1020", "Dsc": "Example Item", "TaxG": "B", "Amt": "-1.50", "Cat": "11", "CatN": "Example Category 11", "Void": "1" }, { "_": "Pos", "PN": "4", "IN": "1030", "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": "-3.12" } ] } } } ``` ```xml ```
**Example: Line void with RPN (explicit matching)** The `Pos.RPN` attribute on the void position (`PN="3"`) explicitly references position `PN="2"`, unambiguously identifying which position is being voided. ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "7", "T": "6.88", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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": "1020", "RPN": "2", "Dsc": "Example Item", "TaxG": "B", "Amt": "-1.50", "Cat": "11", "CatN": "Example Category 11", "Void": "1" }, { "_": "Pos", "PN": "4", "IN": "1030", "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": "-3.12" } ] } } } ``` ```xml ```
#### Country Specific Properties for Line Void | Properties | Description | Countries | |---|---|---| | Pos.RPN | Reference Position Number — the `PN` of the original position being voided. In Sweden, this directly drives article registration tracking; without it, the EFR uses multi-stage property fallback. | All countries (optional, strongly recommended) | | Pos.Rsn | Reason for the line correction (e.g. `"Correction"`). When omitted, `"Correction"` is used as the default reason in the fiscal export. |
[DK] Flag Denmark
| --- ## Z-Report / End of Day A Z-report is a daily closure report that sums totals of different payment methods, returns, voids, etc. At the end of the day, the cash register needs to generate a daily closure and send the EFR a signal that the daily closure has been made. In some countries, the EFR then automatically generates additional information for Z-reports that are needed for the country specific audit exports. A Z-report is marked with an attribute `NFS="Z"`
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "8", "NFS": "Z", "Opr": "101", "OprN": "Mario Rossi" } } } ``` ```xml ```
### X-Report * An X-report includes the same information as a daily closure, but just reports the current totals of the day up until the time the X-report was created, it does not close the day. For protocoll purposes, when an X-report is made on the cash register, it should send the EFR a signal that it has been made. * An X-report is marked with an attribute `NFS="X"`
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "9", "NFS": "X", "Opr": "101", "OprN": "Mario Rossi" } } } ``` ```xml ```
--- ## Training When a test/training receipt has been made, this must be documented for audit purposes. A training receipt is marked with an attribute `NFS="TRAINING"` :::note When using fiscal printers, instead of `NFS="TRAINING"` the printer can be set in training mode. :::
**Example** ```json { "Tra": { "ESR": { "NFS": "TRAINING", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "10", "T": "6.88", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PN": "2", "IN": "1030", "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": "-3.12" } ] } } } ``` ```xml ```
| Properties | Description | Countries | |----------------|---------------------------|:------------:| | ESR.FR_Trainer | Oprator ID of the trainer |
[FR] Flag France
| --- ## Vouchers / Gift Certificates * Voucher purchase and voucher payment has to be sent as a position with a position type attribute `PTY="Vou"` * A distinction is made between single-purpose vouchers (purpose of the voucher is known) and multi-purpose vouchers (purpose of the voucher is not known). In Hungary and Slovakia it is not possible to mix voucher sales positions with normal sales positions. #### Country Specific Properties for Vouchers | Properties | Description | Countries | |------------|----------------|:-------------------------:| | Pos.VouN | voucher number |
[DE] Flag Germany
[SK] Flag Slovakia
| ### Multi-Purpose Vouchers Multi-purpose vouchers are vouchers for businesses that sell products with different tax groups. This is the most common type of voucher / gift certificate business case. In this case, the tax of the products that will be purchased with the voucher are unknown, therefore tax is 0% at the voucher sale. The real tax needs to be charged when using the multi-purpose voucher as a payment method. #### Multi-Purpose Voucher Sale
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "11", "T": "103.98", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Vou", "VouN": "123456789", "PN": "2", "IN": "1030", "Dsc": "Example Voucher", "TaxG": "E", "Amt": "100.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "110.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-6.02" } ] } } } ``` ```xml ```
#### Multi-Purpose Voucher Payment
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "12", "T": "19.9", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "119.90", "Qty": "1", "QtyU": "Pc.", "Pri": "119.90", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Vou", "VouN": "123456789", "PN": "2", "IN": "1030", "Dsc": "Example Voucher", "TaxG": "E", "Amt": "-100.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "20.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-0.10" } ] } } } ``` ```xml ```
### Single-Purpose Vouchers * For single-purpose vouchers, the tax rate must be specified by the voucher sale. * On a single-purpose voucher payment, the item that is paid for must be referenced by `Pos.RPN` #### Single-Purpose Voucher Sale
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "13", "T": "103.98", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Vou", "VouN": "123456789", "PN": "2", "RPN": "1", "IN": "1030", "Dsc": "Example Voucher", "TaxG": "B", "Amt": "100.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "110.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-6.02" } ] } } } ``` ```xml ```
#### Voucher Payment
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "14", "T": "19.90", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "B", "Amt": "119.90", "Qty": "1", "QtyU": "Pc.", "Pri": "119.90", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Vou", "VouN": "123456789", "PN": "2", "RPN": "1", "IN": "1030", "Dsc": "Example Voucher", "TaxG": "B", "Amt": "-100.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "20.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-0.10" } ] } } } ``` ```xml ```
--- ## Advance Payments * Advance payments and resolutions are sent as a position and are marked with an attribute `PTY="Adv"` * It is not allowed to make a discount on an advance payment line ### Advance Payment
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "15", "T": "300.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PTY": "Adv", "PN": "1", "Dsc": "Example advance payment", "TaxG": "A", "Amt": "300.00", "RDsc": "Example Item", "RPri": "900.00", "RQty": "1" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "creditcard", "Amt": "300.00" } ] } } } ``` ```xml ```
#### Country Specific Properties for Advance Payment Settings | Properties | Description | Countries | |------------|----------------------------------------------------------------------------|:-------------------------:| | Pos.RDsc | Reference description of the item for which the advance payment is made |
[FR] Flag France
[PL] Flag Poland
| | Pos.RPri | Reference price per item of the item for which the advance payment is made |
[FR] Flag France
[PL] Flag Poland
| | Pos.RQty | Reference quantity of the item for which the advance payment is made |
[FR] Flag France
[PL] Flag Poland
| ### Advance Payment Resolution
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "16", "T": "600.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "RFN": "4711", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example Item", "TaxG": "A", "Amt": "900.00", "Qty": "100", "QtyU": "Pc.", "Pri": "9.00", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Adv", "PN": "2", "RPN": "1", "Dsc": "Example advance payment resolution", "TaxG": "A", "Amt": "-300.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "creditcard", "Amt": "600.00" } ] } } } ``` ```xml ```
#### Country Specific Properties for Advance Payment Resolution | Properties | Description | Countries | |------------|------------------------------------------------------------------------------|:------------:| | ESR.RFN | Reference fiscal number of the original advance payment |
[PL] Flag Poland
| | Adv.RPN | Reference position number of the item for which the advance payment was made |
[PL] Flag Poland
| --- ## Bottle/Container Deposit Bottle or container deposit legislation is any law that requires the collection of a monetary deposit on beverage containers at the point of sale. In many countries in Europe, this is a very common business case. Deposit sales and deposit return are sent as position and are marked with an attribute `PTY="Dep"` In Poland, deposits need to be sent to the EFR with a 0% TaxG. Reason for this is that returns and sales of bottle deposits do not fall under VAT regulations in Poland. ### Deposit Sale
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "17", "T": "24.30", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example bottled item", "TaxG": "A", "Amt": "19.80", "Qty": "20", "QtyU": "Pc.", "Pri": "0.99", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Dep", "PN": "2", "IN": "1030", "Dsc": "Example bottle deposit", "TaxG": "A", "Amt": "3.00", "Qty": "20", "Pri": "0.15" }, { "_": "Pos", "PTY": "Dep", "PN": "3", "IN": "1030", "Dsc": "Example box deposit", "TaxG": "A", "Amt": "1.50", "Qty": "1", "Pri": "1.50" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "debitcard", "Amt": "24.30" } ] } } } ``` ```xml ```
### Deposit Return When the bottle is returned to the point of sale, then the entire sum is refunded.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "18", "T": "-4.50", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PTY": "Dep", "PN": "1", "IN": "1030", "Dsc": "Example bottle deposit", "TaxG": "A", "Amt": "-3.00", "Qty": "-20", "Pri": "0.15" }, { "_": "Pos", "PTY": "Dep", "PN": "2", "IN": "1030", "Dsc": "Example box deposit", "TaxG": "A", "Amt": "-1.50", "Qty": "-1", "Pri": "1.50" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "-4.50" } ] } } } ``` ```xml ```
:::warning Please check which tax group to use for bottle deposit in your country, some may require deposits to have 0% taxes ::: In Hungary and Sweden, it is not possible to mix deposit return position with normal sales positions. --- ## Tip Tips need to be reported in some countries and future legislation will require tips to be reported in most countries. Implementing the tips business case now will keep your point of sale future-proof. * Tip is sent as position and is marked with an attribute `PTY="Tip"` * Usually tip is considered 0% tax. Please consult with your tax advisor for your specific country and use case. ### Registering Tip Included in the Sale
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "18", "T": "17.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "15.70", "Qty": "1", "QtyU": "Pc.", "Pri": "15.70", "Cat": "10", "CatN": "Example Category 10" }, { "_": "Pos", "PTY": "Tip", "PN": "2", "Dsc": "Example Tip text", "TaxG": "E", "Amt": "1.30" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "20.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-3.00" } ] } } } ``` ```xml ```
### Registering Tip after Finished Sale
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "20", "T": "1.30", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "RFN": "001/1/20", "PosA": [ { "_": "Pos", "PTY": "Tip", "PN": "1", "Dsc": "Example Tip text", "TaxG": "E", "Amt": "1.30" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "1.30" } ] } } } ``` ```xml ```
#### Country Specific Properties for Tip after Sale | Properties | Description | Countries | |------------|------------------------------------------------------------------|:------------:| | ESR.RFN | Reference fiscal number of the receipt for which the tip is paid |
[HR] Flag Croatia
| --- ## Invoices ### Direct Invoice A direct invoice: * is issued when no receipt has been created beforehand * serves as the sole fiscal document for the transaction * is marked with `DT="INVOICE"` * must contain customer data using `ESR.Ctm`
In Spain, **all data** concerning Ctm (like NIF/TaxID, Name, Postal Code, Address aso.) has to be included, otherwise there will be warnings. In Belgium, direct invoices are only accepted in the form of E-Invoices. Any direct invoice not issued as an E-Invoice will be rejected.
**Example** ```json { "Tra": { "ESR": { "DT": "INVOICE", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "21", "T": "399.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "Ctm": { "CN": "12", "Nam": "Example Name", "Adr": "Example street 1", "Zip": "10115", "City": "Berlin", "Ctry": "DE", "TaxId": "DE123456789" }, "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example Item", "Amt": "399.00", "TaxG": "A", "Qty": "1", "QtyU": "Pc.", "Pri": "399.00", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "creditcard", "Amt": "399.00" } ] } } } ``` ```xml ```
### Supplementary Invoice A supplementary invoice: * is issued in addition to a fiscal receipt that was already created for the same transaction * does not count towards the Grand Total a second time * is marked with `NFS="INVOICE"` * must contain customer data using `ESR.Ctm`
In Spain, RFN and RD are mandatory for NFS invoices. - In Belgium, ESR.DN and ESR.RFN are mandatory. - Multiple previously issued VAT receipts can be referenced and combined into a single supplementary invoice. To do so, the individual FN values of the referenced VAT receipts must be joined using the pipe character `|`. e.g.: `...`
**Example** ```json { "Tra": { "ESR": { "NFS": "INVOICE", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "22", "T": "399.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "Ctm": { "CN": "12", "Nam": "Example Name", "Adr": "Example street 1", "Zip": "10115", "City": "Berlin", "Ctry": "DE", "TaxId": "DE123456789" }, "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example Item", "Amt": "399.00", "TaxG": "A", "Qty": "1", "QtyU": "Pc.", "Pri": "399.00", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "creditcard", "Amt": "399.00" } ] } } } ``` ```xml ```
### Invoice with Open Balance If the invoice has not been paid, the paygroup must be set to "open" `PayG="open"`.
**Example** ```json { "Tra": { "ESR": { "DT": "INVOICE", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "23", "T": "399.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "Ctm": { "CN": "12", "Nam": "Example Name", "Adr": "Example street 1", "Zip": "10115", "City": "Berlin", "Ctry": "DE", "TaxId": "DE123456789" }, "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example Item", "Amt": "399.00", "TaxG": "A", "Qty": "1", "QtyU": "Pc.", "Pri": "399.00", "Cat": "10", "CatN": "Example Category 10" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "open", "Amt": "399.00" } ] } } } ``` ```xml ```
### Payment of the Open Balance on POS
**Example** ```json { "Tra": { "ESR": { "NFS": "PAY", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "24", "T": "0.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "creditcard", "Amt": "399.00" }, { "_": "Pay", "Dsc": "Example payment", "PayG": "open", "Amt": "-399.00" } ] } } } ``` ```xml ```
--- ## Abort The abort of a receipt before it is finished is marked with the attibute `NFS="ABORT"`
**Example** ```json { "Tra": { "ESR": { "NFS": "ABORT", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "25", "T": "8.38", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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" } ] } } } ``` ```xml ```
--- ## Order An order is marked with the attibute `NFS="ORDER"`
**Example** ```json { "Tra": { "ESR": { "NFS": "ORDER", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "26", "T": "8.38", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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" } ] } } } ``` ```xml ```
In Germany the Date/Time of the first order has to be printed on the fiscal receipt as D0.
e.g.: `...`
In Belgium, ESR.SvcPoint is mandatory. For more information, see [Country Specific Business Cases](/efr/api/country-specific#service-points) --- ## Payment Transactions In Hungary it is mandatory to send a reason for payment transactions. This reason must be send as attribute ESR.Rsn e.g.: "Rsn="01". The reasons are descript in the country guide. In Sweden, all of the Payment Transactions are mandatory! ### Opening Balance The opening balance is marked with the attibute `NFS="INI"`.
**Example** ```json { "Tra": { "ESR": { "NFS": "INI", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "27", "T": "500.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example opening balance", "TaxG": "E", "Amt": "500.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "cash", "Amt": "500.00" } ] } } } ``` ```xml ```
In Hungary, the opening balance starts the day. If no opening balance is sent, all subsequent transactions will be rejected. ### Deposit of Change A deposit of change is marked with the attibute `NFS="TRANSFER"` and a positive amount.
**Example** ```json { "Tra": { "ESR": { "NFS": "TRANSFER", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "28", "T": "500.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example transfer", "TaxG": "E", "Amt": "500.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "cash", "Amt": "500.00" } ] } } } ``` ```xml ```
### Daily Closure Cash Out A daily closure cash out is marked with the attibute `NFS="TRANSFER"` and a negative amount.
**Example** ```json { "Tra": { "ESR": { "NFS": "TRANSFER", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "29", "T": "-500.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example transfer", "TaxG": "E", "Amt": "-500.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "cash", "Amt": "-500.00" } ] } } } ``` ```xml ```
### Pay In A pay in is marked with the attibute `NFS="PAY"` and a positive amount.
**Example** ```json { "Tra": { "ESR": { "NFS": "PAY", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "30", "T": "500.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example pay in", "TaxG": "E", "Amt": "500.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "cash", "Amt": "500.00" } ] } } } ``` ```xml ```
### Pay Out A pay out is marked with the attibute `NFS="PAY"` and a negative amount.
**Example** ```json { "Tra": { "ESR": { "NFS": "PAY", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "31", "T": "-500.00", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "PosA": [ { "_": "Pos", "PN": "1", "Dsc": "Example pay out", "TaxG": "E", "Amt": "-500.00" } ], "PayA": [ { "_": "Pay", "Dsc": "Example payment", "PayG": "cash", "Amt": "-500.00" } ] } } } ``` ```xml ```
--- ## Reprints
[BE] Flag Belgium
 
[DK] Flag Denmark
 
[FR] Flag France
 
[NO] Flag Norway
 
[SE] Flag Sweden
Only **one single copy** of a cash receipt is allowed! * A reprint is marked with the attibute `NFS="DUP"` and a reference to the original receipt's `FN` as `RFN=[original-FN]` and `D` as `RD=[original date]`.
**Example** ```json { "Tra": { "ESR": { "NFS": "DUP", "RD": "2024-06-01T08:10:15", "RFiscal": "GMDTPAHXUWJ4DP77FGOFE3NUXPWO6ZG7;6TTZM3BYMSKOKVHF5VM6BZAUAA", "RFN": "001/1/10", "Rsn": "printing error", "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "32", "T": "8.38", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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", "PayG": "cash", "Amt": "10.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-1.62" } ] } } } ``` ```xml ```
#### Country Specific Properties for Reprint | Properties | Description | Countries | |-------------|-------------------------------------------------|:----------------------------------------------------------------:| | ESR.RFN | Reference fiscal number of the original receipt |
[DK] Flag Denmark
[BE] Flag Belgium
[FR] Flag France
[NO] Flag Norway
[SE] Flag Sweden
| | ESR.RD | Reference fiscal date of the original receipt |
[DK] Flag Denmark
[SE] Flag Sweden
| | ESR.Rsn | Reason for cancellation/return |
[FR] Flag France
| | ESR.RFiscal | Reference control code (Kontrollkod) |
[SE] Flag Sweden
| --- ## Rounding
[BE] Flag Belgium
 
[CZ] Flag Czechia
 
[HU] Flag Hungary
 
[IT] Flag Italy
 
[NO] Flag Norway
 
[SE] Flag Sweden
 
[SK] Flag Slovakia
* Rounding on cash payments is sent as a payment with payment group "rounding" `PayG="rounding"`
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "33", "T": "8.38", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "Dsc": "Example Item", "TaxG": "A", "Amt": "3.98", "Qty": "2", "QtyU": "Pc.", "Pri": "1.99", "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 Rounding", "PayG": "rounding", "Amt": "-0.02" }, { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "10.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-1.60" } ] } } } ``` ```xml ```
--- ## Paying with Foreign Currency For payment in foreign currency, the currency code `CC`, the amount of the foreign currency `FAmt` and the amount in the country currency `Amt` must also be specified In addition to the fields mentioned above, a third field `ConvR` (conversion rate) is required in Poland.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "34", "T": "34.90", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1030", "Dsc": "Example item", "TaxG": "A", "Amt": "34.90" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "FAmt": "40.00", "CC": "USD", "Amt": "37.40" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-2.50" } ] } } } ``` ```xml ```
--- ## Cashier Log In A cashier log in is marked with the attibute `NFS="LOGIN"`.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "35", "NFS": "LOGIN", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678" } } } ``` ```xml ```
--- ## Cashier Log Out A cashier log out is marked with the attibute `NFS="LOGOUT"`.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "36", "NFS": "LOGOUT", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678" } } } ``` ```xml ```
--- ## Proforma Invoice A proforma invoice is marked with the attibute `NFS="PROFORMA"`. :::note[Sweden] In
[SE] Flag Sweden
a proforma parks the transaction: it can be sent for a previously parked transaction and keeps it open under its own fiscal number - see [Parking of Receipts](/efr/api/country-specific#parking-of-receipts). :::
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "TN": "37", "T": "34.90", "NFS": "PROFORMA", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1030", "Dsc": "Example item", "TaxG": "A", "Amt": "34.90" } ] } } } ``` ```xml ```
--- ## Export/Audit Events
[BE] Flag Belgium
 
[DK] Flag Denmark
 
[FR] Flag France
 
[NO] Flag Norway
 
[SE] Flag Sweden
 
In these countries, it is also mandatory to log events from the cash register via fiscalization. The following events are covered by the business cases above: * Cashier log in * Cashier log out * Reprints * Z-report / daily closure * X-report
Further events must be sent to the EFR service using audit records. Export events are converted into audit codes internally, and vice versa.
**Example** ```json { "Audit": { "Code": "DRAWER_OPEN", "Dsc": "Drawer open", "TL": "001", "TT": "1", "Opr": "1", "OprN": "Operator name" } } ``` ```xml ```
### List of Export / Audit Events The following events must be sent to the EFR service using audit records: | Code | Description |         Country         | |-----------------|----------------------------------------------------------------------------------|:------------------------------------------------------------:| | DRAWER_OPEN | Event to open the cash register outside of a sale |
[BE] Flag Belgium
[DK] Flag Denmark
[HU] Flag Hungary
[LT] Flag Lithuania

[NO] Flag Norway
[PL] Flag Poland
[SE] Flag Sweden
[SK] Flag Slovakia
| | DRAWER_CLOSE | Event to close the cash register after it’s been opened |
[DK] Flag Denmark
[NO] Flag Norway
[LT] Flag Lithuania
[HU] Flag Hungary

[PL] Flag Poland
[SK] Flag Slovakia
| | SUSPEND_RECEIPT | Event to put the sale on hold without conclusion (parking receipt)  |
[DK] Flag Denmark
[NO] Flag Norway
| | RESUME_RECEIPT | Resuming a parked receipt to continue the sale  |
[DK] Flag Denmark
[NO] Flag Norway
| | REPORT | Generation (creation) of a report other than an X- or Z-day report |
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
| | PRICE_CHANGE | Log time when prices are changed  |
[DK] Flag Denmark
[NO] Flag Norway
| | PRICE_LOOKUP | Event for asking the register for a price query (e.g., scanning an item to get its price without registering it) |
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
| | TRAINING_ON | Event to report the start of a cashier training. This is just a report and does NOT change how the EFR treats the transactions following |
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
| | TRAINING_OFF | Event to report the register back to normal mode after being reported in training mode |
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
| | CLOCK_RESET | Event for setting or correcting the time on the register system |
[SE] Flag Sweden
| | MEM_FULL | Memory full (cash register) |
[DK] Flag Denmark
[NO] Flag Norway
| | EMERGENCY_ON | Report that the system has entered emergency operation due to a critical error, for example with the cash drawer or printer |
[DK] Flag Denmark
[NO] Flag Norway
| | EMERGENCY_OFF | Report that the system has exited emergency operation after the critical error has been resolved |
[DK] Flag Denmark
[NO] Flag Norway
| | ABORT | Cancellation of an unfinished receipt | | | OTHER | Other event | | --- ## Non-fiscal Transaction without Printing
[FR] Flag France
 
[HU] Flag Hungary
 
[IT] Flag Italy
 
[NO] Flag Norway
 
[PL] Flag Poland
 
[SE] Flag Sweden
 
[SK] Flag Slovakia
A non-fiscal transaction that is registered in the EFR without triggering printing is marked with the `NF` or `NFS` field and the `DO="noprint"` attribute.
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "T": "8.38", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "12345678", "TP": "Table 1", "NF": "DOC", "DO": "noprint", "PosA": [ { "_": "Pos", "PN": "1", "IN": "1001", "SKU": "456487", "Dsc": "Example Item", "TaxG": "A", "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" } ] } } } ``` ```xml ```
--- source: https://docs.dev.efsta.eu/efr/api/country-specific --- # Country specific Business Cases :::tip[Important Information to the generic Interface] 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](mailto:ticket@efsta.eu) ## Start Transaction Every business case must be started by sending a request with a `` 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 `` 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.
**Example: Start request** ```json { "TraS": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1" } } } ``` ```xml ```
**Example: Response of start transaction** ```xml ``` ```json { "TraSC": { "SQ": "360", "Result": { "RC": "OK" }, "Fis": { // highlight-next-line "TID": "292", "StartD": "2024-06-01T08:30:02" } } } ```
**Example: Transaction with TID** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "40.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-5.10" } ] } } } ``` ```xml ```
--- ## Use of input devices (handheld device) 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "40.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-5.10" } ] } } } ``` ```xml ```
--- ## Invoices in the name of third parties 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "40.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-5.10" } ] } } } ``` ```xml ```
--- ## Private payment ### 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "PayG": "0", "Amt": "200.00" } ] } } } ``` ```xml ```
### 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "PayG": "0", "Amt": "-400.00" } ] } } } ``` ```xml ```
--- ## Variance analysis / difference 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "PayG": "0", "Amt": "-87.00" } ] } } } ``` ```xml ```
--- ## Wage payment
[DE] Flag Germany
 
[HU] Flag Hungary
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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "PayG": "0", "Amt": "-1000.00" } ] } } } ``` ```xml ```
--- ## Gastronomy consumption inhouse vs. take away
[DE] Flag Germany
 
[HU] Flag Hungary
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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "10.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-0.10" } ] } } } ``` ```xml ```
--- ## Delivery  
[DE] Flag Germany
[DK] Flag Denmark
[NO] Flag Norway
[SE] Flag Sweden
### 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Open", "PayG": "8", "Amt": "399.00" } ] } } } ``` ```xml ```
The invoice afterwards is non fiscal and marked with an attribute `NFS="INVOICE"`.
**Example** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Offen", "PayG": "8", "Amt": "399.00" } ] } } } ``` ```xml ```
### 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** ```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" } ] } } } ``` ```xml ```
--- ## Tax of old parts (Altteilsteuer) 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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "Amt": "1176.00", "PayG": "Cash" } ], "TaxA": [ { "_": "Tax", "TaxG": "A", "Prc": "16", "Net": "1000.00", "TAmt": "176.00", "Amt": "1176.00" } ] } } } ``` ```xml ```
--- ## Difference tax rate (Differenzbesteuerung)
[AT] Flag Austria
 
[DE] Flag Germany
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** ```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" } ], "PayA": [ { "_": "Pay", "Dsc": "Cash", "Amt": "1150.00", "PayG": "Cash" } ], "TaxA": [ { "_": "Tax", "TaxG": "G", "Prc": "0", "Net": "1150.00", "TAmt": "0.00", "Amt": "1150.00" } ] } } } ``` ```xml ```
:::warning[Attention] 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** ```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" } ], "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" } ] } } } ``` ```xml ```
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 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
**Example** ```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" } ], "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" } ] } } } ``` ```xml ```
## Article Registration & Changes 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" } ], "PayA": [ { "_": "Pay", "Dsc": "Example Payment", "PayG": "cash", "Amt": "5.00" }, { "_": "Pay", "Dsc": "Example Change", "PayG": "change", "Amt": "-1.54" } ] } } } ```
## Parking of Receipts 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. 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)](/efr/SE/fiscal#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` | 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. :::note[Resuming on another terminal] 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" } ] } } } // 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": { "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": { "ESR": { // highlight-next-line "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", // highlight-next-line "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" }, // highlight-next-line { "Label": "", "Value": "Ej kvitto", "Name": "" } ] } } } ```
**Example: Resuming a parked transaction and finalizing it** ```xml ``` ```json // 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", // highlight-next-line "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", // highlight-next-line "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", // highlight-next-line "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", // highlight-next-line "Resume": "1" } ] } } } ```
## Printing Periodic Reports
[LT] Flag Lithuania
[PL] Flag Poland
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** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "NFS": "PERIODIC_REPORT", "Opr": "101", "OprN": "Mario Rossi", "FromD": "2025-08-04", "TillD": "2025-08-05" } } } ``` ```xml ```
**Example: Periodic Summary Report** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "NFS": "PERIODIC_SUM_REPORT", "Opr": "101", "OprN": "Mario Rossi", "FromD": "2025-08-04", "TillD": "2025-08-05" } } } ``` ```xml ```
| Parameter | Description | Country | |-----------|----------------------------------------------------|:-------------------------:| | `NFS` | Specifies the report type |
[LT] Flag Lithuania
[PL] Flag Poland
| | `FromD` | Defines the start of the date range for the report |
[LT] Flag Lithuania
[PL] Flag Poland
| | `TillD` | Defines the end of the date range for the report |
[LT] Flag Lithuania
[PL] Flag Poland
| #### Filtering by Z-Indexes Both report types also support filtering based on Z-index ranges using `FromZI` and `ToZI`
**Example** ```json { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TL": "001", "TT": "1", "NFS": "PERIODIC_SUM_REPORT", "Opr": "101", "OprN": "Mario Rossi", "FromZI": "1", "ToZI": "2" } } } ``` ```xml ```
## Service Points
[BE] Flag Belgium
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:
`TABLE`
`CHAIR` \*
`ROOM`
`CUSTOMER`
`ON_HOLD`
`KIOSK`
`PLATFORM`
`WEBSHOP`
`OTHER`

\* Requires a [ParentSvcPoint](#svcpoint-parentsvcpoint) of Type `TABLE` | | OperationId | Session of the Service Point | Groups all connected transactions. Sent to the FDM as cost center reference. Available from **EFR version 2.15.0**.
Example: `T2_601` | | [ParentSvcPoint](#svcpoint-parentsvcpoint) | Parent Service Point | Mandatory when SvcPoint.Type `CHAIR` is used | - 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. The OperationId can be filled with the value the POS uses internally to search for the orders or to bundle them. #### (SvcPoint.) ParentSvcPoint [Return to SvcPoint table](#parentsvcpoint) | Property | Description | Note | | ----------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------- | | Id | Id of the parent Service Point | | | Type | Type of the parent Service Point | `TABLE` | | OperationId | Session of the parent Service Point | Groups all connected transactions. Sent to the FDM as cost center reference. Available from **EFR version 2.15.0**.
Example: `20240903_001` | #### Examples **Order booked on Table 1:** ```xml ``` ```json { "SvcPoint": { "Id": "Table 1", "Type": "TABLE", "OperationId": "20240903_001" } } ``` **Order booked on Chair 1 of Table 1:** ```xml ``` ```json { "SvcPoint": { "Id": "Chair 1", "Type": "CHAIR", "OperationId": "20240903_001_1", "ParentSvcPoint": { "Id": "Table 1", "Type": "TABLE", "OperationId": "20240903_001" } } } ``` :::note 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 same Service Point and OperationId.
**Example: Order to Table 1** ```xml ``` ```json { "Tra": { "ESR": { "NFS": "ORDER", "TL": "001", "TT": "1", "T": "8.40", "OprSSN": "00000000097", "OprN": "Mario Rossi", "SvcPoint": { "Id": "Table 1", "Type": "TABLE", "OperationId": "20240903_001" }, "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", "SvcPoint": { "Id": "Table 1", "Type": "TABLE", "OperationId": "20240903_001" }, "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", "RSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" }, "SvcPoint": { "Id": "T5", "Type": "TABLE", "OperationId": "20240903_005" }, "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", "OprSSN": "00000000097", "OprN": "Mario Rossi", "SvcPoint": { "Id": "T5", "Type": "TABLE", "OperationId": "20240903_005" }, "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", "OperationId": "20240903_001" } }, { "_": "Pos", "PN": "2", "IN": "1020", "Dsc": "Example Item", "TaxG": "B", "Amt": "1.50", "Cat": "11", "CatN": "Example Category 11", "RSvcPoint": { "Id": "T35", "Type": "TABLE", "OperationId": "20240903_035" } } ] } } } ```
### NFS="SVC_POINT_SPLIT" Splitting positions from one service point, onto one or more target service points.
**Example: Splitting of Table 1 to Table 5 and Table 35.** ```xml ``` ```json { "Tra": { "ESR": { "NFS": "SVC_POINT_SPLIT", "TL": "001", "TT": "1", "T": "5.48", "OprSSN": "00000000097", "OprN": "Mario Rossi", "RSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" }, "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", "OperationId": "20240903_005" } }, { "_": "Pos", "PN": "2", "IN": "1020", "Dsc": "Example Item", "TaxG": "B", "Amt": "1.50", "Cat": "11", "CatN": "Example Category 11", "SvcPoint": { "Id": "T35", "Type": "TABLE", "OperationId": "20240903_035" } } ] } } } ```
**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", "RSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" }, "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", "OperationId": "20240903_001_1", "ParentSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" } } }, { "_": "Pos", "PN": "2", "IN": "1020", "Dsc": "Example Item", "TaxG": "B", "Amt": "1.50", "Cat": "11", "CatN": "Example Category 11", "SvcPoint": { "Id": "C2", "Type": "CHAIR", "OperationId": "20240903_001_2", "ParentSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" } } } ] } } } ``` #### 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", "OperationId": "20240903_001_1", "ParentSvcPoint": { "Id": "T1", "Type": "TABLE", "OperationId": "20240903_001" } }, "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" } ] } } } ```
--- source: https://docs.dev.efsta.eu/efr/api/rule-set --- # EFR Rule Set :::tip[Important Information to the generic Interface] 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. :::

## Webservice Reference EFR operates as local webserver on the cash register or within LAN. Local installation is recommended, otherwise the cash register could not issue fiscal receipts in case of network failure. Port 5618 is used for HTTP communication and UDP messaging (reserved with IANA). Example URL: http://localhost:5618/register Query Parameters, Request Body and Headers are specified, if needed. On GET requests commonly the body may be left empty. By default query parameter names are not case sensitive. Be sure to encode special characters in parameter values (read more on
w3schools.com). Some requests can deliver XML or JSON response content. The format is choosen upon the request body format or is set to XML, if an optional request header accept: xml was set. Default response format is JSON. ## Communication Workflow After finishing processing positions and payment, the cashier application transfers resulting transaction data to the EFR for signing. The generated signature is to be printed on the sales slip. The success status of the transactions registration with the EFR is returned within tag ``. The relevant information is `ResultCode RC`: | Result Code RC | HTTP-Statuscode | Reason | Action within frontend application | |----------------|--------------------|---------------------------------------------------------------------------------------|--------------------------------------------------| | OK | 200 OK | Transaction processd successfully | Print receipt | | BAD | 400 Bad Request | Invalid request data | Terminate transaction
Check transaction data | | NO | 406 Not Acceptable | Could not process transaction, another try at a later time might be successful though | Retry Y/N

On "N" terminate transaction | EFR software will always will respond 200 OK when - Software installation was successful - The request complies with formal parameters (XML structure) - Local infrastructure is operational (i.e. hard disk) ### Timing Considerations EFR is designed to respond reliably within 10 seconds, so a request timeout of 10 sec should be set. Typically transaction registration with online fiscal systems will need about 1 sec for completion, local signature about 250 ms. An exception to this behaviour are installations, where the transaction has to be printed over a Fiscal Printer (e.g. [IT, PL, SK,…] ). In this case, printout completion is awaited before response. Depending on printer speed and number of positions, the printout may require up to 30 sec. A delay also may occur when the paper out (and insertion of a new paper reel) is handled internally by printer firmware. For fiscal printer installations there are following valid methods of interaction: #### Without Timeout Wait infinitely for `/register` response. In case of system crash, resend the transaction on restart (preferably with `/restart` instead of `/register`, duplicate detection operates more specific this way; see [Restart Handling](/efr/api/rule-set#restart-handling)). #### With Timeout Set a timeout of 10000 ms on your request. In case of a timeout, use subsequent `GET /last requests` in a loop (e.g. once a second). During transaction processing HTTP status "423 Locked" is responded, after completion the usual registration response. If no response is received, the communication to EFR may be broken. After restoration perform Restart Handling (see [4.3 Restart Handling](/efr/api/rule-set#restart-handling)). #### Full RFC 2518 Implementation In this configuration a HTTP status 102 is given as interim response to inform the client, that the server has accepted the request, but not yet completed it. For this, enter the following string in the Profile field Attributes (see [6.1 profile.cfg | Attributes](/efr/api/additional-functions#attributes)):
`HttpServer_respond102=9000` The value represents the interim response interval in ms. :::tip[Good to know] At any time `GET /last` (or `GET /last?\_=Tra`, `GET /state`, `GET /log`) requests may be used, even during transaction processing. These requests are responded from cache and will not affect the system performance. ::: ### Restart Handling It is essential to keep the fiscal system and the cash register database in parallel. A transaction has to be in both systems, or none of them. A classic test case is the start of a transaction and power loss before completion. In this case the EFR expects the repetition of the last transaction immediately after restart. If the transaction had been processed before, the registration result is delivered, else the whole registration is performed. To initiate this restart behaviour use WebRequest `/restart` instead of `/register`. If the transaction was registered successfully before, the result is returned containing the notification #DUPLICATE: ``` #DUPLICATE … ``` ## Cfg - Configuration The configuration must be sent before the first transaction. It is recommended to send the configuration to the EFR service every time the cash register is started in order to keep it up to date. The individual parts of the configuration are described in the following tables. Request is descript in EFR API [Cfg](/efr/api/#cfg---base-datacompany-header-data). ### Cmp - Company | Name | Description | Mandatory | Example | |--------------|-------------------------------------------------------------------------------------------------------------------|:-----------------:|-----------------| | Nam | Company name | Yes | "My Company" | | label | Company short name for digital receipt | Yes | "MyComp" | | Adr | Company address | Yes | "Street" | | AdrNr | Street number | Yes | "3" | | Zip | Postcode | Yes | "1000" | | City | City | Yes | "City" | | Ctry | Country ISO-3166 | Yes | "XY" | | TaxId | Intra community VAT identifier. Please configure the tax id in the profile | Yes | "XY99999999999" | | TIN | Tax Identification e.g.: "Steuernummer" |
[DE] Flag Germany
| "123456789" | | Org | Organization number assigned by Swedish tax authority, required for CCU enrollment and usage. Format: NNNNNN-NNNN |
[SE] Flag Sweden
| "373737-3737" | | VatRegime | Issuer's own VAT regime. Allowed values: `GENERAL`, `SIMPLE`, `REDE`. Not available for IGIC (Canary Islands) - details see [Special VAT Regimes](/efr/ES/vat-regimes.md) |
[ES] Flag Spain
| "REDE" | | VATonPayment | VAT chargeable on receipt of payment (default: on issuance of invoice) |
[FR] Flag France
| 0 | | FR_NAF | Code NAF/APE / Activity Type Code in France |
[FR] Flag France
| "47.11D" | | FR_SRN | SIREN / Business Register Identifier |
[FR] Flag France
| "732 829 32" | | FR_RCS | Lieu d'immatriculation + lettre "A" ou "B" (commerce ou société) / City of Registration + Category |
[FR] Flag France
| "PARIS A" | | FR_TYPE | Legal Form |
[FR] Flag France
| "XXX" | | FR_CAPITAL | Social Capital |
[FR] Flag France
| "XXX" | | FR_METIER | Trades Directory Registration Number |
[FR] Flag France
| "XXX" | ### Loc - Location | Name | Description | Mandatory | Example | |-------------|-------------------------------------------------------------|:-----------------:|--------------------| | TL | Transaction Location code / store number | Yes | "001" | | Nam | Location name | Yes | "My Location" | | label | Location name Location short name for bill.efsta | Yes | "MyLoc" | | Adr | Store address | Yes | "Long Road" | | AdrNr | Street number | Yes | "123" | | Zip | Postcode | Yes | "12345" | | City | City | Yes | "Metropolis" | | State | State/Region | | "XXX" | | Ctry | Country ISO-3166 | Yes | "XY" | | TaxId | Intra community VAT identifier |
[DE] Flag Germany
| "XY99999999999" | | FR_SIR | SIRET / Geographic Identification of a French Establishment |
[FR] Flag France
| "732 829 320 0007" | | LegalId | Establishment Unit Number |
[BE] Flag Belgium
[CZ] Flag Czechia
| "2000000042" | ### Trm - Terminal | Name | Description | Mandatory | Example | |---------------|------------------------------------------------------------------------------------------------------|:---------------------------------------------------:|----------------------------------| | TT | Transaction Terminal code / number of cash register | Yes | "1" | | SW | POS software name | Yes | "My POS Software" | | SWVersion | Cash Register Software Version |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
[SE] Flag Sweden
| "3.2.7"
"CFOD0031234568" | | HW | Hardware brand | Yes | "POS Brand" | | HWModel | Hardware model |
[DE] Flag Germany
[SE] Flag Sweden
| "POS Model" | | Serial | Cash Register Serial Number | Yes | "POS serial number" | | Lang | The language of the Pos system, which has to match the receipt/cash register. (default: EN) |
[BE] Flag Belgium
| 'en', 'de', 'fr', 'nl' | | OprSSN | Fallback social security number of the POS operator when no number was supplied with the transaction | | | ### Doc - E-Invoicing | Name | Description | Example | |-----------------------|-------------------------------------------------|--------------------------| | ContactName | Contact Name of the Sender | "Invoicing Department" | | ContactTelephone | Contact Phone Number of the sender | "123456789" | | ContactElectronicMail | EMail address of the sender | "office@efsta.eu" | | PaymentTerms | Terms of the payment | "30 days net" | | PaymentPeriod | Terms of the payment in days (payment deadline) | 30 | | AccountName | Bank account holder | "my company" | | AccountIBAN | IBAN of the bank account | "AT00000000000000000000" | | AccountBIC | BIC of the bank account | "ASPAKAT2LXXX" | ### Dev - Input Devices Typically, input devices are handheld devices which serve as input for cash registers. This does not refer to explicit cash registers. :::info You can find more information on input devices in Germany in the [Use of Input Devices (Handheld Device)](/efr/api/country-specific#use-of-input-devices-handheld-device) section. ::: | Name | Description | Country | Example | |-----------|-------------------------------|:------------:|------------------------| | Id | Input Device Identification |
[DE] Flag Germany
| "1" | | HW | Input Device Hardware brand |
[DE] Flag Germany
| "Dev Brand" | | HWModel | Input Device Hardware model |
[DE] Flag Germany
| "Dev Model" | | SW | Input Device Sofware name |
[DE] Flag Germany
| "My Dev Software" | | SWVersion | Input Device Software version |
[DE] Flag Germany
| "1.5.7" | | Serial | Input Device Serial |
[DE] Flag Germany
| "Device serial number" | ### DE_Agentur - Agency :::info These are third-party providers in whose name sales can be made on the POS system.
You can find more information on third-party invoices in Germany in the [Invoices in the Name of Third Parties](/efr/api/country-specific#invoices-in-the-name-of-third-parties) section. ::: | Name | Description | Country | Example | |-------|---------------------------------------|:------------:|-----------------| | Id | Agency Identification |
[DE] Flag Germany
| "1" | | Nam | Agency Name |
[DE] Flag Germany
| "Test Company" | | Adr | Agency Adr |
[DE] Flag Germany
| "177 Long Road" | | Zip | Agency Postcode |
[DE] Flag Germany
| "12345" | | City | Agency City |
[DE] Flag Germany
| "Metropolis" | | Ctry | Agency Country ISO-3166 |
[DE] Flag Germany
| "XY" | | TaxId | Agency Intra community VAT identifier |
[DE] Flag Germany
| "XY99999999999" | ## ESR – "efsta Simple Receipt" Format This section describes the standard elements. Beyond these the XML document may contain company specific additional elements and fields. Please note that the list of standardized elements may be extended, in this case only 1 to 4-letter tag names are used. Consequently we advise that for additional tags at least 5-letter denominations or separate XML-namespaces be used. :::note All amounts (Datatype Currency) within the datasets shall be local currency except otherwise noted. ::: #### License The "efsta Simple Receipt" format described in this chapter is intellectual property of efsta and is licensed under the terms of GNU General Public License (GPL). It may be used freely, provided the following provisions are kept: - Denomination of the format remains ESR "efsta Simple Receipt" - Extensions as such conform to the formal rules of ESR (attribute names at least 5 letters length) - Publicly accessible storage systems (Internet) must provide suitable access control to personal vouchers or receipts ### Request Tra (Transaction) Registration of a sales transaction. Each group is used according to its structural purpose: - [ESR](#esr-elements) → foundational - [Ctm](#esr-ctm) → document-level context - [Pos](#esrposa-pos) / [Mod](#esrposa-mod) / [Lin](#esrposa-lin) → product/line-item data - [Pay](#esr-pay) → how the transaction is settled - [Tax](#esr--tracfisz-tax) → fiscal tax calculation details
They are combined to form a complete, compliant fiscal dataset, with ESR elements defining the mandatory structure and Other elements allowing extensions where needed. #### ESR Elements ESR elements describe the core, standardized data fields that every EFR must produce according to the fiscalization specification. These elements are mandatory, strictly defined, and ensure legal compliance and interoperability across all environments. | Attribute | Name | Description | Datatype | Mandatory | |------------------|--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|-----------------|:-----------------------------------------------------------------:| | ESR | efsta Simple Receipt | Receipt Body | | Mandatory | | D | Date Time | Seconds have to be specified according to fiscal law
*Example: "2016-08-01T13:28:22"* | DateTime | Mandatory

Default:
system time | | D0 | Date Time Start | Timestamp of the process start / First order
*Example: "2016-08-01T13:28:22"* | DateTime |
[DE] Flag Germany


Default:
transaction
start time | | TaxId | VAT Number | Important for centralized multi company multi client EFR installations with `RN_TT=true`

*Example: "DE123456789"* | Text | Optional | | TL | Transaction Location | int. Branch ID / Business Premise / Store ID
Has to be unique within a company. Must be the same as the int. Branch ID of a location in the portal. For compatibility, if omitted TL is extracted from TT, e.g.:

`TT="44/7"` =>
`TL="44" TT="7"`

*Example: "4012"* | Text | | | TT | Transaction Terminal | Cash Register Terminal Number
Has to be unique within TL.
TL+"/"+TT is used as unique terminal identification within a Company

*Example: "7"* | Text | Mandatory

Default: '1' | | TN | Transaction Number | Sequential receipt number
If only fiscally mandatory transactions are registered, continuous (gapless) sequence of receipt numbers has to be shown by TLOG of the cashier system

Default: TN is incremented automatically starting with "1".

*Example: "450023"* | Text | Mandatory

Default: autoincrement | | T | Total | Amount of total sum of collected means of payment

Can be omitted for nonfiscal transactions

Default: for fiscal transactions total of `TaxA[]` or `PosA[]` amounts respectively.

*Example: "123.00"* | Currency | Recommended

Default: `sum(PosA[].Amt)` | | TaxN | Net Tax Flag | Positions are Net Tax, tax is added at end of printout
Not supported in all countries!

*Example: "1"* | Boolean
0/1 | | | Opr | Operator ID | Operator-ID | Text |
[DE] Flag Germany
[FR] Flag France

*(Others: Recommended)* | | OprN | Operator Name | Operator-Name | Text | | | OprTIN | Operator Tax Identification | Operator Tax Identification

*Example: "79100590097"* | Text |
[HR] Flag Croatia
[SI] Flag Slovenia
| | DT | Document Type | Indicates a class of document, controls fiscal treatment of transaction; Viable for Fiscal, NF, NFS; not defined = fiscal

*Example: "Fiscal, ticket, invoice"* | Text |
[FR] Flag France

*(Others: Recommended)* | | DN | Document number | Sequential number;
Number range is of a specific document type DT, e.g. invoice number; additional to TN

*Example: "A23"* | Text | Mandatory | | DD | Document Delivery | Sets the delivery method for this transaction. (see [E-Invoicing](/e_invoicing/api/general))

*Examples: "DE", "IT", "IT-FatturaPA"* | Text | Mandatory for E-Invocing | | DDto | Document Delivery to | Unique Recipient of the E-Invoice. (see [E-Invoicing](/e_invoicing/api/general))

*Examples: "j.doe@efsta.eu", "VSRLPXY", "TMBLRT66T19A944Z"* | Text | Mandatory for E-Invocing | | NF | Nonfiscal Transaction Type | This attribute denominates nonfiscal transaction. These are registered in the receipt journal so the sequence of receipt numbers TN is gapless, but not added to the fiscal Grand Totals.

*Example: an additional receipt listing only ATM transaction details* | Text | | | NFS | Nonfiscal Signed | Equal to NF, but a fiscal signature is applied if required by law

*Examples: "Z", "TRAINING", "PAY", "LOGIN"/"LOGOUT", "PAYIN"/"PAYOUT"* | Text | Mandatory for non fiscal transactions | | ResumeFN | | Reference FN to resume a parked transaction. Set it to the FN returned by the most recent parking of that receipt - re-parking a resumed receipt issues a new FN. See [Parking of Receipts](/efr/api/country-specific#parking-of-receipts) | |
[SE] Flag Sweden
| | DO | Document Output | This field controls document output for non-fiscal documents/transactions

*Example: "noprint"* | Text |
[BE] Flag Belgium
[FR] Flag France
[HU] Flag Hungary
[IT] Flag Italy
[NO] Flag Norway
[PL] Flag Poland
[SE] Flag Sweden
[SK] Flag Slovakia
| | Void | Void Transaction | A transaction registered before is voided; usually amount fields (except Pos.Pri) are negative. Specify ESR.RD, RTL, RTT, RTN

*Example: "1"* | Boolean
0/1 | Mandatory for void | | Test | Test / Training Transaction | Training transactions are sent to the fiscal system marked as "test".

The Response `` element then contains a "\*\*\* TEST \*\*\*" info tag.

*Example: "1"* | Boolean
0/1 | Mandatory for test transactions | | RD | Reference Date | Needed in some countries in case of return or void as reference to original sale | Text |
[ES] Flag Spain
[HU] Flag Hungary
[PT] Flag Portugal
[SE] Flag Sweden
[SK] Flag Slovakia
| | RTL | Reference Transaction Location | Needed in some countries in case of return or void as reference to original sale | Text |
[DE] Flag Germany
[DK] Flag Denmark
| | RTT | Reference Transaction Terminal | Needed in some countries in case of return or void as reference to original sale | Text |
[DE] Flag Germany
[DK] Flag Denmark
| | RTN | Reference Transaction Number | Needed in some countries in case of return or void as reference to original sale | Text |
[DE] Flag Germany
[DK] Flag Denmark
| | RFiscal | | Reference Fiscal Code | |
[SE] Flag Sweden
| | RFN | Reference Fiscal Number | Needed in some countries in case of return, void or invoice payment as reference to the original document | Text | Mandatory for Business Cases "return" and "void"

[CZ] Flag Czechia
for `NFS="PAY"` | | TP | Transaction Point | Point of transaction (e.g. table number, department)
*Example: "Tisch 5"* | Text | | | Rsn | Reason | Reason text for exceptional transaction, position or modifier, e.g. reason for return of goods, reprint

*Example: "Erreur d'imprimante"* | Text |
[FR] Flag France
[HU] Flag Hungary
[NO] Flag Norway
[PT] Flag Portugal


Recommended for E-Invoicing:
[PL] Flag Poland
| | OprSSN | Operator Social Security Number | Example Values: Technician: 00000000097; Robot-User (Kiosk, Online-Orders, ...): 00000000029 | Text |
[BE] Flag Belgium
| | Dev | Device ID | ID of the input device
(f.e.: Mac address) - Used if the input device is not the POS itself. | Text |
[BE] Flag Belgium
[DE] Flag Germany
| | DueDate | Due Date | Due date of payment. Only to be specified if it differs from terms of payment. Example: "2024-08-15" | DateTime |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
[IT] Flag Italy
| | PaymentTerms | Payment Terms | Terms of the payment. Only to be specified if it differs from the terms of payment in the configuration. Example: "30 days net" | Text |
[DE] Flag Germany
| | [Delivery](#esr-delivery) | Delivery | Array of delivery elements | |
[BE] Flag Belgium
[DE] Flag Germany
| | OrderReference | Order Reference | The buyer's purchase order number (BT-13). Example: "PO-4711" | Text |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | SellerOrderReference | Seller Order Reference | The seller's own order number for the same deal (BT-14), e.g. a hotel's reservation confirmation number. Not a substitute for OrderReference or Ctm.BuyerReference. Example: "CONF-123456" | Text |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | ContractDocumentReference | Contract Reference | The contract the invoice refers to (BT-12). Example: "CT-2026-17" | Text |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | ProjectReference | Project Reference | The project the invoice refers to (BT-11). Example: "PRJ-2026-01" | Text |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | CZ_id_provoz | Business premise ID | Can also be specified in EFR profile | Text |
[CZ] Flag Czechia
| | FR_OperationType | Operation Type | "Vente" or "Remboursement"

Depending on ESR.T signum | Text |
[FR] Flag France
| | FR_Trainer | Trainer / Supervisor | Fiscal regulations require the ID of the trainer/supervisor to be stored with the training transaction | Text |
[FR] Flag France
| | HR_SpecNamj | Additional Invoice Information | | Text |
[HR] Flag Croatia
| | VatRegime | Merchant VAT Regime | Issuer's own VAT regime for this transaction; overrides the company configuration. Allowed values: `GENERAL`, `SIMPLE`, `REDE`

details see [Special VAT Regimes](/efr/ES/vat-regimes.md) | Text |
[ES] Flag Spain
| | SK_ParagonNumber | Paragon Number | Number of Paragon | Text | | | [Ctm](#esr-ctm) | Customer | Customer data
Mandatory for invoices | | For invoices | | [Head](#esr-head)
| Header | Running text head for printing/digital receipt. | | | | [PosA](#esrposa-pos) | Position
Array | Array of position lines ([Pos](#esrposa-pos), [Mod](#esrposa-mod), [Lin](#esrposa-lin)) | | Mandatory | | [PayA](#esr-pay)
| Payment Array | Array payment elements | | Mandatory | | [TaxA](#esr--tracfisz-tax) | Tax Array | Array tax elements
Auto-generated if `ESR.PosA` is available | | Mandatory | | Foot | Footer | Running text footer for printing/digital receipt. | | | #### (ESR.) Delivery [Return to ESR table](#delivery) | Attribute | Description | Mandatory | |-----------|----------------------------------------------------------------------------------------|:--------------------------------------:| | D | The date on which the supply of goods or services was delivered. Example: "2024-07-08" |
[DE] Flag Germany
[PL] Flag Poland
| | Adr | The address where the delivery was made. |
[BE] Flag Belgium
[DE] Flag Germany
| | Adr2 | The address extension where the delivery was made. |
[BE] Flag Belgium
[DE] Flag Germany
| | City | The city where the delivery was made. |
[BE] Flag Belgium
[DE] Flag Germany
| | Zip | The postcode where the delivery was made. |
[BE] Flag Belgium
[DE] Flag Germany
| | Ctry | The country code where the delivery was made. |
[BE] Flag Belgium
[DE] Flag Germany
| #### (ESR.) Ctm [Return to ESR table](#ctm) Ctm elements describe transaction-level metadata (timestamps, identifiers, operation type) and define the overall context of the fiscal document. | Attribute | Name | Description | Datatype | Mandatory | |-------------------|-----------------|------------------------------------------------------------------|----------|:-------------------------------------------:| | Nam | Name | Customer or company name | Text | All countries | | Nam2 | Name 2 | Customer or company name extension | Text | | | Adr | Address | Customer or company address within city | Text | All countries | | Adr2 | Address 2 | Address extension | Text | | | AdrNr | Address Number | Street number | Text | | | Zip | Postal Code | Zip according to national rules without country prefix | Text | All countries | | City | City | City name | Text | All countries | | Ctry | Country | Country ISO 3166 ALPHA-2 (e.g. "DE") | Text | | | TaxId | VAT Number | Customer or company VAT number including eventual country prefix | Text | For B2B | | BuyerReference | Buyer Reference | An identifier assigned by the buyer used for internal routing purposes. An invoice must have buyer reference or purchase order reference (BT-13). | |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | AccountingReference | Accounting Reference | The buyer's accounting reference for e-invoices (BT-19), e.g. a cost centre. Example: "KST-4711" | Text |
[BE] Flag Belgium
[DE] Flag Germany
[FR] Flag France
| | CN | Customer Number | Number of the customer | Text |
[DE] Flag Germany
| | Cat | Category | Category of the customer/type of recipient (e.g. "employee") | Text |
[DE] Flag Germany
| | FR_SIR | SIRET | For B2B invoices
see NF525 | Text |
[FR] Flag France
| | FR_SRN | SIREN | For B2B invoices
see NF525 | Text |
[FR] Flag France
| | FR_NAF | NAF/APE | For B2B invoices
see NF525 | Text |
[FR] Flag France
| | IT_CodiceLotteria | Lottery Code | Customers lottery code | Text |
[IT] Flag Italy
| #### (ESR.) Head [Return to ESR table](#head) | Attribute | Name | Description | Datatype | |-------------------|-----------------|------------------------------------------------------------------|----------| | Txt | Text | Text block for printing/digital receipt. | Text | #### (ESR.PosA) Pos [Return to PosA](#pos) Pos elements define point-of-sale–related information such as workstation, cashier, or store references. | Attribute| Name | Description | Datatype | Mandatory | |-----------------------|--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|------------------------|:-----------------------------------------------:| | PTY | Position Type | If not "Pos", e.g. "Mod"
accepted methods to set:

```"PosA":["\_":"Mod",…`
`"PosA":["PTY":"Mod",...`

*Examples: "Mod", "Dep", "Vou", "Adv", "Tip", "FoC"* | Text | Mandatory for some business cases | | PN | Position
Number | Modifier positions `PTY="Mod"` may refer to multiple positions, e.g. `PN="*"`
*Examples:* `PN="1"`, `PN="*"` | Text | Mandatory | | IN | Item
Number | Public article number
(GTIN, EAN, UPC) | Text |
[BE] Flag Belgium


*(Others: Recommended)* | | ID | Item
Identity | Serial or batch number | Text | | | SKU | Stock Keeping Unit | Article number | | | | | Dsc | Description | Usual denomination of goods or services | Text | Mandatory | | TaxG | Tax Group | Tax group
Usually tax groups are identified by letters or numerals. If an article besides VAT tax group is attributed other tax groups, these can be noted as an array (delimiter: space)

*Examples: "B", "B N"* | Text[] | Mandatory | | Amt | Position
Amount | Position amount
(Qty\*Pri)
*Example: "199.00"* | Currency | Mandatory | | Qty | Quantity | Quantity
`Qty="1"` may be omitted if `QtyU="pc"` or lump sums

default value used: `Math.sign(parseFloat(Amt))` | Decimal | Mandatory | | QtyU | Quantity
Unit | Quantity Unit
`QtyU="pc"` ("piece") may be omitted. | Text | | | Pri | Unit Price | Price per Unit
may be omitted if `Qty="1"` or `Qty="-1"` and `QtyU="pc"` | Currency | | | PosG | Position Group | Position Group
Category of position as required in some countries - details see [PosG](#position-groups---posposg) | Text |
[LT] Flag Lithuania
| | Note | Position Note | Individual position text
Replaces deprecated field `Pos.Info` | Text | | | Void | Position Void / Line Void | Void of position within same receipt | Boolean
0/1 | Mandatory for line void | | VouN | Voucher Number | Unique number of voucher | Text | | | Dev | Device | ID of the input device. Details of the input device can be specified in the [configuration data](/efr/api/rule-set#dev---input-devices). | Text |
[DE] Flag Germany

if applicable | | InH | inhouse | Inhouse consumption flag.

Default: "1" | Boolean
0/1 | | | DE_AGENTUR_ID | Agency ID | ID of the agency. Only for third-party-invoices (shop-in-shop). Details of the agency can be specified in the [configuration data](/efr/api/rule-set#de_agentur---agency).
*Example: "123"* | Integer |
[DE] Flag Germany

if applicable | | Cat | Category ID | ID of the Category | Text |
[DE] Flag Germany
[BE] Flag Belgium
[DK] Flag Denmark

[NO] Flag Norway
[SE] Flag Sweden

if applicable | | CatN | Category name | Name / description of the Category | Text |
[DE] Flag Germany
[BE] Flag Belgium
[DK] Flag Denmark

[NO] Flag Norway
[SE] Flag Sweden

if applicable | | RFN | Reference Fiscal Number | Needed in some countries in case of return or void as reference to original sale | Text |
[IT] Flag Italy
[SK] Flag Slovakia
| | RD* | Reference Date Time | Reference to the original transaction

If the whole transaction is voided, specify reference fields directly in ESR object. | | | | RTL* | Reference Transaction Location | Reference to the original transaction

If the whole transaction is voided, specify reference fields directly in ESR object. | | | | RTT* | Reference Transaction Terminal | Reference to the original transaction

If the whole transaction is voided, specify reference fields directly in ESR object. | | | | RTN* | Reference Transaction Number | Reference to the original transaction

If the whole transaction is voided, specify reference fields directly in ESR object. | | | | RPN* | Reference Position Number | Reference to the original transaction

If the whole transaction is voided, specify reference fields directly in ESR object. | | | | OrderLineReference | Order Line Reference | | |
[BE] Flag Belgium
[DE] Flag Germany
| | Rsn | Reason | Return reason for SAF-T export | Text |
[PT] Flag Portugal
| | Resume | | Parked positions which are resumed must be marked with Resume="1" | |
[SE] Flag Sweden
| | TS | | Timestamp of the article registration | |
[SE] Flag Sweden
| | SvcStartD | Service Period Start Date | Invoice line period start date: The date when the Invoice period for this Invoice line starts. Format ="YYYY-MM-DD"

*Example in E-Invoicing: if(pos\.SvcStartD \|\| pos\.SvcEndD) rv\.cac$InvoicePeriod = \{cbc$StartDate:\_Date(pos\.SvcStartD), cbc$EndDate:\_Date(pos\.SvcEndD)\}* | DateTime | For E-Invoicing | | SvcEndD | Service Period End Date | Invoice line period end date: The date when the Invoice period for this Invoice line ends. Format ="YYYY-MM-DD"

*Example in E-Invoicing: if(pos\.SvcStartD \|\| pos\.SvcEndD) rv\.cac$InvoicePeriod = \{cbc$StartDate:\_Date(pos\.SvcStartD), cbc$EndDate:\_Date(pos\.SvcEndD)\}* | DateTime | For E-Invoicing | | PT_TaxExemptionCode | Exemption
Code | If not specified in field TaxG, alternatively this field can be used
*Example: "M11"* | Text

M01-M99 |
[PT] Flag Portugal
| | PT_TaxExemptionReason | Exemption
Reason | For printing and SAF-T override tax table exemption description as in [PT] country guide
*Example: "Regime particular do tabaco"* | Text |
[PT] Flag Portugal
| | VatRegime | Merchant VAT Regime | Issuer's own VAT regime for this position; overrides the transaction and company level. Allowed values: `GENERAL`, `SIMPLE`, `REDE`

details see [Special VAT Regimes](/efr/ES/vat-regimes.md) | Text |
[ES] Flag Spain
| | SK_SellerIdType | Seller ID Type | Type of the Seller ID.

Allowed Values:
`NONE`
`IC_DPH`
`DIC` | Text |
[SK] Flag Slovakia
| | SK_SellerId | Seller ID | | Text |
[SK] Flag Slovakia
| | SK_SpecialRegulation | Special Regulation | A flag that specifies which "reason" tax allocation of 0, if the item is assigned | Text |
[SK] Flag Slovakia
| | SK_InvoiceNumber | Invoice Number | | Text |
[SK] Flag Slovakia
| *\*Reference attributes only for void/reversal or return-of-good positions (usually in combination with negative Qty)* #### (ESR.PosA.) Mod [Return to PosA](#pos) Mod elements represent document-level modifications (e.g., corrections, references, voids). | Attribute | Name | Description | Datatype | Mandatory | |-----------|-----------------------|---------------------------------------------------------------------------------------------|----------|:----------------------------------------------------:| | PN | Position
Number | Reference to `Pos.PN`

Default: previous position
(position discount)

"\*": all positions
(discount on subtotal/total)

Multiple position numbers may referred as range (from-to) or space delimited array

*Examples: "1", "1-3", "*", "1 2 7"* | Text | Mandatory

Default:
previous position | | Dsc | Description | Description to be printed | Text |
[DE] Flag Germany

*(Others: Recommended)* | | Prc | Percent | Rebate percentage for printing
*Example: "10", "10%"* | Text | | | Cat | Category | Discount code
To be used in reports
*Example: "DISC002"* | Text | | | Amt | Modifier
Amount | Amount
Negative: rebate or discount
Positive: markup
*Example: "\-50.00"* | Currency | Mandatory | #### (ESR.PosA.) Lin [Return to PosA](#pos) Lin elements describe individual receipt line items, including quantities, prices, product details, and line-level attributes. In Poland, Lin elements are only supported on non-fiscal elements, but not on fiscal printouts. | Attribute | Name | Description | Datatype | |-----------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|----------| | PN | Position
Number | The print line may be attributed to a position. Usually the print line is attributed to the last position or payment line.
*Example: "1"* | Integer | | Dsc | Description | Text in description column | Text | | LAmt | Line Amount | Text in amount column, can show subtotal amount | Text | #### (ESR.) Pay [Return to ESR table](#pay) Pay elements cover all payment-related information such as payment types, amounts, references, and mixed-payment scenarios. | Attribute | Name | Description | Datatype | Mandatory | |-------------|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------------| | Dsc | Description | Denomination of payment method
*Example: "Cash"* | Text | Yes | | Amt | Payment
Amount | Amount paid
*Example: "735.00"* | Currency | Yes | | UID | Unique
Identifier | Unique payment identifier
Electronic payment or document reference | Text |
[DK] Flag Denmark
| | PayG | Payment Group | Method/category of payment as required in some countries - details see country EFR Guide

For convenience use ESR standard codes (See [Payment Groups](/efr/api/rule-set#payment-groups---paypayg)) | Text | Yes | | CC | Foreign Currency Code | Foreign currency code ISO 4217 (3 characters)
*Example: "CHF"* | Text | | | FAmt | Foreign Amount | Amount of the foreign payment
*Example: "100.00"* | Currency | | | ConvR | Conversion Rate | Conversion rate from foreign currency to local currency used for foreign currency payments
*Example: "0.9350"*
| Decimal |
[PL] Flag Poland
| | InputMethod | Payment Input Method | Manual or automatic input of the payment amount `manual` or `auto` | |
[BE] Flag Belgium
| #### (ESR.) / (TraC.Fis.Z) Tax [Return to ESR table](#tax) :::note This ESR.Tax and the [TraC.Fis.Z.ZTax](#tracfisz--esr-ztax) elements are identical, however the [TraC.Z.ZTax](#tracz-ztax) element has a few distinctions. ::: Tax elements define the tax breakdown and the mapping of the transaction’s tax logic to fiscalized output. | Attribute | Name | Description | Datatype | Mandatory | |-----------|---------------|---------------------------------------------------|----------|-----------| | TaxG | Tax Group | Tax group
*Example: "A"* | Text | Mandatory | | Prc | Tax Percent | Tax percentage
*Examples: "21", "0"* | Decimal | Mandatory | | Net | Excluding Tax | Net (excl. Tax)
*Example: "165.29"* | Currency | | | TAmt | Tax Amount | Tax amount
*Example: "34.71"* | Currency | | | Amt | Including Tax | Gross amount (incl. Tax)
*Example: "200.00"* | Currency | Mandatory | | TTY | Tax Type | Marks a non-VAT tax element. For these, `Base` and `Amt` are set instead of `Net`/`TAmt`, and `Amt` carries the tax amount.

`"CT"` consumption tax ([HR](/efr/api/country-specific#consumption-tax))
`"SVAT"` equivalence surcharge ([ES](/efr/ES/vat-regimes.md)) | Text |
[HR] Flag Croatia
[ES] Flag Spain
| | Base | Tax Base | Base amount the tax is calculated on; only with `TTY`
*Example: "3.96"* | Currency |
[HR] Flag Croatia
[ES] Flag Spain
| :::info Country specific fiscal regulations may require addtional fields to be delivered. Refer to country specific documentation for details. ::: ### Response TraC (Tra Completion) Response for a fiscal sale transaction: | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|---------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | TraC
*([DE]: TraSC / TraUC / TraVC)* | Transaction Completion | Response to a Tra-command | | | | | SQ (attribute) | Sequence Number | SQ is incremented on each successful registration | Integer | | 1 | | [Result](#trac-result) | Registration Result | Result of a registration | | | | | [Fis](#trac-fis) | Fiscal Data | Fiscal Signature | | | | | [Z](#trac-z) | Z Data | End of day data of fiscal device | |
[PL] Flag Poland
| | #### (TraC.) Result [Return to TraC table](#res) | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | RC (attribute) | Result Code | Code for program control

OK: registered
NO: not registered (fixable)
BAD: not registered (termination) | OK,
BAD,
NO | | "OK" | | ErrorCode | Error Code | Error Code according to list of error constants. In combination with `RC="OK"` this is to be understood as a warning (e.g. "#DUPLICATE" when restarting a registration) | Text | | "#OFFLINE" | | UserMessage | User Message | Information for the operator
(local language)

Must be displayed by the foreground application if present! | Text | | "Systémem EET offline" | | Warning | Debug
Message | Error Debug information (english) | Text[] | | | :::note - Main program flow is controlled by ResultCode RC - `` may contain additional information
- `` elements provide debugging information for interface developers respectively cashier support. These serve for informational purposes only, success of registration of a transaction is expressed within ResultCode RC only. ::: #### (TraC.) Fis [Return to TraC table](#fis) | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | D | Date Time | Date and time of fiscal device | DateTime |
[IT] Flag Italy
[PL] Flag Poland
[SK] Flag Slovakia
| | | FN | Fiscal Number | Fiscal number created by fiscal device | Text |
[ES] Flag Spain
[IT] Flag Italy
[PL] Flag Poland
[SK] Flag Slovakia
| | | DN | Document Number | Receipt number created by fiscal device | Integer |
[SK] Flag Slovakia
| | | [Z](#tracfis-z) | Z Data | End of day data of fiscal device | |
[BE] Flag Belgium
| | | ZI | Z-Index | Index of current Z-report of fiscal device | Integer |
[IT] Flag Italy
[PL] Flag Poland
| | | ID | Device Serial | Serial number of fiscal device | Text |
[IT] Flag Italy
[PL] Flag Poland
| | | OKP | Verification Code | | Text |
[SK] Flag Slovakia
| | | Type | Transaction Type | Type of the transaction | Text |
[DE] Flag Germany
| | | TID | Transaction ID | ID of a transaction coming from TSE | Integer |
[DE] Flag Germany
| | | Code | QR Code Data | Data for a possible QR code | Text |
[AT] Flag Austria
[DE] Flag Germany
[ES] Flag Spain
| | | Link | Link | efsta link for printing instead of QR code | Text |
[AT] Flag Austria
| | | Payload | | Signature Payload | Text |
[FR] Flag France
| | | Signature | | Signature | Text | | | | ES_TBAI_Code | Identificador TBAI | TicketBAI system Id for that specific transaction | String |
[ES] Flag Spain
| "`TBAI-46886417C-310725-2ESuO3BEl0l1U-222`" | | [Tag](#tracfis-tag) | Fiscal Tag | Fiscal text
To be printed on the sales slip according to fiscal regulation | | | | #### (TraC.Fis.) Tag [Return to Fis table](#tag) | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | Name | Field Name | Field name for computation in the foreground application (for optional saving by the cashier application) | Text | | "Sign" | | Value | Field Value | Field Value | Text | | "987a6be5-6af5-44f3-b4fc-987654321000-03" | | Label | Field Label | Denomination of the Field on the print-out
(in local language, may be empty) | Text | | "FIK" | #### (TraC.Fis.) Z [Return to Fis table](#fisz) :::note This section is about TraC.Fis.Z - for information on TraC.Z, go to [TraC.Z](#trac-z). ::: | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | ZI | Z Index | Report Number | Integer |
[BE] Flag Belgium
| | | T | Z total | Total amount for normal sales transactions | Currency |
[BE] Flag Belgium
| | | DrawerOpenCnt | Drawer Open Count | Total count of drawer openings outside of a sale | Integer |
[BE] Flag Belgium
| | | CreditAmt | Credit Amount | Total amount of returns and voids | Currency |
[BE] Flag Belgium
| | | CreditCnt | Credit Count | Total count of returns and voids | Integer |
[BE] Flag Belgium
| | | DiscountCnt | Discount Count | Total discount count | Integer |
[BE] Flag Belgium
| | | DiscountAmt | Discount Amount | Total discount amount | Currency |
[BE] Flag Belgium
| | | SurchargeCnt | Surcharge Count | Total surcharge count | Integer |
[BE] Flag Belgium
| | | SurchargeAmt | Surcharge Amount | Total surcharge amount | Currency |
[BE] Flag Belgium
| | | ZPeriod | Z Period | Booking date of the report | Date |
[BE] Flag Belgium
| | | TSDayOpen | Timestamp Day Open | Timestamp of the days opening | Datetime |
[BE] Flag Belgium
| | | TSDayClose | Timestamp Day Close | Timestamp of the days closing | Datetime | | | | [ZFisUnitA](#tracfisz-zfisunit) | Z Fis Unit Array | Array of FDM devices used in the reporting period | *ZFisUnit* | | | | [ZFisTraA](#tracfisz-zfistra) | Z Fis Transaction Array | Array of totals per transaction type (Label) | *ZFisTra* | | | | [ZCatA](#tracfisz-zcat) | Z Category Array | Array of totals per category | *ZCat* | | | | [ZPayA](#tracfisz-zpay) | Z Payment Array | Array of totals amounts per payment method | *ZPay* | | | | [ZCreditRsnA](#tracfisz-zcreditrsn) | Z Credit Reason Array | Array of totals per negative quantity reason | *ZCreditRsn* | | | | ZTaxA | Z Tax Array | Tax totals per tax group. | *ZTax* | | | | [ZOprA](#tracfisz-zopr) | Z Operator Array | Array of Operator statistics for the reporting period | *ZOpr* |
[BE] Flag Belgium
| | #### (TraC.Fis.Z.) ZFisUnit [Return to Fis.Z table](#unit) | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | ID | Identification | FDM ID | Text |
[BE] Flag Belgium
| "FDM12345678" | | TSFirst | Timestamp First | Timestamp of the first registered event | Datetime |
[BE] Flag Belgium
| | | TSLast | Timestamp Last | Timestamp of the last registered event | Datetime |
[BE] Flag Belgium
| | | FirstNum | First Number | Total counter snapshot at the first registered event | Integer |
[BE] Flag Belgium
| | | LastNum | Last Number | Total counter snapshot at the last registered event | Integer |
[BE] Flag Belgium
| | #### (TraC.Fis.Z.) ZFisTra [Return to Fis.Z table](#tra) | Element | Name | Description | Datatype |     Countries     | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Dsc | Description | Transaction Label (Example: 'N' for normal) | Text |
[BE] Flag Belgium
| | Cnt | Count | Transaction count | Integer |
[BE] Flag Belgium
| | Amt | Amount | Total amount for this transaction type | Currency |
[BE] Flag Belgium
| #### (TraC.Fis.Z.) ZCat [Return to Fis.Z table](#cat) | Element | Name | Description | Datatype |     Countries     | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Cat | Category Number | ID of the Category | Text |
[BE] Flag Belgium
| | CatN | Category Name | Name / description of the Category | Text |
[BE] Flag Belgium
| | Net | Net Amount | Total Net Amount (excl. Tax) | Currency |
[BE] Flag Belgium
| | TAmt | Tax Amount | Total tax amount | Currency |
[BE] Flag Belgium
| | Amt | Amount | Total amount | Currency |
[BE] Flag Belgium
| #### (TraC.Fis.Z.) ZPay [Return to Fis.Z table](#zpay) | Element | Name | Description | Datatype |     Countries     | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Dsc | Description | Payment type | Text |
[BE] Flag Belgium
| | Amt | Amount | Total for amount | Currency |
[BE] Flag Belgium
| #### (TraC.Fis.Z.) ZCreditRsn [Return to Fis.Z table](#cdtrsn) | Element | Name | Description | Datatype |     Countries     | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Amt | Amount | Total amount | Currency |
[BE] Flag Belgium
| | Cnt | Count | | Integer |
[BE] Flag Belgium
| | Rsn | Reason | | Text |
[BE] Flag Belgium
| | TraCnt | Transaction Count | | Text |
[BE] Flag Belgium
| #### (TraC.Fis.Z) / (ESR.) ZTax [Return to Fis.Z table](#fisz-tax) :::note This TraC.Fis.Z.ZTax and the ESR.Tax elements are identical, however the [TraC.Z.ZTax](#tracz-ztax) element has a few distinctions. For more information on this, go to [(ESR.) Tax](#esr--tracfisz-tax). ::: #### (TraC.Fis.Z.) ZOpr [Return to Fis.Z table](#opr) | Element | Name | Description | Datatype |     Countries     | |---------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Amt | Amount | Total amount for transactions of type normal | Currency |
[BE] Flag Belgium
| | OprSSN | Operator Social Security Number | Example Values: Technician: 00000000097; Robot-User (Kiosk, Online-Orders, ...): 00000000029 | Text |
[BE] Flag Belgium
| | TSFirst | Timestmp First | Timestamp of the first transaction | Datetime |
[BE] Flag Belgium
| | TSLast | Timestamp Last | Timestamp of the last transaction | Datetime |
[BE] Flag Belgium
| | [ZAuditA](#tracfiszzopr-zaudit) | Z Audit Array | Array of clockin and clockout events for this cashier | *ZAudit* |
[BE] Flag Belgium
| #### (TraC.Fis.Z.ZOpr) ZAudit [Return to ZOpr table](#tracfisz-zopr) | Element | Name | Description | Datatype |     Countries     | |-------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:| | Code | Event Code | CLOCKIN or CLOCKOUT | Text |
[BE] Flag Belgium
| | TS | Timestamp | Timestamp of the event | Datetime |
[BE] Flag Belgium
| #### (TraC.) Z [Return to TraC table](#z) :::note This section is about TraC.Z - for information on TraC.Fis.Z, go to [TraC.Fis.Z](#tracfis-z). ::: | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | T | Z Total | End of day total | Currency |
[IT] Flag Italy
[PL] Flag Poland
| | | CAmt | Credit Amount | End of day return / void amount | Currency |
[IT] Flag Italy
| | | LastD | Date Time | Time of last Z-report | DateTime |
[IT] Flag Italy
| | | LastSQ | Last Sequence Number | Sequence number of last Z-report | Integer | | | | [ZTax](#tracz-ztax) | Z Tax Data | End of Day Tax Data of fiscal device | |
[IT] Flag Italy
[PL] Flag Poland
| | #### (TraC.Z.) ZTax [Return to Z table](#ztax) :::note This section is about TraC.Z.ZTax - for information on ESR.Tax / TraC.Fis.Z.ZTax, go to [ESR.Tax / TraC.Fis.Z.ZTax](#esr--tracfisz-tax). ::: | Element | Name | Description | Datatype |     Countries     | Example | |-------------------------------|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------------|:-------------------------:|---------------------------------------------| | TaxG | Tax Group | Tax Group | Text |
[IT] Flag Italy
[PL] Flag Poland
| | | TaxI | Tax Index | Tax Index of fiscal device | Integer |
[IT] Flag Italy
[PL] Flag Poland
| | | Prc | Percent | Percentage of tax group / tax index | Decimal |
[IT] Flag Italy
[PL] Flag Poland
| | | TAmt | Tax Amount | Tax Amount | Currency |
[IT] Flag Italy
[PL] Flag Poland
| | | Amt | Amount | Total amount of tax group / tax index | Currency |
[IT] Flag Italy
[PL] Flag Poland
| | ## Payment Groups - Pay.PayG In many countries the type of payment has to be specified per payment line for the fiscal printer or subsequent export. You may always use the national coding rules as given in the EFR Country Guide documentation, but you can also use the following efsta constants for all countries, which then are translated accordingly: | efsta PayG | \+\\- | Description | Examples, local naming | |------------|-------|------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------| | cash | + | Payment in local currency (coins, notes) | Bar | | change | \- | Change money in case of overpayment, usually negative
e.g. total € 9.00: cash € 10.00, change € -1.00 | Rückgeld | | refund | \- | Money paid back on return of goods, usually negative | | | atm | + | Cash withdrawal | | | foreign | + | Foreign currency, Pay.Amt is local currency, also specify
\- currency code Pay.CC and

\- foreign currency amount Pay.FAmt | CHF | | debitcard | + | Electronic bank card payment, also specify
\- unique transfer ID Pay.UID | EFT, EC, Giro, Maestro, ATM card | | mobile | + | Mobile phone app
\- unique transfer ID Pay.UID | | | creditcard | + | Electronic credit card payment, also specify
\- unique transfer ID Pay.UID | Visa, Master, American, Diners, JCB | | open | | Open item, e.g. commercial invoice/bill | Pos.OpI | | creditnote | | Issue or redemption of a credit note | | | loyalty | + | Fidelity points | coupon | | title | + | Compensation title (digital or paper),

e.g. meal voucher | Sodexo | | check | + | Bank check | check | | rounding | | Automatic rounding applied for cash payment | | > \+ = payment
> \- = return ## Tax Group Assignment - TaxG Depending on the capabilities of the sender program there are different methods specifying tax groups within the ESR structure. :::tip We recommand to use the method 1 or method 3 with the predefined tax groups from efsta. Otherwise, various 0% tax rates cannot be represented and the default 0% tax group is used instead. ::: 1. Set field `PosA/Pos/@TaxG` according to the tax group definition in the country EFR Guide (e.g. "A" to "E"), omit TaxA array; for each position the predefined tax rate is taken, the `TaxA/Tax` elements are computed automatically, values `TaxA/Tax/@Amt` are added to the fiscal turnover.
ESR Example: ``` ``` 2. Load tax rate in `PosA/Pos/TaxG`, e.g. `TaxG="20%"`, omit TaxA; array TaxA is computed automatically, Tax Group is matched over tax rate percentage. With this method a **percentage mismatch** may occur in fiscal countries requiring exact tax group reference (e.g. [AT]), because for example `PosA/Pos/@TaxG="21%"` is not referring to predefined "20%".
ESR Example: ``` ``` 3. Set position `PosA/Pos/@TaxG` according to `TaxA/Tax/@TaxG`, specify tax rate in `TaxA/Tax/@Prc`; In this case the field value in TaxG serves only as link between both elements, so the naming can be selected freely. In fiscal countries with exact tax group reference (e.g. [AT]) the matching is done upon `TaxA/Tax/@Prc`. The fiscal turnover is determined by `TaxA/Tax/@Amt`.
ESR Example: ``` ``` ## Position Groups - Pos.PosG In some countries, certain groups/categories of positions have to be specified per position line for the fiscal printer or subsequent export. You can use the following efsta constants for all countries, which then are translated accordingly: | efsta PosG | Description | Countries | |------------|----------------------------|--------------| | alcohol | Alcoholic items |
[LT] Flag Lithuania
| | gasoline | Gasoline |
[LT] Flag Lithuania
| ## Automatic Value Assignment D and TN If not provided by the cash register application, Date D (system time) and receipt number TN (serial number, on change of year beginning with 1) are generated automatically by the EFR and returned within the response. Request: ```xml ``` Response ```xml ... ``` ## ESR Validation Rules - Total of position elements `PosA/\*/@Amt` equals transaction total `ESR/@T` - Total of payment elements `PayA/\*/@Amt` equals transaction total - Total of tax elements `TaxA/\*/@Amt` (including tax) equals transaction total - For each tax element `TaxA/Tax`: `@Net + @TAmt = @Amt` - Amount in `PosA/Lin/@LAmt` is used for transaction display only (e.g. subtotal), not regarded in any computation - In position elements `PosA/\*` fields quantity `PosA/\*/@Qty` and price per piece `PosA/\*/@Pri` may be skipped in case of `PosA/\*/@Qty=1` - Assign position modifiers `PosA/Mod` (discount, rebate, addition) to their relevant position(s) `PosA/\*/@PN` using `@PN`, internally aliquot modification - Position elements `PosA/\*/@Amt` per tax group `PosA/\*/@TaxG` modified by `PosA/Mod/@Amt` assigned equal tax element amount `TaxA/Tax/@Amt` per tax group `TaxA/Tax/@TaxG` ## Numbering of Documents Bookkeeping systems always require an ascending number for each document issued (e.g. receipt / ticket / invoice), being unique at least within the year of creation. #### Transaction Number TN Usually, the POS system identifies fiscal and nonfiscal transactions with a Transaction Number TN assigned incrementally (e.g. per year or within a recurring number range of 00001-99999). Assuming that the company is using more than one cash register, transaction numbers are emitted per POS (Transaction Terminal TT), if multiple business premises (stores, locations) are driven also per Transaction Location TL. The full unique document identifier is then TL/TT/TN, e.g. "001/1/1234". If TN is omitted in the "Tra" request, EFR automatically assigns a number incrementally. #### Fiscal Number FN Fiscal Number FN is allocated for each fiscal (=sales) transaction according to country specific fiscal rules, so the format of the field varies. It is the main denominator / fiscal ID which it is handled by the EFR to ensure gapless and constant chaining of receipts. FN has to be printed on the document and stored on POS side with each transaction, although it is not possible to be sent from the POS system directly. :::tip[Good to know] In some countries, TL/TT/TN is used as unique transaction identifier, no separate FN exists (e.g. in [AT]). For the format used in Sweden see [Fiscal Number (FN)](/efr/SE/fiscal#fiscal-number-fn). ::: #### Reference to a Document The number assigned to a transaction is relevant on return of goods or void transactions. Here, the original transaction has to be referred to by specifying RTL/RTT/RTN or RFN to avoid double return or void. #### Internal SQ SQ is a SeQuel number used internally by EFR and efsta cloud for synchronization. A strictly ascending number is assigned to each data record in journal files `.../\*.jou`. One journal file contains 1000 records and is named after the number range it contains (SQ 1000-1999; e.g. "0001.jou"). SQ is independent of TN and FN, and as it is for internal use only, there is no need to print it or store it at POS side. ## Directory Structure /EFR By default EFR data is kept in the following directories: ##### Windows `C:\\ProgramData\\EFR` ##### Linux `/home/efr` :::note A different path can be choosen on EFR program startup:
`C:\\ProgramData\\EFR> node app/app –RootPath D:/EFR` ::: :::tip[Good to know] Directories are created on demand. ::: | Directory | Content | |----------------|-------------------------------------------------------------------------------------------| | /app | Application folder | | /cer | Certificate storage:
Certificates of smart cards, Company public key (for encryption) | | /gbl | Global configuration:
profile.cfg, regmain.xml | | /log | Process logging | | /rn | Main directory for clients | | /rn/def | Register Number RN def (default) | | /rn/def/cfg | RN configuration | | /rn/def/dat | RN totals | | /rn/def/jou | Journal storage
('Transaction Journal', [AT] 'Datenerfassungsprotokoll') | | /rn/def/log | Transaction logging in case of error | | /rn/def/retry | [CZ, HR, SI] optional directory for offline transactions waiting for retry | | /req | Optional request directory for File Interface - FileWatch (p. ) | | /res | Optional response directory | | /rn/def/report |
[BE] Flag Belgium
X and Z Report files | ## Storage Management ### Actions on Software Installation / Uninstall On installation the basic directory structure is created on default RootPath, subdirectories are created when required. If EFR is uninstalled the software is removed, but data folders are kept! Legal relevant data may not be discarded automatically, please delete manually after having assured its backup. ### Storage Transaction Capacity By default an EFR is allowed to keep 1000 MB of data on disk, this value can be modified setting parameter DiskQuota in `/profile`. Space consumption is checked once per hour and in case of overrun old .log files are deleted, transaction journal files .jou are gzipped to .jou.gz, old .jou.gz are deleted. Files modified within the last 3 months are always kept. Therefore the EFR should run online with cloud backup or in offline mode a periodic backup using `/backup` request or via file system has to be established. The number of transactions which can be kept locally mainly depends on the configuration of the DiskQuota and the average length of one transaction. Here's a short calculation using typical values: > **DiskQuota:** 1000 MB
> **Application space:** approx. 100 MB
> **Remainder for transaction data:** 900 MB
> **Mean transaction length:** assumed 2 KB
> **Capacity:** 450000 transactions
:::tip[Good to know] Transaction journal files (.jou) are zipped automatically (to .jou.gz) as soon as the threshold of 80% DiskQuota is reached. Capacity with compressed files: 2000000 transactions ::: ## EFR Versioning EFR is intended to be under permanent development as a result of adapting to national regulations and implementation of new countries and functions. Development is performed in an agile, common multi country environment, resulting in new minor versions per sprint, typically every 1-2 months. In the meantime, "hotfixes" may be released to respond to urgent demands. #### Version Numbering Scheme: *EFR version 2.3.4*
Means major: 2, minor: 3, hotfix: 4 | Part | e.g. | Description | |-------------------------|------|----------------------------------------------------------------------------------------------------------------------------------------------------| | Major | 2 | - A new major version may introduce changes to the program API. Although broad interface compatibility is intended, new functions or legal requirements may result in minor changes. Refer to the [country-specific changelogs](https://public.efsta.net/efr/) for details.
**- Testing on software partner's side is required.** | | Minor | 3 | - A new sprint contains bugfixes and new features.
**- General testing is recommended.** | | Hotfix
(optional) | 4 | - Like a minor version, a hotfix contains bugfixes and may also include legally required new features. It is released on demand for one or more countries.
**- General testing is recommended.** | | Appendix
(optional) | B | - Used for preview versions. | Because all country versions of EFR use common base modules, EFR version numbering is performed independently of country modules. Since new versions may not be of interest for all countries, on the download page public.efsta.net the different latest versions are listed for each country individually. A complete history of relevant changes to the program can be found in file CHANGELOG.md in EFR.zip (or can be downloaded from http://localhost:5618/changelog ). --- source: https://docs.dev.efsta.eu/efr --- # efsta System The efsta system serves as middleware to fulfill country specific fiscal requirements for POS systems using a unified interface. The cash register application submits standardized transaction data to the EFR (Electronic Fiscal Register), which handles the data according to the country specific fiscal regulations. ## Two ways to deploy ## Key Features - Automated reporting/communication with fiscal authorities - Fiscal signature/response - Offline fiscal buffering and archiving - Encrypting and chaining transaction data to prevent manipulation (audit-proof) - Controlling and communicating with different cloud and hardware based fiscal devices - Gateway to the efsta Cloud for archiving and exports - Maintenance, updates and administration via the efsta Portal for managing your efsta system and fiscal compliance ## Add-on Features - Digital Receipt (efsta Simple and Smart Bill) - E-invoicing compliance (B2B and/or B2G): currently in Italy and Germany - 3rd party integrations: DATEV (DE) ## Available Countries | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **AT** | **BE** | **CZ** | **DE** | **DK** | **ES** | **FR** | **HR** | **HU** | |  **Austria**   |  **Belgium**  |   **Czechia**   | **Germany** | **Denmark** |   **Spain**    |  **France**   |  **Croatia**  | **Hungary** | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **IT** | **LT** | **NO** | **PL** | **PT** | **SE** | **SI** | **SK** | |    **Italy**      | **Lithuania** |  **Norway**  |  **Poland**   | **Portugal**   | **Sweden** | **Slovenia**  | **Slovakia** | --- source: https://docs.dev.efsta.eu/efr/architecture --- # EFR Architecture ## Introduction The efsta middleware electronic fiscal register (EFR) is a software to fulfill the country specific requirements for fiscalization. The software receives (transaction) data via REST interface from any upstreaming system (POS, ERP, PMS). As those upstreaming systems have various architectures, EFR can be adjusted to the customer-specific architecture. After receiving a transaction, it gets forwarded to a fiscal device – in those countries where it is required – or processed internally. efsta also provides a cloud archive – called efsta Cloud – where the fiscalized data gets stored encrypted after the fiscalization process is done. ## Architecture Types There are four general types of installations: - **Local EFR** runs directly on a POS with tight hardware coupling - **Local Server EFR** centralizes fiscalization for multiple POS systems within a store - **Provider Cloud EFR** scales this model to many customers in a partner-managed cloud - **efsta Cloud EFR** removes all operational effort by offering a fully efsta-managed, cloud-native fiscalization service
| Type | Hosted by | Offline capable | Fiscal hardware | Installation guide | |---------------------|-----------|-----------------|-----------------|--------------------| | Local EFR
Local Server EFR | Customer | ✅ Yes | ✅ Yes | Local: [Getting started](/efr/getting-started) | | Provider Cloud EFR | Partner | ⚠️ Depends | ❌ No | Local: [Getting started](/efr/getting-started) | | **efsta Cloud EFR** | **efsta** | ❌ No | ❌ No | [Cloud EFR guide](/efr/cloud) |
**Local installation** > localhost:5618/register ![Local Installation](./img/local_generic.png) For “classical” local installations EFR can be installed locally. By using this EFR architecture there is a 1:1 communication between upstreaming software and EFR. EFR creates a main client which stores all data to provide it for the exports. In case of an outage, it will affect both systems at the same time (for example hard disc crashes,…). This architecture is recommended for countries with fiscal hardware devices like fiscal printers, hardware signature sources. To use this architecture, connect EFR with the efsta cloud by using the Badge (unique identifier of a company establish cloud communication to the efsta cloud for using the monitoring and the archive) of the company level, provided in the efsta portal.
**Local Server Installation** > ***[local IP]***:5618/register ![Server Installation](./img/server_generic.png) In case of stores that have many upstreaming systems within one store and want to centralize fiscalization on a centralized server, EFR can be installed on a store server. One EFR then handles all transactions from that legal entity (tax payer). As each upstreaming system identifies with its own IDs (Location ID and Terminal ID) data will be stored and generated in the right export/journal. This will be shown in the EFR, as sub clients will be created for each new combination of the mentioned IDs. The partner is responsible to enable (network) communication between the systems and to protect the system(s). Recommended signature sources are cloud signature devices or other servers for signing the fiscal data. Fiscal hardware devices are not recommended for such an architecture.
**Provider Cloud Installation** > ***[public IP]***:5618/register ![Provider Cloud Installation](./img/providerCloud_generic.png) Cloud upstreaming systems can use EFR hosted in the cloud. This can be any cloud for example Microsoft Azure, AWS Cloud or any other cloud. As the cloud is provided/hosted by the partner the security –, updating –, Network –, Firewall–,… -topics in the partner’s responsibility. As cloud systems are centralized systems that handle different taxpayers on one installation, each transaction has an additional identifier which is the tax ID/VAT ID or Steuernummer or GLN. Each upstreaming system then gets a new client within EFR to provide the client-specific exports. The clients will then be identified with the combination of TaxId, TL and TT (Vat ID, location ID and till ID). Each client needs to have the adequate signature source in countries where it is mandatory.
**efsta Cloud Installation** ![efsta Cloud Installation](./img/efstaCloud_generic.png) efsta provides a product where EFR is hosted on a cloud maintained by efsta. The functionality is comparable with the “provider Cloud Installation”, the only difference is that efsta hosts the EFR. The partner will then send data to specific endpoints by identifying with API key and API secret to get the OAuth token. This product is exclusively available for upstreaming systems that are fully in the cloud and no fiscal hardware is needed (for example fiscal printers, hardware signature devices,…). There is no user interface for the customers to configure as efsta will provide all settings. Exports can be downloaded from the efsta Portal or by sending HTTP requests to the cloud EFR. :::info Product only available on request. ::: For full setup and authentication details, see the [**Cloud EFR guide**](/efr/cloud)
## EFR Modes Furthermore, there are three different modes the EFR can be run in, compatible with all previously mentioned architecture types: ### Single POS Single POS is the standard mode for a **single cash register**. It is suitable for individual POS systems without the need to manage multiple registers or companies. ![Single-POS-mode](./img/singlePOS.png) ### Multi POS With multi POS, one installed EFR manages **multiple cash registers** from the **same company**. It is typically used in a back-office server setup to handle up to 100 POS installations per company. :::note If more than 100 POS installations are needed, additional EFRs can be created. ::: ![Multi-POS-mode](./img/multiPOS.png) ### Multi Company Using Multi Company, one installed EFR manages **multiple companies, locations, and cash registers**, which is only possible when cloud-hosting the EFR. To use this mode, please request consultation with a partner manager for setup. :::note Multi Company mode is not available for certain features like digital receipt management, which is currently only for Single POS and Multi POS. ::: ![Multi-company-mode](./img/multiCOMP.png) --- source: https://docs.dev.efsta.eu/efr/cloud --- # Cloud EFR **Cloud EFR** is a fully efsta-managed fiscalisation service where EFR runs in efsta's cloud infrastructure. There is no software to install or maintain on your side — efsta handles all configuration, updates, scaling, and operations. :::info Product only available on request. To get access, contact your efsta partner manager or write to [ticket@efsta.eu](mailto:ticket@efsta.eu). ::: ## What is Cloud EFR? - EFR hosted and operated entirely by efsta - Accessible via HTTPS API using OAuth Bearer token authentication - Same transaction request format as a locally installed EFR - No local web UI at `localhost:5618` - No fiscal hardware (printers, hardware signature devices) required or supported - efsta handles the initial connection of the EFR to the company or organisation via badge; all other settings must be configured by the customer either through the API or the efsta Portal ## When to use it :::warning Cloud EFR is **exclusively** for POS systems that are fully cloud-based and have **no offline capability**. If your POS system needs to work without an internet connection, use [Local EFR (Getting Started)](/efr/getting-started) instead. ::: ## Ordering Cloud EFRs are created by efsta. To order one: 1. Contact your efsta partner manager, or email [ticket@efsta.eu](mailto:ticket@efsta.eu) 2. efsta creates the Cloud EFR and provides your **API Key** and **API Secret** 3. You can find them in your company's properties in the efsta Portal ## Authentication Cloud EFR uses OAuth 2.0 client credentials. Implement the following flow in your cloud POS: 1. Authorize with ApiKey and ApiSecret to get access token and refresh token. 2. Access- and refresh tokens should be temporarily stored on the cloud POS system. 3. With the access token, requests can be sent to the cloud EFR. 4. If the access token has expired (HTTP 401 `{ "error": "invalid_token", "error_description": "Invalid token: access token is invalid" }`), the cloud POS can use its refresh token to request new access- and refresh tokens, which are temporarily saved once more. You can also check before each request whether the token has already expired. 5. If the refresh token has expired as well (same HTTP 401 response), access- and refresh tokens must be re-requested with ApiKey and ApiSecret. :::info - Token Validity - Access token: 1 hour - Refresh token: 7 days - These expiry dates may still be up to change. :::
**Getting tokens** Access tokens are scoped to the `TaxId`, `TL`, and `TT` used during issuance. ```http POST /auth/token [Headers] Authorization: Basic base64(ApiKey:ApiSecret) Content-Type: application/x-www-form-urlencoded [Body] grant_type=client_credentials TaxId=... TL=... TT=... ``` ```http POST /auth/token [Headers] Content-Type: application/x-www-form-urlencoded [Body] grant_type=client_credentials client_id=ApiKey client_secret=ApiSecret TaxId=... TL=... TT=... ``` The authentication mechanism for multi-company Cloud EFRs uses credentials at the organizational level. This means one credential set grants fiscalization access for all companies managed within that instance. :::warning These tokens should be treated as **secrets** and kept **secured**! ::: We strongly recommend that the partner implements the following measures in their integrated solution: - **Restrict End-User Permissions:**
The ability for a POS end-user to modify the Tax ID within the POS application should be disabled. This prevents unauthorized or accidental fiscalization of receipts for an incorrect company. - **Secure Credential Storage:**
API credentials must be stored securely. The recommended best practice is to manage them in a secure backend environment. If credentials must be stored on the client-side POS terminal, they must be robustly encrypted both at rest and during transport.
**Refreshing tokens** Refresh tokens are scoped to the same `TaxId`, `TL`, and `TT` as the access tokens issued with them. ```http POST /auth/token [Headers] Content-Type: application/x-www-form-urlencoded [Body] client_id=ApiKey grant_type=refresh_token refresh_token=tGz... TaxId=... TL=... TT=... ```
**Token response format** The response format is identical whether you're requesting tokens via Basic Auth, body credentials, or using a refresh token. ```json { "access_token": "eyJ0...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "eyJ0...", "access_token_expires": 1753865826, "access_token_expires_at": 1753865826, "refresh_token_expires": 1755071826, "refresh_token_expires_at": 1755071826, "api_key": "1124_Test..." } ``` | Field | Type | Description | |----------------------------|----------|---| | `access_token` | `string` | Bearer token used for authenticating API requests. | | `token_type` | `string` | Token type (always `"Bearer"`). | | `expires_in` | `number` | Time in seconds until the access token expires. | | `refresh_token` | `string` | Token that can be used to obtain a new access token. | | `access_token_expires` | `number` | Expiry timestamp of the access token (Unix time). | | `access_token_expires_at` | `number` | Same as above, included for compatibility. | | `refresh_token_expires` | `number` | Expiry timestamp of the refresh token. | | `refresh_token_expires_at` | `number` | Same as above. | | `api_key` | `string` | Echo of the `ApiKey` used. |
## Making requests Send all EFR requests with the access token in the `Authorization` header. **Request Header:** | Name | Value | |---|---| | `Authorization` | `Bearer [ACCESS_TOKEN]` | The request body is identical to a locally installed EFR. See the [API reference](/efr/api) for full documentation.
**Example: `/state` endpoint** API Reference: [EFR State](/efr/api#efr-state) ```http GET /state [Headers] Authorization: Bearer [ACCESS_TOKEN] ```
**Example: `/register` endpoint** API Reference: [Cashier Log In](/efr/api/business-cases#cashier-log-in) ```http POST /register [Headers] Authorization: Bearer [ACCESS_TOKEN] [Body] { "Tra": { "ESR": { "D": "2024-06-01T08:30:15", "TaxId": "DE123456789" "TL": "001", "TT": "1", "TN": "35", "NFS": "LOGIN", "Opr": "101", "OprN": "Mario Rossi", "OprTIN": "xxx" } } } ```
## Capacity & modes - For more than 100 POS installations, your partner manager can create additional Cloud EFRs - These share the same API credentials - POS installations are distributed evenly - MultiCompany mode requires setup consultation with a partner manager - Digital receipt management is not available in MultiCompany mode
| Mode | POS limit per EFR | Use case | |---|---|---| | MultiPOS (default) | Up to 100 | One company, multiple cloud POS instances | | MultiCompany | Up to 100 | One EFR handles multiple companies and locations | ## Exports Fiscalised data can be accessed two ways: - **efsta Portal** — download audit files, journals, and reports from the Portal UI - **HTTP requests** — send authenticated requests to the Cloud EFR endpoint using the same `/export` endpoints as local EFR ## Country-specific guides Steps 1 (API integration) and 2 (Portal setup) of each country's Quick Start apply unchanged. Country-specific fiscal steps apply where they do not require hardware devices. Continue with your country guide after completing setup above: | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **AT** | **BE** | **CZ** | **DE** | **DK** | **ES** | **FR** | **HR** | **HU** | |  **Austria**   |  **Belgium**  |   **Czechia**   | **Germany** | **Denmark** |   **Spain**    |  **France**   |  **Croatia**  | **Hungary** | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **IT** | **LT** | **NO** | **PL** | **PT** | **SE** | **SI** | **SK** | |    **Italy**      | **Lithuania** |  **Norway**  |  **Poland**   | **Portugal**   | **Sweden** | **Slovenia**  | **Slovakia** | --- source: https://docs.dev.efsta.eu/efr/container --- # Container Usage :::warning[Compatibility Notice] Our docker images are designed only for **standalone** Docker usage. The EFR's data storage is not designed for multi-process use and cannot be used by multiple replicas at the same time. It is NOT supported in distributed environments like Kubernetes, Docker Swarm, or Nomad unless a deployment strategy is used that guarantees only one instance is running at a time. ::: ## How to use a docker image ``` $ docker run -itd -v /home/efsta/efrDATA:/usr/src/EFR/DATA -p 20011:5618 --restart always --device=/dev/bus/usb/001/002 --privileged efsta/efr-[country-code]:latest efr ``` :::info Please note that this is only an example and must be adjusted to fulfill security and environment needs. **efsta is not responsible** for any kind of data loss or other damages. ::: ## Attributes and parameters ### Mapping the network port The EFR exposes port `5618`, which needs to be published to access its API ``` -p 8090:5618 ``` ### Persisting storage The container path `/usr/src/EFR/DATA` needs to be mapped to a volume to persist the EFR's internal storage ``` -v :/usr/src/EFR/DATA ``` ### Recommended attributes We recommend to always restart the container to ensure the EFR is responsive to the POS in case of a crash or system outage. ``` --restart always ``` ## Country-Specific Options ### Connecting smart cards (Austria) To connect smart cards in Austria (in case of using hardware fiscalization), the USB device needs to be made accessible to the container. Additionally, depending on the host environment, the `--privileged` parameter may be needed to allow the Docker runtime to access the port. ``` --device=/dev/ --privileged ``` Connected smartcards can be listed and stored in a variable in the right format with the following command on the host system: ``` # idevices=$(lsusb | grep -i 'gemalto|ACR39U' | awk '{print "--device=/dev/bus/usb/" $2 "/" $4}' | awk '{gsub (":","",$1); printf "%s ",$1}') When using online signatures, this can be skipped. ```
### Connecting to hardware TSEs (Germany) When using a hardware TSE, the USB ports need to be made accessible to the container. Additionally, depending on the host environment, the --privileged parameter may be needed to allow the Docker runtime to access USB. ``` -v /dev/usb:/dev/usb --privileged ``` This can be skipped when using cloud TSEs.
### Connecting printers (Hungary, Poland)
[HU] Flag Hungary
 
[PL] Flag Poland
To connect fiscal printers in Hungary or Poland, the serial port needs to be made accessible to the container. Additionally, depending on the host environment, the `--privileged` parameter may be needed to allow the Docker runtime to access the port. ``` --device=/dev/ --privileged ``` Connected serial ports can be listed with the following command on the host system: ``` # dmesg | grep tty ``` --- source: https://docs.dev.efsta.eu/efr/countries --- # Available Countries | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **AT** | **BE** | **CZ** | **DE** | **DK** | **ES** | **FR** | **HR** | **HU** | |  **Austria**   |  **Belgium**  |   **Czechia**   | **Germany** | **Denmark** |   **Spain**    |  **France**   |  **Croatia**  | **Hungary** | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **IT** | **LT** | **NO** | **PL** | **PT** | **SE** | **SI** | **SK** | |    **Italy**      | **Lithuania** |  **Norway**  |  **Poland**   | **Portugal**   | **Sweden** | **Slovenia**  | **Slovakia** | --- source: https://docs.dev.efsta.eu/efr/getting-started --- ## Step 1 - EFR API Integration This onboarding guide was written to assist efsta customer’s with the efsta Portal and EFR setup after the POS has been integrated to the EFR API. For EFR API Documentation, please refer to [API](/efr/api/) ## Step 2 - efsta Portal Set up the efsta Portal. #### Creating Organizations, Companies & Locations First you will receive an invitation to our efsta Portal. If you still require an invite, please get in touch with our team at [ticket@efsta.eu](mailto:ticket@efsta.eu). For each of the following sections, you have the option between an active or inactive setup (for testing). Please make sure to follow the steps appropriate to your demands. :::warning For testing/sandbox purposes, please create a test-organization with test-companies and test-EFRs. If you test with an active/live EFR, an **invoice** will automatically be issued (unless deactivated within the same day). :::
**Testing Organizations** organizations are used for structuring in the efsta portal. We recommend creating a separate organization for each country (e.g. Customer AT, Customer FR) ![Customer Tests](@site/efr/img/onboarding/0_tests.png) --- 1. On the main page of the efsta portal, click on “organizations” in the left side menu ![Sidebar organizations](@site/efr/img/onboarding/1_organizations.png) 2. Click on „Add“ ![Add organization](@site/efr/img/onboarding/2_orgadd.png) 3. In the pop up window, select your organization from the drop-down menu ![organization Overlay](@site/efr/img/onboarding/3_orgadd_overlay.png) 4. Enter the name of the test-organization you want to create
(f.e. *“efsta IT Services Gmbh Test Organization”*) 5. Tick the "tag as test" checkbox ![organization Test](@site/efr/img/onboarding/4_orgadd_overlaytest.png) 6. Click on the save button
**Testing Companies** 1. Go to the page „Companies“ ![Sidebar Companies](@site/efr/img/onboarding/1_companies.png) 2. Click on the „Add“ button ![Add Company](@site/efr/img/onboarding/5_compadd.png) 3. In the pop-up window, select the test-organization that was just created ![Company Overlay](@site/efr/img/onboarding/6_compadd_overlay.png) 4. Select the correct country ![Company Test](@site/efr/img/onboarding/7_compadd_overlaytest.png) 5. Click on the save button
**Testing Locations** Test-companies are automatically created with two location sites for testing purposes.
**Active Organizations** Organizations are used for structuring in the efsta portal. We recommend creating a separate organization for each country (e.g. Customer AT, Customer FR) ![Customer Tests](@site/efr/img/onboarding/0_tests.png) --- 1. On the main page of the efsta portal, click on “organizations” in the left side menu ![Sidebar organizations](@site/efr/img/onboarding/1_organizations.png) 2. Click on „Add“ ![Add organization](@site/efr/img/onboarding/2_orgadd.png) 3. In the pop up window, select your organization from the drop-down menu ![organization Overlay](@site/efr/img/onboarding/3_orgadd_overlay.png) 4. Enter the name of the organization you want to create
(f.e. *“efsta IT Services Gmbh Organization”*) 5. Click on the save button
**Active Companies** 1. Go to the page „Companies“ ![Sidebar Companies](@site/efr/img/onboarding/1_companies.png) 2. Click on the „ADD“ button ![Add Company](@site/efr/img/onboarding/5_compadd.png) 3. In the pop-up window, select the organization that was just created ![Company Overlay](@site/efr/img/onboarding/6_compadd_overlay.png) 4. Select the correct country 5. Enter the company data. At identification type, choose „EUROPE VAT-id“, country specific tax number, or GLN number if applicable 6. Click on the save button For German companies you can add the WIdNr (Wirtschafts-Identifikationsnummer) – this is currently optional but will be **mandatory from 01.01.2027 onwards** as requirement for the german reporting obligation.
**Active Locations** 1. Go to „Locations“ in the left side menu ![Sidebar Locations](@site/efr/img/onboarding/1_locations.png) 2. Click on „Add“ ![Add Location](@site/efr/img/onboarding/8_locationadd.png) 3. In the pop-up window, select the company you just created 4. Enter the location information 5. The internal branch ID should match with the TL which you send in the transactions
#### Inviting Users & Permissions After you have finished your organization structure, you can invite users to manage the correlating organization, depending on where they should have access.
**User Invitations & Permission Setting** 1. Go back to “Organizations” page and the find your top organization 2. On the right side (next to the organization, company, or location) click on the "add user" symbol: ![Add User](@site/efr/img/onboarding/9_useradd_icon.png) 3. In the pop-up window, enter the mail address of the person you want to invite to the Portal and select the permissions you want to assign to them: * Editor: can edit data, create companies and deactivate EFR * Viewer: Read-only access with optional data sharing permissions
![User Overlay](@site/efr/img/onboarding/9_useradd_overlay.png) 4. Click on the button „send invitation“ so the invited person will receive an email with a registration token :::note The invitation is valid for 10 days. ::: 5. * The user to whom the invitation was sent has to sign up with their mail address and a custom password * Alternatively, they can also sign up with a Google or Microsoft account ![Signup](@site/efr/img/onboarding/10_signup.png) 7. After the registration was completed, they can log in ![Login](@site/efr/img/onboarding/11_login.png)
## Step 3 - Installation
At this point, there are two different paths you can take with your setup: Local Installation or Cloud Installation. Please continue with only one of the following two steps: If your POS runs locally (Windows, Linux, Android), continue with Step 3 below. If your POS is fully cloud-based and requires no local installation, use Cloud EFR instead of Step 3.
**System Requirements** # System Requirements * Operating System * Windows 7 or higher * Linux * Android 8 or higher * Typically 1 GB hard disk space reserved * Minimum 100 MB per POS * Administration rights during installation * Internet access for cloud services :::tip[Good to know] - EFR should run locally for fail-safety reasons. - **Cloud EFR** can only be used for fully cloud-based POS systems. [See Cloud EFR](/efr/cloud) - We recommend whitelisting the email address **noreply@efsta.​net** when using a spam filter to ensure notifications from our efsta portal are delivered. :::

Firewall Settings

| Partner | Host | Used for | |----------------|---------------------------------------------------------------------------------------|---------------------------------------| | efsta cloud | https://\*.efsta.net:443
https://fr.efsta.net:443
https://de-fr.efsta.net:443 | EFR in Online mode for archiving data | #### Remote Signature | | Partner | Used for | Host | |:------------------:|-----------------|---------------------------:|-------------------------------------------------------------------------------------------------------------------| |
[AT] Flag Austria
| A-Trust | **External HSM signature** | https://hs-abnahme.a-trust.at:443
https://rksv.a-trust.at/ | | ![](/02_inset.png) | Prime-Sign | **External HSM signature** | https://rs-1f9e614c.ps.prime-sign.com:443
https://rs-2759ffb9.ps.prime-sign.com
*(please see note below)* | |
[BE] Flag Belgium
| zwartedoos.be | **Remote Test FDM** | https://sdk.zwartedoos.be:443 | |
[DE] Flag Germany
| Deutsche Fiskal | **Remote TSE** | https://fiskal.cloud:443 | | ![](/02_inset.png) | Fiskaly | **Remote TSE** | https://kassensichv.io:443
https://\*.fiskaly.com:443 | | ![](/02_inset.png) | Swissbit Cloud | **Remote TSE**
Test | https://web-tse.de:443
https://dev.web-tse.de:443 | |
[SE] Flag Sweden
| Infrasec | **Productive**
Test | https://ccu.infrasec.se:8449
https://ccu-verify.infrasec.se:8449 | :::info Please note that Prime-Sign has not just one HSM Server, but a cluster. If certificates are ordered using the efsta Cloud Portal, you'll see the host address in the portal. However, should the certificate be ordered through different channels, it is possible that it resides on a different server, using a different IP. ::: #### Fiscal Authority | | Partner | Used for | Host | |:---------------------------:|------------|--------------------------:|----------------------------------------------------------------------------------| |
[CZ] Flag Czechia
| EET 2.0 | **Productive**
Test | https://\*.trzbyeet.gov.cz:443
https://pg.trzbyeet.gov.cz:443 | |
[ES] Flag Spain
| VERI*FACTU | **Productive**
Test | https://www1.agenciatributaria.gob.es
https://prewww1.aeat.es | | ![](/02_inset.png) Araba | | **Productive**
Test | https://ticketbai.araba.eus
https://pruebas-ticketbai.araba.eus | | ![](/02_inset.png) Bizkaia | | **Productive**
Test | https://sarrerak.bizkaia.eus
https://pruesarrerak.bizkaia.eus | | ![](/02_inset.png) Gipuzkoa | | **Productive**
Test | https://tbai-z.egoitza.gipuzkoa.eus
https://tbai-z.prep.gipuzkoa.eus | |
[HR] Flag Croatia
| FINA | **Productive**
Test | https://cis.porezna-uprava.hr:8449
https://cistest.apis-it.hr:8449 | |
[PT] Flag Portugal
| | **Productive** | https://servicos.portaldasfinancas.gov.pt:422/SeriesWSService | |
[SI] Flag Slovenia
| FURS | **Productive**
Test | https://blagajne.fu.gov.si:9003
https://blagajne-test.fu.gov.si:9002 | #### Fiscal Devices | | Partner | Used for | Host | |:------------:|---------------|-------------------------:|-------------------| |
[BE] Flag Belgium
| zwartedoos.be | **Productive**
NTP | *:443
*:123 | #### Fiscal Printer | | Partner | Used for | Host | |:------------------:|---------|----------------:|-------------------------------------------------------------------------------------------| |
[HU] Flag Hungary
| BBOX | **Productive** | 193.91.88.26:4791 | |
[SK] Flag Slovakia
| BBOX | **Productive** | 193.91.88.26:4791 | |
[IT] Flag Italy
| Epson | **Productive** | - | | ![](/02_inset.png) | Custom | **Productive** | - | |
[PL] Flag Poland
| | **Productive**
**Productive**
Test
Test | https://esb.mf.gov.pl:5062
https://e-kasy.mf.gov.pl
https://esb-te.mf.gov.pl:5062
https://test-e-kasy.mf.gov.pl | | ![](/02_inset.png) | Exorigo | **Productive**
**Productive**
Test
Firmware Update
NTP
NTP | crr-eh01-prd.servicebus.windows.net:443
crr-eh02-prd.servicebus.windows.net:443
crr-eh-we-tst.servicebus.windows.net:443
upfirm.exorigo-upos.pl:4433
tempus1.gum.gov.pl:123
tempus2.gum.gov.pl:123 |
* Go to public.efsta.net and select the appropriate country * Download the correct installers for your system * Install the software * Once finished, open a browser and enter “localhost:5618” in the address line * The EFR user-interface will open

Windows

* Windows 7 or higher * .msi from [public.efsta.net](https://public.efsta.net/EFR) * Runs as Windows service

Linux

* .zip from [public.efsta.net](https://public.efsta.net/EFR) * Run file install.sh * Run automation recommended, e.g. with systemd * Setup run automation with install.sh: `install.sh --service --service-user=USER` :::note[Required Packages] Required packages for USB/Serial devices: `libudev-dev` Required packages for smartcard use: `libpcsclite1 libpcsclite-dev pcscd build-essential libudev-dev` ::: In order for the TSEs to properly work on arm64, the `libffi` library is needed on the system. Most Linux distributions should come with this pre installed but it’s presence on the system can be checked with the following command:
`dpkg -l | grep libffi`
Which should produce an output similar to this:
``` ii libffi8:arm64 3.4.4-1 arm64 Foreign Function Interface library runtime ```
[AT] Flag Austria
 
[BE] Flag Belgium
 
[DE] Flag Germany
 
[DK] Flag Denmark
 
[FR] Flag France
 
[HR] Flag Croatia
 
[IT] Flag Italy
 
[NO] Flag Norway
 
[PL] Flag Poland
 
[PT] Flag Portugal
 
[SI] Flag Slovenia

Android

* Android 8 or higher * .apk from [public.efsta.net](https://public.efsta.net/EFR) * Execute and install apk on the device * Disable battery optimization on first start (even if device is always plugged in / has no battery) * On the first start the app will ask whether to disable battery optimization. Disabling it is required to ensure the app can run in the background and will not be suspended by the OS. Please make sure to test if the app can run interruption-free on your specific device and android version.
:::info[Uninstallation] Please make sure to keep the app's data or perform a backup/export of all data you want to keep BEFORE uninstalling. Default data deletion behavior can vary between different android device manufacturers. :::

**Connecting the EFR** see also [API Profile](/efr/api#profile) In order to connect the EFR with the efsta Portal (recorder: online), follow these steps: 1. In the portal, navigate to “Companies” on the left side menu ![Sidebar Company](@site/efr/img/onboarding/1_companies.png) 2. Open the properties of your company ![Options](@site/efr/img/onboarding/13_options.png) 3. Locate and copy the badge number :::warning[MultiCompany] If you are using a MultiCompany installation, the badge of an organization must be selected. ::: ![Badge](@site/efr/img/onboarding/14_badge.png) 4. In the EFR, go to "Profile" and paste the badge
(Optional) For MultiPOS & MultiCompany, tick the checkbox “RN/TT” at "Client Assignment" on :::warning[Attention] Please double check that the Badge is correct **before** saving since it cannot be changed after activation ::: :::note **MultiPOS** is ONE installed EFR, managing multiple cash registers from the same company (usually a back-office server) **MultiCompany** is ONE installed EFR, managing multiple companies, locations, and cash registers (only possible when cloud-hosting our EFR) If you are interested in any of these two modes, please contact your partner manager for a consulting appointment! ::: ![EFR Profile](@site/efr/img/onboarding/15_EFRprofile.png) 5. Save the profile, so the communication to the efsta Portal is activated.
The EFR status will change to “Online”. ![EFR Status](@site/efr/img/onboarding/16_EFRstatus.png) :::warning[Attention] Please allow communication to the efsta Portal through your firewall. If not, it will cause connection issues. :::
:::info[Preconfiguration via ENV Variables (optional)] For automated / scripted deployments, EFR Profile settings can also be configured via environment variables. See: [ENV-based EFR Profile Configuration (Advanced)](/efr/api#profile) ::: ## Step 4 and up - Country Specific Setup & Implementation Checklist For the next steps, please continue reading the setup guide for the country you would like to implement: | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **AT** | **BE** | **CZ** | **DE** | **DK** | **ES** | **FR** | **HR** | **HU** | |  **Austria**   |  **Belgium**  |   **Czechia**   | **Germany** | **Denmark** |   **Spain**    |  **France**   |  **Croatia**  | **Hungary** | | | | | | | | | | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | **IT** | **LT** | **NO** | **PL** | **PT** | **SE** | **SI** | **SK** | |    **Italy**      | **Lithuania** |  **Norway**  |  **Poland**   | **Portugal**   | **Sweden** | **Slovenia**  | **Slovakia** | --- source: https://docs.dev.efsta.eu/efr/system-requirements --- # System Requirements * Operating System * Windows 7 or higher * Linux * Android 8 or higher * Typically 1 GB hard disk space reserved * Minimum 100 MB per POS * Administration rights during installation * Internet access for cloud services :::tip[Good to know] - EFR should run locally for fail-safety reasons. - **Cloud EFR** can only be used for fully cloud-based POS systems. [See Cloud EFR](/efr/cloud) - We recommend whitelisting the email address **noreply@efsta.​net** when using a spam filter to ensure notifications from our efsta portal are delivered. :::

Firewall Settings

| Partner | Host | Used for | |----------------|---------------------------------------------------------------------------------------|---------------------------------------| | efsta cloud | https://\*.efsta.net:443
https://fr.efsta.net:443
https://de-fr.efsta.net:443 | EFR in Online mode for archiving data | #### Remote Signature | | Partner | Used for | Host | |:------------------:|-----------------|---------------------------:|-------------------------------------------------------------------------------------------------------------------| |
[AT] Flag Austria
| A-Trust | **External HSM signature** | https://hs-abnahme.a-trust.at:443
https://rksv.a-trust.at/ | | ![](/02_inset.png) | Prime-Sign | **External HSM signature** | https://rs-1f9e614c.ps.prime-sign.com:443
https://rs-2759ffb9.ps.prime-sign.com
*(please see note below)* | |
[BE] Flag Belgium
| zwartedoos.be | **Remote Test FDM** | https://sdk.zwartedoos.be:443 | |
[DE] Flag Germany
| Deutsche Fiskal | **Remote TSE** | https://fiskal.cloud:443 | | ![](/02_inset.png) | Fiskaly | **Remote TSE** | https://kassensichv.io:443
https://\*.fiskaly.com:443 | | ![](/02_inset.png) | Swissbit Cloud | **Remote TSE**
Test | https://web-tse.de:443
https://dev.web-tse.de:443 | |
[SE] Flag Sweden
| Infrasec | **Productive**
Test | https://ccu.infrasec.se:8449
https://ccu-verify.infrasec.se:8449 | :::info Please note that Prime-Sign has not just one HSM Server, but a cluster. If certificates are ordered using the efsta Cloud Portal, you'll see the host address in the portal. However, should the certificate be ordered through different channels, it is possible that it resides on a different server, using a different IP. ::: #### Fiscal Authority | | Partner | Used for | Host | |:---------------------------:|------------|--------------------------:|----------------------------------------------------------------------------------| |
[CZ] Flag Czechia
| EET 2.0 | **Productive**
Test | https://\*.trzbyeet.gov.cz:443
https://pg.trzbyeet.gov.cz:443 | |
[ES] Flag Spain
| VERI*FACTU | **Productive**
Test | https://www1.agenciatributaria.gob.es
https://prewww1.aeat.es | | ![](/02_inset.png) Araba | | **Productive**
Test | https://ticketbai.araba.eus
https://pruebas-ticketbai.araba.eus | | ![](/02_inset.png) Bizkaia | | **Productive**
Test | https://sarrerak.bizkaia.eus
https://pruesarrerak.bizkaia.eus | | ![](/02_inset.png) Gipuzkoa | | **Productive**
Test | https://tbai-z.egoitza.gipuzkoa.eus
https://tbai-z.prep.gipuzkoa.eus | |
[HR] Flag Croatia
| FINA | **Productive**
Test | https://cis.porezna-uprava.hr:8449
https://cistest.apis-it.hr:8449 | |
[PT] Flag Portugal
| | **Productive** | https://servicos.portaldasfinancas.gov.pt:422/SeriesWSService | |
[SI] Flag Slovenia
| FURS | **Productive**
Test | https://blagajne.fu.gov.si:9003
https://blagajne-test.fu.gov.si:9002 | #### Fiscal Devices | | Partner | Used for | Host | |:------------:|---------------|-------------------------:|-------------------| |
[BE] Flag Belgium
| zwartedoos.be | **Productive**
NTP | *:443
*:123 | #### Fiscal Printer | | Partner | Used for | Host | |:------------------:|---------|----------------:|-------------------------------------------------------------------------------------------| |
[HU] Flag Hungary
| BBOX | **Productive** | 193.91.88.26:4791 | |
[SK] Flag Slovakia
| BBOX | **Productive** | 193.91.88.26:4791 | |
[IT] Flag Italy
| Epson | **Productive** | - | | ![](/02_inset.png) | Custom | **Productive** | - | |
[PL] Flag Poland
| | **Productive**
**Productive**
Test
Test | https://esb.mf.gov.pl:5062
https://e-kasy.mf.gov.pl
https://esb-te.mf.gov.pl:5062
https://test-e-kasy.mf.gov.pl | | ![](/02_inset.png) | Exorigo | **Productive**
**Productive**
Test
Firmware Update
NTP
NTP | crr-eh01-prd.servicebus.windows.net:443
crr-eh02-prd.servicebus.windows.net:443
crr-eh-we-tst.servicebus.windows.net:443
upfirm.exorigo-upos.pl:4433
tempus1.gum.gov.pl:123
tempus2.gum.gov.pl:123 |