POST/v1/einvoices/send

Slanje eRačuna

Pošaljite strukturirani eRačun (B2B ili B2G) kroz FINA infrastrukturu. FiskalAPI generira UBL 2.1 XML, potpisuje ga, i dostavlja primatelju.

Od 1. siječnja 2026.

eRačuni postaju obavezni za sve B2B i B2G transakcije u Hrvatskoj. Svaki račun prema drugoj firmi ili državnoj instituciji mora biti poslan kao strukturirani eRačun kroz ovlaštenog posrednika.

eRačun vs Fiskalizacija

eRačun (F2) — za B2B i B2G, šalje se asinkrono kroz FINA infrastrukturu.
Fiskalizacija (F1) — za gotovinske/kartične račune, šalje se realtime Poreznoj.
Ako fakturirate firmama i primate gotovinu/karticu, trebate oba.

Request

POST /v1/einvoices/sendapplication/json
{
  "invoice_number": "ER-2026-0001",
  "issue_date": "2026-01-04",
  "due_date": "2026-01-19",

  "seller": {
    "oib": "12345678901",
    "name": "Moja Firma d.o.o.",
    "address": "Ilica 1",
    "city": "Zagreb",
    "postal_code": "10000",
    "country": "HR",
    "iban": "HR1234567890123456789",
    "email": "[email protected]"
  },

  "buyer": {
    "oib": "98765432109",
    "name": "Kupac d.o.o.",
    "address": "Vukovarska 2",
    "city": "Split",
    "postal_code": "21000",
    "country": "HR",
    "email": "[email protected]"
  },

  "items": [
    {
      "name": "Usluge razvoja softvera",
      "description": "Razvoj web aplikacije - siječanj 2026",
      "quantity": 40,
      "unit": "HUR",
      "unit_price": 75.00,
      "tax_rate": 25,
      "kpd": "J62.01.11"
    },
    {
      "name": "Hosting i održavanje",
      "quantity": 1,
      "unit": "MON",
      "unit_price": 200.00,
      "tax_rate": 25,
      "kpd": "J63.11.12"
    }
  ],

  "payment_reference": "HR00 2026-0001",
  "note": "Hvala na suradnji!",

  "attachments": [
    {
      "filename": "specifikacija.pdf",
      "mime_type": "application/pdf",
      "data": "base64_encoded_content..."
    }
  ],

  "metadata": {
    "project_id": "PRJ-123",
    "contract": "UGV-2025-456"
  }
}

Seller objekt (prodavatelj)

ParametarTipObaveznoOpis
oibstringDaVaš OIB (11 znamenki)
namestringDaPuni naziv tvrtke
addressstringDaUlica i kućni broj
citystringDaGrad
postal_codestringDaPoštanski broj
countrystringDaISO kod države (HR)
ibanstringDaIBAN za primanje uplate
emailstringNeEmail za kontakt

Buyer objekt (kupac)

Isti format kao seller, bez IBAN-a (nije obavezan za kupca).

Stavke računa (items)

ParametarTipObaveznoOpis
namestringDaNaziv stavke
descriptionstringNeDetaljniji opis
quantitynumberDaKoličina
unitstringDaJedinica mjere (UN/ECE kod)
unit_pricenumberDaCijena bez PDV-a (EUR)
tax_ratenumberDaPDV stopa (25, 13, 5, 0)
kpdstringDa*KPD šifra — obavezno za B2G!

Jedinice mjere (UN/ECE)

Najčešće korištene jedinice:

KodZnačenjePrimjer
C62Komad (piece)Proizvodi, licence
HURSat (hour)Konzultacije, rad
DAYDanDnevnice, najam
MONMjesecPretplate, SaaS
KGMKilogramTežinski proizvodi
MTRMetarMaterijali
LTRLitraTekućine

Response

Uspješan odgovor (202 Accepted)

202 Accepted
{
  "id": "einv_xyz789abc123",
  "status": "pending",
  "invoice_number": "ER-2026-0001",

  "seller_oib": "12345678901",
  "buyer_oib": "98765432109",

  "amounts": {
    "subtotal": 3200.00,
    "tax_25": 800.00,
    "total": 4000.00,
    "currency": "EUR"
  },

  "submitted_at": "2026-01-04T14:30:00Z",
  "estimated_delivery": "2026-01-04T14:35:00Z",

  "tracking_url": "https://api.fiskalapi.hr/v1/einvoices/einv_xyz789/track",
  "xml_url": "https://api.fiskalapi.hr/v1/einvoices/einv_xyz789/xml",
  "pdf_url": "https://api.fiskalapi.hr/v1/einvoices/einv_xyz789/pdf"
}

Asinkrono slanje

eRačuni se šalju asinkrono. Status pending znači da je račun prihvaćen i čeka dostavu primatelju. Koristite webhook ili polling za praćenje statusa.

Statusi eRačuna

StatusZnačenjeSljedeći koraci
pendingČeka slanje FINA-iČekajte, automatski prelazi u submitted
submittedPoslano FINA-iČeka dostavu primatelju
deliveredDostavljeno primateljuPrimatelj može prihvatiti/odbiti
acceptedPrimatelj prihvatioRačun je uspješno dostavljen
rejectedPrimatelj odbioProvjerite razlog odbijanja
failedGreška pri slanjuProvjerite error i pokušajte ponovno

Primjeri koda

cURL

Bash
curl -X POST https://sandbox.fiskalapi.hr/v1/einvoices/send \
  -H "Authorization: Bearer sk_sandbox_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "invoice_number": "ER-2026-0001",
    "issue_date": "2026-01-04",
    "due_date": "2026-01-19",
    "seller": {
      "oib": "12345678901",
      "name": "Moja Firma d.o.o.",
      "address": "Ilica 1",
      "city": "Zagreb",
      "postal_code": "10000",
      "country": "HR",
      "iban": "HR1234567890123456789"
    },
    "buyer": {
      "oib": "98765432109",
      "name": "Kupac d.o.o.",
      "address": "Vukovarska 2",
      "city": "Split",
      "postal_code": "21000",
      "country": "HR"
    },
    "items": [{
      "name": "Konzultantske usluge",
      "quantity": 10,
      "unit": "HUR",
      "unit_price": 100.00,
      "tax_rate": 25,
      "kpd": "M70.22.11"
    }]
  }'

JavaScript (Node.js)

JavaScript
import FiskalAPI from '@fiskalapi/node';

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

try {
  const einvoice = await fiskal.einvoices.send({
    invoice_number: 'ER-2026-0001',
    issue_date: '2026-01-04',
    due_date: '2026-01-19',

    seller: {
      oib: '12345678901',
      name: 'Moja Firma d.o.o.',
      address: 'Ilica 1',
      city: 'Zagreb',
      postal_code: '10000',
      country: 'HR',
      iban: 'HR1234567890123456789'
    },

    buyer: {
      oib: '98765432109',
      name: 'Kupac d.o.o.',
      address: 'Vukovarska 2',
      city: 'Split',
      postal_code: '21000',
      country: 'HR'
    },

    items: [
      {
        name: 'Usluge razvoja softvera',
        quantity: 40,
        unit: 'HUR',
        unit_price: 75.00,
        tax_rate: 25,
        kpd: 'J62.01.11'
      }
    ],

    payment_reference: 'HR00 2026-0001'
  });

  console.log('eRačun ID:', einvoice.id);
  console.log('Status:', einvoice.status);
  console.log('Ukupno:', einvoice.amounts.total, 'EUR');
  console.log('PDF:', einvoice.pdf_url);
  console.log('XML:', einvoice.xml_url);

} catch (error) {
  console.error(`Greška ${error.code}: ${error.message}`);
}

Python

Python
from fiskalapi import FiskalAPI, FiskalAPIError
import os

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

try:
    einvoice = fiskal.einvoices.send(
        invoice_number='ER-2026-0001',
        issue_date='2026-01-04',
        due_date='2026-01-19',

        seller={
            'oib': '12345678901',
            'name': 'Moja Firma d.o.o.',
            'address': 'Ilica 1',
            'city': 'Zagreb',
            'postal_code': '10000',
            'country': 'HR',
            'iban': 'HR1234567890123456789'
        },

        buyer={
            'oib': '98765432109',
            'name': 'Kupac d.o.o.',
            'address': 'Vukovarska 2',
            'city': 'Split',
            'postal_code': '21000',
            'country': 'HR'
        },

        items=[{
            'name': 'Usluge razvoja softvera',
            'quantity': 40,
            'unit': 'HUR',
            'unit_price': 75.00,
            'tax_rate': 25,
            'kpd': 'J62.01.11'
        }],

        payment_reference='HR00 2026-0001'
    )

    print(f'eRačun ID: {einvoice.id}')
    print(f'Status: {einvoice.status}')
    print(f'Ukupno: {einvoice.amounts.total} EUR')
    print(f'PDF: {einvoice.pdf_url}')

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

Webhooks

Kada se status eRačuna promijeni, FiskalAPI šalje webhook na vaš endpoint:

Webhook payload
{
  "event": "einvoice.delivered",
  "einvoice_id": "einv_xyz789abc123",
  "invoice_number": "ER-2026-0001",
  "status": "delivered",
  "delivered_at": "2026-01-04T14:32:15Z",
  "recipient_system": "FINA eRačun"
}

Dostupni webhook eventi:

  • einvoice.submitted — poslano FINA-i
  • einvoice.delivered — dostavljeno primatelju
  • einvoice.accepted — primatelj prihvatio
  • einvoice.rejected — primatelj odbio
  • einvoice.failed — greška pri slanju

Greške

HTTPKodOpis
400invalid_requestNeispravan JSON ili nedostaju parametri
400invalid_oibOIB prodavatelja ili kupca nije valjan
400invalid_ibanIBAN nije valjan
400missing_kpdKPD šifra obavezna za B2G račune
422buyer_not_registeredPrimatelj nije registriran za eRačune
503fina_unavailableFINA sustav trenutno nedostupan

KPD šifre

KPD (Klasifikacija proizvoda po djelatnostima) šifre su obavezne za B2G računei preporučene za B2B. Koristite naš KPD pretraživač ili API endpoint /v1/kpd/search za pronalaženje ispravne šifre.

Sljedeći koraci