Download OpenAPI specification:Download
The EFR (Electronic Fiscal Register) is a middleware for fiscalization, e-invoicing and receipt archiving. It can run on-site with the POS, in a partner's or customer's datacenter, or in the efsta cloud. On-site deployments can also control fiscal printers or other local signing devices where required. The EFR processes transactions according to the configured country's fiscal requirements.
The API uses a common request format across all supported countries. Send
transactions, including sales, refunds, voids, invoices, vouchers, closures
and reports, to POST /register. The EFR identifies the business case from
the request content. Required fields depend on the business case and country.
This reference covers:
Many fields are optional in the schema because their requirements depend on the country or business case. Field descriptions use the following labels:
The mandatory labels define the minimum required data. We recommend also sending optional fields whenever the POS already holds the corresponding information. Provide as complete a transaction record as possible to prepare the integration for additional countries and their requirements.
The /register examples show the required fields for each documented case.
See the Rule Set for field definitions,
Business Cases and
Country Specific Business Cases
for transaction requirements, and the
EFR documentation for country guides.
The API supports application/json and text/xml. Both formats represent
the same data. In JSON, objects in the line arrays (PosA, PayA, TaxA)
use the _ key to identify their type (Pos, Mod, Lin, Pay, Tax).
In XML, the element name identifies the type.
Transaction responses contain a Result with the result code RC: OK (registered),
NO (not registered, a later retry may succeed) or BAD (not registered,
terminate the transaction). If a UserMessage is present, the POS must show it
to the operator.
Country and business-case requirements are also provided as vendor extensions:
x-efr-mandatory-countries, x-efr-country-only,
x-efr-mandatory-when and x-efr-datatype on fields, and the vocabularies
x-efr-countries and x-efr-payment-groups at the top level. Country
requirements are recorded in these extensions rather than as JSON Schema
required rules. Schema validation alone does not check country requirements.
The specification uses the latest changelog date as info.version.
The download filename includes this date. Release notes are listed under
Changes below.
POST /register with 71 business-case examples (common and country-specific), each available in JSON and XML./cfg, /profile), state and journal access (/state, /find, /last, /retrieve, /disk), rendering (/render), printer control (/peri/*), /service/restart, /qr and /recorder/lastdh.TraC with JSON and XML samples for success (OK) and the error cases BAD and NO.The single super-endpoint. The business case is determined by the combination of ESR.NFS/ESR.NF, ESR.Void, Pos.PTY, ESR.DD/ESR.DT and the presence of ESR.Ctm. The named examples (grouped by category in their summaries) give one body per business case. Also accepts an Audit record for technical/export events. Country-conditional mandatoriness is annotated via x-efr-mandatory-countries (never enforced as required, to preserve one API for all countries).
required | object |
object Start of a transaction ([DE]); the response carries the TSE TID to send back in the closing Tra. | |
object (Audit) Technical/audit event record (Export Events). | |
| property name* additional property | any |
Standard fiscal sale with explicit tax array.
{- "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"
}
]
}
}
}{- "SQ": "string",
- "Result": {
- "RC": "OK",
- "ErrorCode": "string",
- "UserMessage": "string",
- "Warning": [
- "string"
]
}, - "ESR": {
- "D": "string",
- "FN": "string",
- "TN": "string"
}, - "Fis": { }
}Identical body to /register; use it instead of /register when re-sending after a POS crash or restart, because duplicate detection is 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, and when ESR.D is missing or differs from the stored transaction — so a re-send still matches even if the POS could not preserve the original number or timestamp. An already-registered transaction returns Result.RC=OK with ErrorCode=#DUPLICATE and is not recorded twice.
required | object |
object Start of a transaction ([DE]); the response carries the TSE TID to send back in the closing Tra. | |
object (Audit) Technical/audit event record (Export Events). | |
| property name* additional property | any |
Standard fiscal sale with explicit tax array.
{- "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"
}
]
}
}
}{- "SQ": "string",
- "Result": {
- "RC": "OK",
- "ErrorCode": "string",
- "UserMessage": "string",
- "Warning": [
- "string"
]
}, - "ESR": {
- "D": "string",
- "FN": "string",
- "TN": "string"
}, - "Fis": { }
}Returns the current company header/base data.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| Accept | string Example: application/json Response format: application/json (default) or text/xml. |
{- "Cfg": {
- "Cmp": {
- "Nam": "My Company",
- "label": "MyComp",
- "Adr": "Street",
- "AdrNr": "3",
- "Zip": "1000",
- "City": "City",
- "Ctry": "XY",
- "TaxId": "XY99999999999",
- "TIN": "123456789",
- "Org": "373737-3737",
- "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",
- "AdrNr": "123",
- "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"
}, - "Doc": {
- "ContactName": "John Doe",
- "ContactTelephone": "123456789",
- "ContactElectronicMail": "j.doe@efsta.eu",
- "PaymentTerms": "30 days net",
- "PaymentPeriod": 30,
- "AccountName": "my company",
- "AccountIBAN": "AT00000000000000000000",
- "AccountBIC": "ASPAKAT2LXXX"
}, - "Dev": [
- {
- "Id": "1",
- "HW": "Dev Brand",
- "HWModel": "Dev Model",
- "SW": "My Dev Software",
- "SWVersion": "1.5.7",
- "Serial": "Device serial number"
}
], - "DE_Agentur": [
- {
- "Id": "1",
- "Nam": "Test Company",
- "Adr": "177 Long Road",
- "Zip": "12345",
- "City": "Metropolis",
- "Ctry": "XY",
- "TaxId": "XY99999999999"
}
]
}
}Sets receipt header fields (company, location, terminal, …). Must be sent before the first transaction; recommended on each POS startup. No effect if values are unchanged.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
required | object | ||||||||||||
| |||||||||||||
{- "Cfg": {
- "Cmp": {
- "Nam": "My Company",
- "label": "MyComp",
- "Adr": "Street",
- "AdrNr": "3",
- "Zip": "1000",
- "City": "City",
- "Ctry": "XY",
- "TaxId": "XY99999999999",
- "TIN": "123456789",
- "Org": "373737-3737",
- "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",
- "AdrNr": "123",
- "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"
}, - "Doc": {
- "ContactName": "John Doe",
- "ContactTelephone": "123456789",
- "ContactElectronicMail": "j.doe@efsta.eu",
- "PaymentTerms": "30 days net",
- "PaymentPeriod": 30,
- "AccountName": "my company",
- "AccountIBAN": "AT00000000000000000000",
- "AccountBIC": "ASPAKAT2LXXX"
}, - "Dev": [
- {
- "Id": "1",
- "HW": "Dev Brand",
- "HWModel": "Dev Model",
- "SW": "My Dev Software",
- "SWVersion": "1.5.7",
- "Serial": "Device serial number"
}
], - "DE_Agentur": [
- {
- "Id": "1",
- "Nam": "Test Company",
- "Adr": "177 Long Road",
- "Zip": "12345",
- "City": "Metropolis",
- "Ctry": "XY",
- "TaxId": "XY99999999999"
}
]
}
}{- "SQ": "string",
- "Result": {
- "RC": "OK",
- "ErrorCode": "string",
- "UserMessage": "string",
- "Warning": [
- "string"
]
}, - "ESR": {
- "D": "string",
- "FN": "string",
- "TN": "string"
}, - "Fis": { }
}Sets the Badge field to connect the instance to the efsta cloud.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| Badge required | string Badge value from the company details in the efsta portal. |
| TaxId | string |
{- "Badge": "XXX",
- "TaxId": "XXX"
}{- "SQ": "string",
- "Result": {
- "RC": "OK",
- "ErrorCode": "string",
- "UserMessage": "string",
- "Warning": [
- "string"
]
}, - "ESR": {
- "D": "string",
- "FN": "string",
- "TN": "string"
}, - "Fis": { }
}Runtime state of the EFR installation.
| Accept | string Example: application/json Response format: application/json (default) or text/xml. |
{- "pid": 0,
- "arch": "string",
- "uptime": 0,
- "name": "string",
- "version": "string",
- "Country": "string",
- "Online": true,
- "Recorder": "string",
- "RN": "string",
- "RecSent": 0,
- "RecQueued": 0,
- "RetryQueued": 0,
- "TimeOffset": 0,
- "D": "string",
- "DiskUsage": 0,
- "DiskQuota": 0,
- "Company": "string"
}Search the EFR journal. Any ESR property may be used as an additional query criterion.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| from | string Example: from=2024-01-15 From date (YYYY-MM-DD). |
| till | string Example: till=2024-12-31 Till date (YYYY-MM-DD). |
| limit | string Example: limit=10rows10000ms Volume/runtime limit 'XrowsYms'. Default 1000rows5000ms. |
| sort | string Example: sort=asc Sort order. Default 'desc'. |
| continuation | string Example: continuation=51856974 Continuation token. |
| fn | string Example: fn=001/1/10 Fiscal number (instead of tl/tt/tn). |
| tn | string Example: tn=5 Transaction number. |
| d | string Example: d=2024-11-05 Date. |
| sq | string Example: sq=10 Sequence number. |
| _ | string Example: _=Tra Record type: Tra, TraS, Rep, Cfg, log, … |
| t | string Example: t=8.38 Total. |
| nfs | string Example: nfs=Z Non-fiscal type filter. |
| Accept | string Example: application/json Response format: application/json (default) or text/xml. |
{ }Fetches the last registered data object (POST /register). Use on restart or for display.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| _ | string Example: _=Tra Record type: Tra, TraS, Rep, Cfg, log, … |
| Accept | string Example: application/json Response format: application/json (default) or text/xml. |
{ }Periodical retrieval of records for backup/reporting, starting behind the given SQ.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| last required | string Example: last=0 Read records behind this SQ (last=0 from the beginning). |
| endSQ | string Example: endSQ=2000 End SQ. |
| target | string Example: target=C:/exports Target folder to save the export/retrieved file to. |
| _ | string Example: _=Tra Record type: Tra, TraS, Rep, Cfg, log, … |
{ }Render a specific transaction supplied in the body (Tra JSON or XML, fetched via /find or /tra).
required | object |
object Start of a transaction ([DE]); the response carries the TSE TID to send back in the closing Tra. | |
object (Audit) Technical/audit event record (Export Events). | |
| property name* additional property | any |
{- "Tra": {
- "ESR": {
- "D": "2024-06-01T08:30:15",
- "D0": "2024-06-01T08:28:22",
- "TaxId": "DE123456789",
- "TL": "001",
- "TT": "1",
- "TN": "450023",
- "T": "8.38",
- "TaxN": "1",
- "Opr": "101",
- "OprN": "Mario Rossi",
- "OprTIN": "79100590097",
- "OprSSN": "string",
- "DT": "invoice",
- "DN": "A23",
- "DD": "IT-TEST",
- "DDto": "WSRLPXY",
- "DO": "noprint",
- "NF": "PAYIN",
- "NFS": "Z",
- "Void": "1",
- "Test": "1",
- "RFN": "NY/Y07900042/0110/00002",
- "RD": "2024-06-01T08:10:15",
- "RTL": "003",
- "RTT": "2",
- "RTN": "2080",
- "TP": "Table 1",
- "Rsn": "Customer return",
- "RFiscal": "string",
- "ResumeFN": "string",
- "TID": "3",
- "FromD": "2025-08-04",
- "TillD": "2025-08-05",
- "FromZI": "1",
- "ToZI": "2",
- "CZ_id_provoz": "string",
- "FR_OperationType": "Vente",
- "FR_Trainer": "101",
- "HR_SpecNamj": "string",
- "SK_ParagonNumber": "string",
- "Ctm": {
- "Nam": "The Buyercompany S.p.A",
- "Nam2": "string",
- "Adr": "Via Roma 1",
- "Adr2": "string",
- "AdrNr": "1",
- "Zip": "12345",
- "City": "Milano (MI)",
- "Ctry": "IT",
- "TaxId": "IT02348690211",
- "CN": "string",
- "Cat": "string",
- "FR_SIR": "string",
- "FR_SRN": "string",
- "FR_NAF": "string",
- "IT_CodiceLotteria": "string"
}, - "PosA": [
- {
- "_": "Pos",
- "PTY": "Svc",
- "PN": "1",
- "IN": "4012345678901",
- "ID": "string",
- "SKU": "456487",
- "Dsc": "Example Item",
- "TaxG": "A",
- "Amt": "3.98",
- "Qty": "2",
- "QtyU": "Pc.",
- "Pri": "1.99",
- "Note": "string",
- "PosG": "alcohol",
- "Void": "1",
- "VouN": "123456789",
- "RPN": "1",
- "RDsc": "Example Item",
- "RPri": "900.00",
- "RQty": "1",
- "Dev": "1",
- "InH": "1",
- "DE_AGENTUR_ID": "123",
- "Cat": "10",
- "CatN": "Example Category 10",
- "RFN": "string",
- "Rsn": "string",
- "Resume": "1",
- "TS": "2024-06-01T08:29:00",
- "SvcStartD": "2024-06-01",
- "SvcEndD": "2024-06-30",
- "PT_TaxExemptionCode": "M11",
- "PT_TaxExemptionReason": "string",
- "SK_SellerIdType": "DIC",
- "SK_SellerId": "string",
- "SK_SpecialRegulation": "string",
- "SK_InvoiceNumber": "string"
}
], - "PayA": [
- {
- "_": "Pay",
- "Dsc": "Example Payment",
- "Amt": "10.00",
- "PayG": "cash",
- "UID": "string",
- "CC": "CHF",
- "FAmt": "100.00"
}
], - "TaxA": [
- {
- "_": "Tax",
- "TaxG": "A",
- "Prc": "19",
- "Net": "5.78",
- "TAmt": "1.10",
- "Amt": "6.88",
- "TTY": "CT",
- "Base": "3.11"
}
]
}
}, - "TraS": {
- "ESR": {
- "D": "2024-06-01T08:30:15",
- "D0": "2024-06-01T08:28:22",
- "TaxId": "DE123456789",
- "TL": "001",
- "TT": "1",
- "TN": "450023",
- "T": "8.38",
- "TaxN": "1",
- "Opr": "101",
- "OprN": "Mario Rossi",
- "OprTIN": "79100590097",
- "OprSSN": "string",
- "DT": "invoice",
- "DN": "A23",
- "DD": "IT-TEST",
- "DDto": "WSRLPXY",
- "DO": "noprint",
- "NF": "PAYIN",
- "NFS": "Z",
- "Void": "1",
- "Test": "1",
- "RFN": "NY/Y07900042/0110/00002",
- "RD": "2024-06-01T08:10:15",
- "RTL": "003",
- "RTT": "2",
- "RTN": "2080",
- "TP": "Table 1",
- "Rsn": "Customer return",
- "RFiscal": "string",
- "ResumeFN": "string",
- "TID": "3",
- "FromD": "2025-08-04",
- "TillD": "2025-08-05",
- "FromZI": "1",
- "ToZI": "2",
- "CZ_id_provoz": "string",
- "FR_OperationType": "Vente",
- "FR_Trainer": "101",
- "HR_SpecNamj": "string",
- "SK_ParagonNumber": "string",
- "Ctm": {
- "Nam": "The Buyercompany S.p.A",
- "Nam2": "string",
- "Adr": "Via Roma 1",
- "Adr2": "string",
- "AdrNr": "1",
- "Zip": "12345",
- "City": "Milano (MI)",
- "Ctry": "IT",
- "TaxId": "IT02348690211",
- "CN": "string",
- "Cat": "string",
- "FR_SIR": "string",
- "FR_SRN": "string",
- "FR_NAF": "string",
- "IT_CodiceLotteria": "string"
}, - "PosA": [
- {
- "_": "Pos",
- "PTY": "Svc",
- "PN": "1",
- "IN": "4012345678901",
- "ID": "string",
- "SKU": "456487",
- "Dsc": "Example Item",
- "TaxG": "A",
- "Amt": "3.98",
- "Qty": "2",
- "QtyU": "Pc.",
- "Pri": "1.99",
- "Note": "string",
- "PosG": "alcohol",
- "Void": "1",
- "VouN": "123456789",
- "RPN": "1",
- "RDsc": "Example Item",
- "RPri": "900.00",
- "RQty": "1",
- "Dev": "1",
- "InH": "1",
- "DE_AGENTUR_ID": "123",
- "Cat": "10",
- "CatN": "Example Category 10",
- "RFN": "string",
- "Rsn": "string",
- "Resume": "1",
- "TS": "2024-06-01T08:29:00",
- "SvcStartD": "2024-06-01",
- "SvcEndD": "2024-06-30",
- "PT_TaxExemptionCode": "M11",
- "PT_TaxExemptionReason": "string",
- "SK_SellerIdType": "DIC",
- "SK_SellerId": "string",
- "SK_SpecialRegulation": "string",
- "SK_InvoiceNumber": "string"
}
], - "PayA": [
- {
- "_": "Pay",
- "Dsc": "Example Payment",
- "Amt": "10.00",
- "PayG": "cash",
- "UID": "string",
- "CC": "CHF",
- "FAmt": "100.00"
}
], - "TaxA": [
- {
- "_": "Tax",
- "TaxG": "A",
- "Prc": "19",
- "Net": "5.78",
- "TAmt": "1.10",
- "Amt": "6.88",
- "TTY": "CT",
- "Base": "3.11"
}
]
}
}, - "Audit": {
- "Code": "DRAWER_OPEN",
- "Dsc": "Drawer open",
- "TL": "001",
- "TT": "1",
- "Opr": "1",
- "OprN": "Operator name"
}
}Information about the connected printer / fiscal module.
| rn | string Example: rn=1_1 Register Number (client). Default 'def'. |
| Accept | string Example: application/json Response format: application/json (default) or text/xml. |
{- "ModuleName": "string",
- "ID": "string",
- "ZI": 0,
- "SimpleState": {
- "DayOpen": true,
- "ZRequired": true,
- "NextZRequired": "string",
- "DrawerOpen": true,
- "PaperNearEnd": true,
- "PaperEnd": true,
- "CoverOpen": true,
- "MemAlmostFull": true,
- "MemFull": true,
- "CertExpires": "string"
}
}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 it, the EFR stays down.
| password | string Example: password=mypwd Profile password (when not localhost). |
Renders a QR code image from arbitrary text.
| text required | string Example: text=hello%20world QR source data (URL-encoded). |
| type | string Example: type=png Image type: png (default), bmp, svg, pc437. |
| size | string Example: size=5 Module size in pixels. |
| margin | string Example: margin=4 Margin in modules. Default 1. |