POST/v1/invoices/fiscalize

Fiskalizacija računa

Fiskalizirajte gotovinski ili kartični račun i dobijte JIR (Jedinstveni Identifikator Računa) od Porezne uprave. JIR i ZKI moraju biti ispisani na računu.

Kada trebate fiskalizirati?

Fiskalizacija (F1) je obavezna za sve gotovinske i kartične naplate. Za B2B račune koji se plaćaju virmanom, fiskalizacija nije potrebna — ali od 2026. morate slati eRačune.

Request

POST /v1/invoices/fiscalizeapplication/json
{
  "invoice_number": "1/1/1",
  "business_unit": "POSLOVNICA1",
  "register_id": "BLAG1",
  "issued_at": "2026-01-04T14:30:00+01:00",
  "payment_method": "card",
  "operator_oib": "12345678901",

  "items": [
    {
      "name": "Usluga programiranja",
      "quantity": 8,
      "unit_price": 50.00,
      "tax_rate": 25
    },
    {
      "name": "Hosting (mjesečni)",
      "quantity": 1,
      "unit_price": 20.00,
      "tax_rate": 25
    }
  ],

  "buyer": {
    "oib": "98765432109",
    "name": "Kupac d.o.o."
  },

  "metadata": {
    "internal_id": "INV-2026-0001",
    "project": "Website redesign"
  }
}

Obavezni parametri

ParametarTipOpis
invoice_numberstringBroj računa u formatu broj/prostor/uredaj
business_unitstringOznaka poslovnog prostora (registrirano kod Porezne)
register_idstringOznaka naplatnog uređaja
payment_methodenumcash | card | other
operator_oibstringOIB osobe koja izdaje račun (11 znamenki)
itemsarrayStavke računa (minimalno 1)

Stavke računa (items)

ParametarTipObaveznoOpis
namestringDaNaziv proizvoda/usluge
quantitynumberDaKoličina (može biti decimalna)
unit_pricenumberDaJedinična cijena bez PDV-a (EUR)
tax_ratenumberDaStopa PDV-a: 25, 13, 5, ili 0
discountnumberNePopust u postotku (0-100)

Opcionalni parametri

ParametarTipOpis
issued_atdatetimeVrijeme izdavanja (ISO 8601). Default: sada
buyerobjectPodaci o kupcu (OIB i ime)
metadataobjectVaši custom podaci (ne šalju se Poreznoj)
subsequentbooleanNaknadno slanje (ako nije bilo veze s Poreznom)
paragon_numberstringBroj paragon bloka (za naknadno slanje)

Response

Uspješan odgovor (201 Created)

201 Created
{
  "id": "inv_abc123def456",
  "status": "fiscalized",
  "jir": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "zki": "f47ac10b58cc4372a5670e02b2c3d479",
  "invoice_number": "1/1/1",
  "issued_at": "2026-01-04T14:30:00+01:00",
  "fiscalized_at": "2026-01-04T14:30:01+01:00",

  "amounts": {
    "subtotal": 420.00,
    "tax_25": 105.00,
    "tax_13": 0.00,
    "tax_5": 0.00,
    "total": 525.00,
    "currency": "EUR"
  },

  "qr_code": "https://api.fiskalapi.hr/v1/invoices/inv_abc123/qr.png",
  "verification_url": "https://porezna.gov.hr/provjera?jir=a1b2c3d4...",
  "pdf_url": "https://api.fiskalapi.hr/v1/invoices/inv_abc123/pdf",

  "metadata": {
    "internal_id": "INV-2026-0001",
    "project": "Website redesign"
  }
}

Response polja

PoljeOpis
idFiskalAPI interni ID računa
jirJedinstveni Identifikator Računa — mora biti ispisan na računu!
zkiZaštitni Kod Izdavatelja — hash potpisa, mora biti na računu
statusfiscalized | pending | failed
amountsIzračunati iznosi po stopama PDV-a
qr_codeURL za QR kod (za ispis na računu)
verification_urlLink za provjeru računa na Poreznoj
pdf_urlURL za preuzimanje PDF računa

Obavezno na računu

Po zakonu, na fiskalnom računu moraju biti ispisani: JIR, ZKI, i QR kod za provjeru. Kupac mora moći skenirati QR i provjeriti račun na Poreznoj.

Primjeri koda

cURL

Bash
curl -X POST https://sandbox.fiskalapi.hr/v1/invoices/fiscalize \
  -H "Authorization: Bearer sk_sandbox_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "invoice_number": "1/1/1",
    "business_unit": "POSLOVNICA1",
    "register_id": "BLAG1",
    "payment_method": "card",
    "operator_oib": "12345678901",
    "items": [{
      "name": "Usluga",
      "quantity": 1,
      "unit_price": 100.00,
      "tax_rate": 25
    }]
  }'

JavaScript (Node.js)

JavaScript
import FiskalAPI from '@fiskalapi/node';

const fiskal = new FiskalAPI(process.env.FISKALAPI_KEY);

try {
  const invoice = await fiskal.invoices.fiscalize({
    invoice_number: '1/1/1',
    business_unit: 'POSLOVNICA1',
    register_id: 'BLAG1',
    payment_method: 'card',
    operator_oib: '12345678901',
    items: [
      {
        name: 'Usluga programiranja',
        quantity: 8,
        unit_price: 50.00,
        tax_rate: 25
      },
      {
        name: 'Hosting',
        quantity: 1,
        unit_price: 20.00,
        tax_rate: 25
      }
    ],
    buyer: {
      oib: '98765432109',
      name: 'Kupac d.o.o.'
    }
  });

  console.log('JIR:', invoice.jir);
  console.log('ZKI:', invoice.zki);
  console.log('Ukupno:', invoice.amounts.total, 'EUR');
  console.log('PDF:', invoice.pdf_url);

} catch (error) {
  if (error.code === 'fiscalization_failed') {
    console.error('Porezna odbila račun:', error.message);
  } else if (error.code === 'invalid_oib') {
    console.error('Neispravan OIB:', error.message);
  } else {
    console.error('Greška:', error.message);
  }
}

Python

Python
from fiskalapi import FiskalAPI, FiskalAPIError
import os

fiskal = FiskalAPI(os.environ['FISKALAPI_KEY'])

try:
    invoice = fiskal.invoices.fiscalize(
        invoice_number='1/1/1',
        business_unit='POSLOVNICA1',
        register_id='BLAG1',
        payment_method='card',
        operator_oib='12345678901',
        items=[
            {
                'name': 'Usluga programiranja',
                'quantity': 8,
                'unit_price': 50.00,
                'tax_rate': 25
            },
            {
                'name': 'Hosting',
                'quantity': 1,
                'unit_price': 20.00,
                'tax_rate': 25
            }
        ],
        buyer={
            'oib': '98765432109',
            'name': 'Kupac d.o.o.'
        }
    )

    print(f'JIR: {invoice.jir}')
    print(f'ZKI: {invoice.zki}')
    print(f'Ukupno: {invoice.amounts.total} EUR')
    print(f'PDF: {invoice.pdf_url}')

except FiskalAPIError as e:
    print(f'Greška {e.code}: {e.message}')

Greške

HTTPKodOpis
400invalid_requestNeispravan JSON ili nedostaju obavezni parametri
400invalid_oibOIB operatera ili kupca nije valjan (11 znamenki, kontrolna)
400invalid_tax_ratePDV stopa mora biti 25, 13, 5, ili 0
400duplicate_invoiceRačun s tim brojem već postoji u tom poslovnom prostoru
422fiscalization_failedPorezna odbila račun (detalji u message)
503porezna_unavailablePorezna trenutno nedostupna — pokušajte ponovno

Primjer error responsa

400 Bad Request
{
  "error": {
    "code": "invalid_oib",
    "message": "OIB operatera '1234567890' nije valjan. OIB mora imati 11 znamenki i ispravnu kontrolnu znamenku.",
    "doc_url": "https://fiskalapi.hr/dokumentacija/fiskalizacija"
  }
}

Sandbox testiranje

U sandbox okruženju možete koristiti ove OIB-ove za simulaciju različitih scenarija:

OIBPonašanje
11111111111Uvijek uspješna fiskalizacija
22222222222Simulira timeout Porezne (503)
33333333333Porezna odbija račun (422)
44444444444Simulira spor odgovor (5+ sekundi)

Sljedeći koraci