Anaf v1 / SAF-T (D406)
Citește D406
Dintr-un D406 scoate antetul şi un rezumat: perioada declarată, societatea, numărul de înregistrări pe fiecare secţiune. Fişierul întreg nu se întoarce — are zeci de mii de rânduri.
POST
https://oneapi.ro/api/anaf/v1/saft/parse
Corpul cererii
Corpul cererii e documentul întreg, trimis brut (Content-Type: application/xml) — nu un obiect cu câmpuri.
Declarație D406
D406 trimestrial
D406 anual
Parametri de interogare
Ruta nu acceptă parametri de interogare.
Cum se comportă
- Documentul se poate trimite şi ca fişier:
multipart/form-datacu câmpulfisier(curl -F fisier=@document.xml), în locul corpului brut. Conţinutul fişierului devine corpul cererii, deci rezultatul e identic; opţiunile rămân în query string, iar alt câmp de formular lângăfisierdă422 camp_necunoscut. - Primește un D406 și întoarce un JSON de business: antetul complet (firmă, perioadă, monedă, software) plus un rezumat pe secțiuni — numărători (conturi, clienți, furnizori, produse, jurnale, facturi, plăți…) și totaluri (debit/credit).
- Fiindcă un fișier real e mare, întoarcem un rezumat structurat, nu o transcriere element-cu-element (care ar fi enormă). Suficient pt a înțelege forma și cifrele-cheie ale fișierului.
- Zero retenție: parsarea e stateless, in-memory.
La ce folosește
- Inspectarea rapidă a unui D406 primit/generat: ce perioadă acoperă, câte documente, ce totaluri.
Structura răspunsului
CâmpTipDescriere
data.header
object
Antetul: firmă, adresă, perioadă, monedă, software, versiune SAF-T.
data.header.versiune
string
Versiunea setului de date sau a artefactului din care vin valorile.
data.header.tara
string
Ţara la care se referă valoarea.
data.header.data_creare
string
data.header.software.nume
string
Numele, aşa cum îl publică sursa.
data.header.software.id
string
data.header.software.versiune
string
Versiunea setului de date sau a artefactului din care vin valorile.
data.header.firma.cui
string
Codul de identificare fiscală, fără prefixul
RO.
data.header.firma.nume
string
Numele, aşa cum îl publică sursa.
data.header.firma.adresa.strada
string
data.header.firma.adresa.oras
string
data.header.firma.adresa.cod_postal
string
data.header.firma.adresa.tara
string
Ţara la care se referă valoarea.
data.header.moneda
string
Moneda în care sunt exprimate valorile.
data.header.perioada.luna_start
string
data.header.perioada.an_start
string
data.header.perioada.luna_end
string
data.header.perioada.an_end
string
data.header.segment
string
data.rezumat
object
Numărători și totaluri per secțiune (master_files, jurnal, documente).
data.rezumat.master_files.conturi
integer
data.rezumat.master_files.clienti
integer
data.rezumat.master_files.cote_tva
integer
data.rezumat.master_files.unitati_masura
integer
data.rezumat.jurnal.nr_jurnale
integer
data.rezumat.jurnal.nr_tranzactii
integer
data.rezumat.jurnal.total_debit
integer
data.rezumat.jurnal.total_credit
integer
data.rezumat.documente.facturi_vanzari
integer
meta.generat_la
string
Momentul la care s-a construit răspunsul (ISO 8601).
Exemple de răspuns
body: @saft-d406.xml
POSThttps://oneapi.ro/api/anaf/v1/saft/parse
{
"data": {
"header": {
"versiune": "2.4.9",
"tara": "RO",
"data_creare": "2026-10-05",
"software": {
"nume": "Exemplu Software SRL",
"id": "Exemplu ERP",
"versiune": "1.0"
},
"firma": {
"cui": "990000005",
"nume": "Exemplu Furnizor SRL",
"adresa": {
"strada": "Str. Memorandumului 28",
"oras": "Cluj-Napoca",
"cod_postal": "400114",
"tara": "RO"
}
},
"moneda": "RON",
"perioada": {
"luna_start": "9",
"an_start": "2026",
"luna_end": "9",
"an_end": "2026"
},
"segment": "1"
},
"rezumat": {
"master_files": {
"conturi": 3,
"clienti": 1,
"cote_tva": 1,
"unitati_masura": 1
},
"jurnal": {
"nr_jurnale": 1,
"nr_tranzactii": 2,
"total_debit": 2057,
"total_credit": 2057
},
"documente": {
"facturi_vanzari": 2
}
}
},
"meta": {
"generat_la": "2026-10-06T23: 59: 44+03: 00"
}
}
body: @saft-d406-trimestrial.xml
POSThttps://oneapi.ro/api/anaf/v1/saft/parse
{
"data": {
"header": {
"versiune": "2.4.9",
"tara": "RO",
"data_creare": "2026-10-05",
"software": {
"nume": "Exemplu Software SRL",
"id": "Exemplu ERP",
"versiune": "1.0"
},
"firma": {
"cui": "990000005",
"nume": "Exemplu Furnizor SRL",
"adresa": {
"strada": "Str. Memorandumului 28",
"oras": "Cluj-Napoca",
"cod_postal": "400114",
"tara": "RO"
}
},
"moneda": "RON",
"perioada": {
"luna_start": "7",
"an_start": "2026",
"luna_end": "9",
"an_end": "2026"
},
"segment": "1"
},
"rezumat": {
"master_files": {
"conturi": 3,
"clienti": 1,
"cote_tva": 1,
"unitati_masura": 1
},
"jurnal": {
"nr_jurnale": 1,
"nr_tranzactii": 2,
"total_debit": 2057,
"total_credit": 2057
},
"documente": {
"facturi_vanzari": 2
}
}
},
"meta": {
"generat_la": "2026-10-06T23: 59: 44+03: 00"
}
}
body: @saft-d406-anual.xml
POSThttps://oneapi.ro/api/anaf/v1/saft/parse
{
"data": {
"header": {
"versiune": "2.4.9",
"tara": "RO",
"data_creare": "2026-10-05",
"software": {
"nume": "Exemplu Software SRL",
"id": "Exemplu ERP",
"versiune": "1.0"
},
"firma": {
"cui": "990000005",
"nume": "Exemplu Furnizor SRL",
"adresa": {
"strada": "Str. Memorandumului 28",
"oras": "Cluj-Napoca",
"cod_postal": "400114",
"tara": "RO"
}
},
"moneda": "RON",
"perioada": {
"luna_start": "1",
"an_start": "2026",
"luna_end": "12",
"an_end": "2026"
},
"segment": "1"
},
"rezumat": {
"master_files": {
"conturi": 3,
"clienti": 1,
"cote_tva": 1,
"unitati_masura": 1
},
"jurnal": {
"nr_jurnale": 1,
"nr_tranzactii": 2,
"total_debit": 2057,
"total_credit": 2057
},
"documente": {
"facturi_vanzari": 2
}
}
},
"meta": {
"generat_la": "2026-10-06T23: 59: 44+03: 00"
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | feature_indisponibil | Planul curent nu include funcţia de care ţine ruta. |
| 422 | xml_invalid | XML care nu se poate parsa sau nu e un fișier SAF-T (root <AuditFile>). |
| 429 | cota_depasita | Cota lunară a planului a fost depăşită (vezi Retry-After). |
Erorile modulului Anaf au acelaşi plic ca restul platformei, cu două câmpuri în plus: {eroare: {cod, mesaj, camp, request_id}}. eroare.cod e stabil şi e cel după care ramifici în cod; la validare (422) codul e specific cazului: xml_invalid, xml_nu_e_factura, unitate_necunoscuta, luna_invalida ş.a. camp arată câmpul vinovat, când se poate identifica.
{
"eroare": {
"cod": "xml_invalid",
"mesaj": "XML care nu se poate parsa sau nu e un fișier SAF-T (root ``).",
"camp": null,
"request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
}
}