Elektronska faktura u XML formatu: kako izgleda

Otvoriš SEF, klikneš "Pošalji" i sistem ti vrati grešku: Element 'cbc:ID' is not valid. Ako ti ovo nešto znači, znaš o čemu pričamo. Ako ti ne znači — verovatno te je neko pitao "možeš li da mi pošalješ XML fakture umesto PDF-a" i ti si se izgubio.
E-faktura u Srbiji nije PDF koji si skenirao i poslao mejlom. To je strukturisan XML fajl po UBL 2.1 standardu, sa tačno propisanim poljima, redosledom i šifarnicima. SEF (Sistem elektronskih faktura Ministarstva finansija) prihvata isključivo taj format. Kada Fakturko ili bilo koji drugi alat "šalje fakturu na SEF", zapravo generiše XML, validira ga prema XSD šemi i šalje preko REST API-ja.
U ovom tekstu ćeš videti kako tačno izgleda taj XML iznutra, koja polja su obavezna, gde preduzetnici najčešće greše i zašto je ručno kucanje XML-a praktično nemoguće za bilo koga ko nema developera pored sebe.
Šta je UBL 2.1 i zašto baš taj format
UBL (Universal Business Language) 2.1 je međunarodni standard za elektronske poslovne dokumente koji održava OASIS. Srbija ga je usvojila kroz Zakon o elektronskom fakturisanju, a SEF prihvata isključivo XML fajlove u skladu sa srpskom verzijom tog standarda (tzv. SRBDT — srpska specifikacija bazirana na evropskoj normi EN 16931).
U praksi to znači da svaka e-faktura ima istu strukturu bez obzira da li je šalje paušalac iz Novog Sada ili velika firma iz Beograda. Ta uniformnost je cela poenta — sistem može mašinski da pročita fakturu, izvuče iznos PDV-a, identifikuje kupca po PIB-u i automatski je proknjiži kod primaoca. Sa PDF-om to ne ide.
Ono što je važno zapamtiti: UBL XML nije isto što i e-faktura koju vidiš u SEF interfejsu. Ono što vidiš u browseru je vizuelni prikaz koji SEF generiše iz XML-a. Pravi dokument je XML, a PDF prikaz je samo zarad ljudi.
Kako konkretno izgleda XML e-fakture
Da skratimo priču — evo skraćenog primera kako izgleda validan UBL 2.1 XML za izlaznu fakturu od paušalca prema DOO klijentu:
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:mfin.gov.rs:srbdt:2022</cbc:CustomizationID>
<cbc:ID>2026-0042</cbc:ID>
<cbc:IssueDate>2026-06-25</cbc:IssueDate>
<cbc:DueDate>2026-07-25</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>RSD</cbc:DocumentCurrencyCode>
<cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyName><cbc:Name>Marko Marković PR</cbc:Name></cac:PartyName>
<cac:PartyTaxScheme>
<cbc:CompanyID>123456789</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cac:PartyName><cbc:Name>Kupac DOO</cbc:Name></cac:PartyName>
<cac:PartyTaxScheme>
<cbc:CompanyID>987654321</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="H87">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="RSD">50000.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Konsultantske usluge — jun 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>O</cbc:ID>
<cbc:Percent>0</cbc:Percent>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="RSD">50000.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="RSD">50000.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="RSD">50000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="RSD">50000.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="RSD">50000.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
</Invoice>
Ovo je skraćena verzija. Realan validan XML za SEF ima dodatno: adresu prodavca i kupca po elementima (StreetName, CityName, PostalZone, IdentificationCode), žiro račun, JBKJS ako je kupac korisnik javnih sredstava, sekciju TaxTotal sa razrađenim PDV grupama, polja OrderReference ako se faktura veže za narudžbenicu, i još desetak detalja koji zavise od slučaja.
Ako gledaš ovo i pomisliš "ovo ne mogu da kucam ručno svaki mesec" — tačno tako. Niko zdrav ne kuca XML rukom.
Obavezna polja koja SEF proverava
SEF validira svaku dolaznu fakturu prema XSD šemi i poslovnim pravilima. Ako bilo šta nedostaje ili je u pogrešnom formatu, faktura se odbija pre nego što stigne do primaoca. Evo polja koja su obavezna u praktično svakom slučaju:
| Polje | Šta sadrži | Tipična greška |
|---|---|---|
CustomizationID |
Identifikator srpske SRBDT specifikacije | Korišćenje generičke EN 16931 verzije |
ID (broj fakture) |
Jedinstven broj u tvojoj evidenciji | Duplikat broja iz prošle godine |
IssueDate |
Datum izdavanja (YYYY-MM-DD) | Format DD.MM.YYYY |
InvoiceTypeCode |
380 za fakturu, 381 za knjižno odobrenje, 386 za avans | Pogrešan kod za avansni račun |
DocumentCurrencyCode |
RSD, EUR, USD (ISO 4217) | "din" umesto "RSD" |
| PIB prodavca i kupca | CompanyID u PartyTaxScheme |
PIB sa razmacima ili crticama |
| Naziv i adresa obe strane | PartyName, PostalAddress |
Nedostaje grad ili poštanski broj |
| PDV kategorija stavke | "S" (standardna), "O" (oslobođen), "AE" (reverse charge) | Paušalac stavi "S" umesto "O" |
Iznosi (LegalMonetaryTotal) |
Neto, PDV, ukupno za plaćanje | Zbir stavki ne odgovara totalu (zaokruživanje) |
Posebno bolno mesto je PDV kategorija. Paušalac koji nije u sistemu PDV-a mora da koristi šifru "O" (oslobođeno) i da navede osnov oslobođenja — najčešće referencu na član Zakona o PDV-u koji ga oslobađa. Ako stavi "S" sa 0%, SEF će odbiti fakturu jer to nije konzistentno (standardna stopa ne može biti 0%).
Drugi čest problem: zaokruživanje. Ako imaš tri stavke od po 1.333,33 RSD, zbir je 3.999,99 — a ti si napisao ukupno 4.000,00. SEF to vidi i baca grešku jer iznosi moraju da se slažu na dve decimale tačno.
Šifarnici i kodovi koje moraš da poznaješ
UBL XML se oslanja na nekoliko šifarnika. Ako kucaš ručno, moraš da ih znaš napamet ili da ih svaki put proveravaš. Najvažniji:
Tip dokumenta (InvoiceTypeCode):
380— standardna faktura381— knjižno odobrenje (credit note)383— knjižno zaduženje (debit note)386— avansni račun
PDV kategorije (ClassifiedTaxCategory/ID):
S— standardna stopa (20%)R— snižena stopa (10%)Z— nulta stopaO— oslobođeno (paušalci, mali obveznici van sistema PDV-a)E— oslobođeno bez prava odbitkaAE— reverse charge (obrnuto obračunavanje)SS— posebne procedure
Jedinice mere (unitCode):
H87— komadHUR— satDAY— danMON— mesecKGM— kilogramMTR— metar
Valute: uvek tri slova po ISO 4217 — RSD, EUR, USD, CHF. Bez izuzetka.
Ovo je samo deo. Pun spisak je u tehničkoj dokumentaciji SEF-a (efaktura.gov.rs/tehnicka-uputstva) i menja se s vremena na vreme — ministarstvo objavi novu verziju šifarnika i sve aplikacije moraju da se ažuriraju. Ako koristiš sopstveni Excel ili neki stari alat, lako se desi da pošalješ kod koji više ne važi.
Tri scenarija iz prakse
Paušalac koji radi za jednu firmu mesečno. Marko je IT konsultant, paušalac, ima jednog klijenta — DOO koji mu plaća 80.000 RSD mesečno. Svakog 1. u mesecu treba da izda fakturu. Bez alata: otvori SEF portal, klikne "Nova faktura", popuni 15 polja, izabere PDV kategoriju "O", upiše osnov oslobođenja, pošalje. Ako je nešto pogrešno — vrati se i ispravi. Sa alatom koji generiše XML: postavi recurring jednom i Faktor svakog 1. u mesecu napravi i pošalje fakturu.
DOO sa 30 faktura mesečno i raznim klijentima. Mala agencija ima i domaće i strane klijente. Domaći idu na SEF u RSD sa 20% PDV-a, strani idu kao izvoz usluga sa kodom "AE" ili "Z" zavisno od slučaja. Svaka greška u kategoriji znači problem za PDV prijavu na kraju kvartala. Ovde XML mora biti tačan ne samo zbog SEF-a već i zbog kasnijih izveštaja.
Frilenser sa stranim klijentom koji traži e-fakturu. Ana radi za firmu iz Nemačke koja je u Peppol mreži i traži UBL XML. Srpski SEF format je sličan ali ne identičan evropskom. Ovde mora ručno da prilagodi CustomizationID i neka polja koja su specifična za međunarodnu razmenu. Bez alata koji to podržava — patnja.
Gde se najčešće greši kada se XML kreira ručno ili u Excel-u
Pokušaj da generišeš UBL XML iz Excel makroa ili nekog domaćeg "rešenja" obično pukne na sledećim mestima:
- Encoding nije UTF-8. Excel često sačuva fajl kao Windows-1250 ili ANSI. SEF traži strogo UTF-8 sa deklaracijom na vrhu. Ćirilica ili "š", "č", "ž" se pojave kao smeće.
- XML nije validan prema XSD šemi. Redosled elemenata u UBL-u je strogo definisan — ne možeš prvo
IssueDatepaID. Excel makroi to često ne poštuju. - Decimalni separator. Srpski Excel koristi zarez (50000,00), XML traži tačku (50000.00). Jedno nepokriveno polje i ceo fajl je nevažeći.
- Datumi u pogrešnom formatu. UBL traži ISO 8601:
2026-06-25. Ne25.06.2026.ni25/6/2026. - Nedostaje
CustomizationIDza srpski profil. Bez tog tačnog stringa, SEF te vraća i pre nego što pogleda sadržaj. - Pogrešan PIB format. Devet cifara, bez razmaka, bez prefiksa "RS". Ako imaš matični broj i PIB pomešane — odbacuje.
- Nedostaje JBKJS kod javnih korisnika. Ako fakturišeš opštini, ministarstvu ili javnom preduzeću, moraš da staviš njihov Jedinstveni broj korisnika javnih sredstava. Bez toga faktura ne dolazi do primaoca.
Po podacima koje je Ministarstvo finansija objavljivalo o radu SEF-a, značajan deo faktura u prvim mesecima primene odbijan je upravo zbog tehničkih grešaka u XML strukturi — što je očekivano kada se ručno radi sa formatom koji nije dizajniran za ljudsko unošenje.
API komunikacija sa SEF-om: šta se zapravo dešava
Generisanje XML-a je samo prvi korak. Drugi korak je da se taj fajl pošalje na SEF preko zvaničnog REST API-ja. To ide ovako:
- Aplikacija autentifikuje se ka SEF-u pomoću API ključa koji preduzetnik uzme sa svog SEF naloga (sekcija "Podešavanja > API menadžment").
- XML fajl se šalje kao POST request na endpoint
/api/publicApi/sales-invoice/ubl. - SEF odgovara statusom — prihvaćeno, odbačeno sa greškom, ili "u obradi".
- Ako je prihvaćeno, SEF generiše svoj interni ID i šalje fakturu kupcu (preko SEF-a ako je i on registrovan, ili obaveštava ga mejlom).
- Status fakture (poslata, viđena, prihvaćena, odbijena, plaćena) može se pratiti preko istog API-ja.
Za ulazne fakture princip je obrnut — aplikacija periodično poziva /api/publicApi/purchase-invoice i povlači sve nove fakture koje su ti drugi poslali. Bez alata, ovo gledaš ručno kroz SEF interfejs i klikaš "prihvati/odbij" jedan po jedan.
Prakično rešenje: kako ovo izgleda u Fakturku
U Fakturku ti otvoriš novu fakturu, izabereš klijenta iz baze (ili kažeš Faktoru preko Telegrama "pošalji Žiki istu fakturu kao prošli mesec"), dodaš stavke i klikneš "Pošalji na SEF". Sve što je opisano u ovom tekstu — generisanje UBL 2.1 XML-a po srpskom SRBDT profilu, validacija prema XSD šemi, ispravan CustomizationID, šifarnici PDV kategorija, formatiranje datuma i iznosa, autentifikacija ka SEF API-ju, slanje i praćenje statusa — sve to se dešava u pozadini za nekoliko sekundi.
Na Pro planu funkcioniše puna dvosmerna integracija: izlazne fakture idu automatski, ulazne sa SEF-a stižu u Inbox gde ih prihvataš ili odbijaš jednim klikom, a recurring fakture se same kreiraju i šalju mesečno bez tvog dodirivanja sistema. Free plan podržava manuelno slanje za one koji imaju 2-3 fakture mesečno i ne treba im automatika.
Završno
UBL 2.1 XML nije nešto što ćeš sutra kucati ručno. To je tehnički standard dizajniran za mašine, sa desetinama polja, šifarnika i pravila validacije koja se menjaju. Razumevanje kako izgleda iznutra je korisno — bar znaš zašto SEF nešto odbija — ali svakodnevno fakturisanje je posao za alat koji to radi umesto tebe, dok ti pišeš predračun za sledećeg klijenta.
Ako još uvek otvaraš SEF portal i ručno kucaš svaku fakturu, probaj Fakturko besplatno na fakturko.io/register — prva faktura ide na SEF za dva minuta.
Česta pitanja
Šta je tačno e-faktura u Srbiji i u kom formatu se šalje?
E-faktura u Srbiji nije PDF, već strukturisan XML fajl izrađen po UBL 2.1 standardu, konkretno po srpskoj specifikaciji SRBDT baziranoj na evropskoj normi EN 16931. SEF (Sistem elektronskih faktura Ministarstva finansija) prihvata isključivo taj XML format i validira ga prema XSD šemi. Ono što vidiš u SEF interfejsu je samo vizuelni prikaz koji sistem generiše iz XML-a — pravi dokument je XML. PDF skeniran i poslat mejlom ne smatra se e-fakturom.
Koja polja su obavezna u XML e-fakturi koju SEF prihvata?
Obavezna polja uključuju CustomizationID (oznaka srpske SRBDT specifikacije), ID (jedinstven broj fakture), IssueDate u formatu YYYY-MM-DD, InvoiceTypeCode (380 za fakturu, 381 za knjižno odobrenje, 386 za avans), DocumentCurrencyCode po ISO 4217 (RSD, EUR, USD), PIB prodavca i kupca, pun naziv i adresu obe strane, PDV kategoriju stavke i tačne iznose u sekciji LegalMonetaryTotal. Ako bilo koje od ovih polja nedostaje ili je u pogrešnom formatu, SEF odbija fakturu pre nego što stigne do primaoca. Zato je validacija prema XSD šemi presudna.
Koju PDV kategoriju paušalac treba da stavi u e-fakturi?
Paušalac koji nije u sistemu PDV-a mora da koristi kategoriju 'O' (oslobođen) u polju ClassifiedTaxCategory, sa procentom 0. Najčešća greška je da paušalac stavi 'S' (standardna stopa), što SEF prepoznaje kao da obračunava PDV — a paušalac na to nema pravo. Pored kategorije 'O', postoji i 'AE' za reverse charge (najčešće kod usluga ka inostranstvu) i 'S' isključivo za obveznike PDV-a. Pogrešna kategorija znači odbijenu fakturu ili kasnije probleme sa knjiženjem kod kupca.
Da li mogu sam da napravim XML e-fakture bez softvera?
Teoretski da, praktično ne. Validan UBL 2.1 XML za SEF ima desetine obaveznih polja sa tačno propisanim redosledom, namespace-ovima, šifarnicima i pravilima zaokruživanja iznosa — i mora da prođe XSD validaciju i poslovna pravila SEF-a. Ručno kucanje je realno samo za nekoga ko je developer ili ima developera pored sebe, a i tada je rizik od grešaka ogroman. Za svakodnevno fakturisanje koriste se alati poput Fakturka koji automatski generišu XML, validiraju ga i šalju preko REST API-ja na SEF.
Koje su najčešće greške zbog kojih SEF odbija e-fakturu?
Tipične greške su pogrešan format datuma (DD.MM.YYYY umesto YYYY-MM-DD), valuta upisana kao 'din' umesto 'RSD', PIB sa razmacima ili crticama, duplikat broja fakture iz prethodne godine, pogrešan InvoiceTypeCode (npr. 380 umesto 386 za avansni račun) i pogrešna PDV kategorija (paušalac stavi 'S' umesto 'O'). Česta je i razlika između zbira stavki i ukupnog iznosa zbog zaokruživanja, kao i nedostatak elemenata adrese poput grada ili poštanskog broja. Sve te greške SEF detektuje kroz XSD validaciju i odbija fakturu pre dostave primaocu.