Skip to content

Slovenia FURS fiscalization

Full support for Slovenian fiscalization requirements (FURS).

FURS is separate from Slovenia e-invoicing. Use this guide for real-time fiscalization with the Slovenian tax authority. Use e-SLOG and UJP for Slovenian electronic invoice XML validation and UJP package downloads.

Prerequisites

RequirementDescription
Tax numberEntity with Slovenian tax number
CertificateDigital certificate (.p12) from FURS

Setup

1. Upload Certificate

Upload FURS certificatetypescript
import fs from "node:fs";
import SpaceInvoices from "@spaceinvoices/js-sdk/sdk";

const sdk = new SpaceInvoices("YOUR_API_KEY");

const file = new File([new Uint8Array(fs.readFileSync("certificate.p12"))], "certificate.p12", {
  type: "application/x-pkcs12",
});

await sdk.fursCertificate.uploadFursCertificate({
  file,
  passphrase: "cert-password",
});

2. Register Business Premise

Register your business location (e.g., P1, OFFICE). This creates the premise and registers it with FURS.

Register premisetypescript
const _premise = await sdk.fursPremises.registerFursRealEstatePremise({
  business_premise_name: "PREMISE1",
  real_estate: {
    cadastral_number: "1234",
    building_number: "1",
    building_section: "1",
    community: "Ljubljana",
    city: "Ljubljana",
    street: "Main Street",
    house_number: "1",
    postal_code: "1000",
  },
});

If your FURS numbering strategy is centralized (C), you can pass starting_number when registering the premise. The first fiscal invoice for that premise-level sequence uses that value.

3. Register Electronic Device

Register a device for the premise (e.g., D1, POS1). Each device gets its own invoice counter.

Register devicetypescript
await sdk.fursDevices.registerFursElectronicDevice("prm_123", { name: "DEVICE1" });

If your FURS numbering strategy is device-level (B), you can pass starting_number when registering the device. You can also update or clear a premise or device starting number with the PATCH endpoints, but only before any fiscal document counter has been created for that sequence.

4. Enable FURS

Enable FURStypescript
await sdk.fursSettings.update({ enabled: true });

Fiscalized Invoices

Invoices are automatically fiscalized when FURS is enabled:

Create fiscalized invoicetypescript
const _invoice = await sdk.invoices.create({
  items: [{ name: "Service", quantity: 1, price: 100 }],
  furs: {
    business_premise_name: "PREMISE1",
    electronic_device_name: "DEVICE1",
  },
});

By default FURS PaymentAmount equals InvoiceAmount. To report a smaller paid amount without changing the fiscal invoice total or taxes, set furs.payment_amount on POST /invoices or POST /invoices/custom. The value is in the document currency, from 0 through total_with_tax. Space Invoices converts it to EUR the same way as InvoiceAmount and applies credit-note sign server-side. Do not derive it from payments, total_paid, or total_due.

When a full credit note is created automatically by voiding or reissuing an invoice, it reverses the originally reported PaymentAmount, including an explicit zero. For example, an invoice reporting PaymentAmount €30 creates a reversal reporting −€30, even if the full invoice total is €100.

The ZZZS copayment case is a €100 invoice with a €30 patient payment:

{
"InvoiceAmount": 100,
"PaymentAmount": 30,
"TaxesPerSeller": "calculated from 100"
}
Override FURS PaymentAmounttypescript
const _invoice = await sdk.invoices.create({
  items: [{ name: "Medical service", quantity: 1, price: 100 }],
  payments: [{ type: "cash", amount: 30 }],
  furs: {
    business_premise_name: "PREMISE1",
    electronic_device_name: "DEVICE1",
    payment_amount: 30,
  },
});

FURS returns confirmation data on the invoice:

Response Fields
eor
Unique invoice identifier from FURS
zoi
Protective mark (security code)

Subsequent fiscalization and payment amounts

When issuing an invoice without fiscalization, send furs: { "skip": true }. Do not include a non-null furs.payment_amount with skip: true; that combination returns 422.

Supply the amount when you first fiscalize the saved document:

POST /documents/inv_YOUR_INVOICE_ID/fiscalize
Content-Type: application/json
{
"business_premise_name": "K",
"electronic_device_name": "BLAG1",
"operator_tax_number": "11111111",
"operator_label": "K.V.",
"payment_amount": 21.97
}

For a EUR invoice totalling 27.71, FURS receives InvoiceAmount: 27.71 and PaymentAmount: 21.97. The complete invoice tax breakdown is retained. The field is optional and nullable: omission or null uses the full invoice amount, while 0 explicitly reports zero. Values must be non-negative and no greater than the document total. Foreign-currency amounts use the same EUR conversion as the invoice total; credit-note signs are applied server-side.

Retry failed requests with the same body, including payment_amount. Once a FURS payload is stored, the API reuses its original amount: repeating an amount that resolves to the same signed EUR value is accepted, while a different value is rejected. Omitting the field or sending null also reuses the stored amount, including explicit zero. If failure occurred before payload creation, repeat the amount because there is no stored payload amount to recover. The override is only supported for FURS, not FINA.

Partial credit notes and original invoice references

On POST /credit-notes or POST /credit-notes/custom, set linked_documents to the original invoice IDs. For successive partial credits against one invoice, each credit note references that same original invoice, not the preceding credit note.

{
"linked_documents": ["inv_ORIGINAL_INVOICE_ID"]
}

This is a fragment to include with the credit note’s remaining required fields. Links are validated and saved before fiscalization. For linked invoices with successful FURS data, the credit note’s ReferenceInvoice contains the original fiscal business premise, device, invoice sequence number, and stored issue timestamp. Original invoices without successful FURS reference data are not included in that FURS array.

Relations are opt-in in creation and GET responses. To receive the original invoice summary immediately, use POST /credit-notes?include=document_relations or POST /credit-notes/custom?include=document_relations with the same request body. You can also retrieve it afterward:

GET /credit-notes/cre_YOUR_CREDIT_NOTE_ID?include=document_relations

The returned document_relations entries contain a related_document summary with the original invoice number. Without the include parameter, the field is omitted. Saved credit-note PDFs and HTML automatically show the linked invoice number in their related-documents section; the GET include parameter does not control rendering.

The original-invoice reference is required for fiscal reporting of subsequent changes under ZDavPR. Corrective documents must also identify the original invoice and the changed details, as described in the official invoice guidance.

QR Code

Fiscalized invoices include a verification QR code, embedded automatically in the PDF:

Render PDFtypescript
const _pdf = await sdk.invoices.renderPdf(invoice.id);