Skip to main content

Slovenia Fiscalization Guide

What is Slovenian fiscalization?

Slovenia requires real-time invoice certification under davčno potrjevanje računov ("tax confirmation of invoices"), operated by FURS (Finančna uprava Republike Slovenije — Slovenian Tax Administration). Every cash invoice must be transmitted synchronously to FURS at the moment of issuance; FURS responds with a confirmation code (EOR) which must be printed on the receipt.

In plain English: Slovenia is one of the strictest "live" regimes in the EU — the tax authority must approve each cash sale before the customer leaves. The cashier never sees this happen because Zyntem completes the round-trip in well under one second.

You don't need to worry about this

Zyntem handles the FURS-issued PFX, computes the ZOI protective code, signs each invoice with JWS Compact Serialization, talks to FURS over mTLS, parses the response signature, and prints the EOR on your receipt. From your perspective, you just create transactions.

How it works

Slovenia's flow is synchronous and online — but with a fallback if FURS is unreachable:

  1. Your POS creates a transaction via POST /v1/transactions.
  2. Zyntem computes the ZOI (Zaščitna oznaka izdajatelja računa — issuer's protective code), a 32-character hex digest signed with the FURS-issued PFX. The ZOI proves the invoice was issued at this exact timestamp by this exact taxpayer.
  3. Zyntem submits the JWS-signed invoice request over mTLS to FURS (blagajne.fu.gov.si:9002).
  4. FURS responds with the EOR (Enkratna identifikacijska oznaka računa — Unique Identification Mark).
  5. The transaction returns with fiscal_id = ZOI and fiscal_id_upstream = EOR. Both must be printed on the receipt.

Submission window: The standard flow is synchronous (sub-second). If FURS is unreachable, Slovenia allows up to 48 hours to retry — Zyntem queues the invoice with the ZOI as the fiscal_id (still printed on the receipt) and submits as soon as connectivity is restored. The fiscal_id_upstream becomes populated when FURS finally accepts.

Country config fields

The country_config object for Slovenian locations:

FieldTypeRequiredDescription
tax_numberintegerYes8-digit Slovenian taxpayer number (no SI prefix).
pfx_bytesstring (base64)ConditionalBase64-encoded FURS-issued PKCS#12 / PFX. Either this or signing_key_id is required.
pfx_passwordstringYes4-character PFX unlock code from eDavki.
business_premise_idstring (≤20)YesPre-registered premise mark.
electronic_device_idstring (≤20)YesPre-registered electronic device mark.
numbering_structurestringYesB = numbering per (premise, device); C = per premise.
default_operator_tax_numberintegerYesDefault cashier tax number when the transaction omits one.
software_supplier_tax_numberintegerYesSoftware supplier's taxpayer ID — registered with FURS as SoftwareSupplier.
signing_key_idstringConditionalKMS reference for the PFX. Either this or pfx_bytes is required.

Premise pre-registration. Before issuing any invoices, you must call FURS once with a BusinessPremiseRequest for each new business_premise_id. Zyntem handles this automatically when you create the location — provide the premise address and Zyntem registers it for you.

Configuration example

curl -X POST https://api.zyntem.dev/v1/locations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer zyn_test_abc123def456..." \
-d '{
"name": "Ljubljana Office",
"country": "SI",
"address": "Slovenska cesta 1, 1000 Ljubljana",
"country_config": {
"tax_number": 10442564,
"pfx_password": "abcd",
"business_premise_id": "BP101",
"electronic_device_id": "BL01",
"numbering_structure": "B",
"default_operator_tax_number": 12345678,
"software_supplier_tax_number": 87654321,
"signing_key_id": "kms://si/edavki-cert"
}
}'

Upload the PFX bytes via POST /v1/certificates first and reference them with signing_key_id, or inline them as base64 in pfx_bytes.

Creating a transaction

Example: A EUR 38.50 sale at a Ljubljana shop.

curl -X POST https://api.zyntem.dev/v1/transactions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer zyn_test_abc123def456..." \
-d '{
"location_id": "loc_abc123",
"type": "sale",
"amount": 3850,
"currency": "EUR",
"line_items": [
{
"description": "Wine bottle",
"quantity": 1,
"unit_price": 2500,
"vat_rate": 2200
},
{
"description": "Cheese",
"quantity": 1,
"unit_price": 1350,
"vat_rate": 950
}
]
}'

Response

{
"id": "txn_abc123",
"status": "success",
"fiscal_id": "a7b3c8d2e1f4...32hex",
"fiscal_id_upstream": "12345678-90AB-CDEF-1234-567890ABCDEF",
"country": "SI",
"created_at": "2026-03-15T14:30:22Z"
}

The fiscal_id is the ZOI (printed on the receipt as a 32-character QR-code payload). The fiscal_id_upstream is the EOR returned by FURS (also printed on the receipt). Both are required by ZDavPR for receipts.

Sandbox access

FURS sandbox runs at blagajne-test.fu.gov.si:9002. Sandbox routing is automatic with a test API key. Sandbox PFX certificates are issued via the eDavki test portal — typical onboarding is 1–2 days.

Error handling

When FURS rejects an invoice, error.category distinguishes:

  • transient — network blip or FURS 5xx. Zyntem retries until the 48-hour submission window expires.
  • regulatory_reject — FURS validation error (error.authority_code carries the S0xx code, e.g. S001 business-rule violation). Correct the invoice and re-issue.
  • duplicate_as_success — FURS responded S001 indicating the ZOI already exists. Treated as success — no re-attempt.

See the Error handling guide for the full taxonomy.