Anaf v1 / Utilitare cross-zonă
Validează orice document
Trimiţi un XML şi nu spui ce e: ruta detectează singură tipul şi aplică validarea potrivită lui. Acelaşi verdict pe care l-ai primi de pe ruta dedicată produsului.
POST
https://oneapi.ro/api/anaf/v1/valideaza
Corpul cererii
Corpul cererii e documentul întreg, trimis brut (Content-Type: application/xml) — nu un obiect cu câmpuri.
Factură e-Factura
Declarație D394
Notificare e-Transport
Declarație SAF-T D406
Notă de credit
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 document ANAF (XML brut sau base64, în corpul cererii), îi detectează automat tipul și îl rutează la validatorul produsului potrivit — e-Factura, e-Transport, SAF-T sau o declarație „D". Apelul „validează orice e asta": nu trebuie să știi dinainte ce trimiți.
- Diferența față de rutele de validare per produs (
efactura/v1/validate,declaratii/v1/{form}/validate…): aici nu alegi tu validatorul — îl alege detectorul, după root + namespace. - Un XML invalid sau un document nerecunoscut nu e o eroare a serverului: răspunsul e
404cudocument_nerecunoscut(formatul de eroare comun). - Zero retenție: documentul primit nu se scrie și nu se loghează.
La ce folosește
- Validarea unui fișier primit fără a-i cunoaște dinainte tipul, într-un singur apel.
- Un webhook/uploader generic care acceptă orice document ANAF și îl verifică pe loc.
Structura răspunsului
CâmpTipDescriere
data.tip
string
Tipul detectat:
e-Factura, e-Transport, SAF-T (D406) sau codul formularului „D" (ex. D390).
data.produs
string
Produsul umbrelei care l-a validat:
efactura, etransport, saft sau declaratii.
data.valid
boolean
Verdictul:
true/false, sau null când validarea nu a putut rula (ex. schema indisponibilă).
data.schema_version
string
Schema/standardul folosit la validare, când e disponibil (ex.
FACT1 sau d390_v3.xsd); altfel null.
data.errors
array
Erorile de validare
{cod,mesaj,camp}.
data.warnings
array
Avertismentele neblocante
{cod,mesaj,camp}.
meta.generat_la
string
Momentul la care s-a construit răspunsul (ISO 8601).
meta.request_id
string
Identificatorul cererii. Dă-l când raportezi o problemă: după el se găseşte răspunsul.
Exemple de răspuns
body: @efactura.xml
POSThttps://oneapi.ro/api/anaf/v1/valideaza
{
"data": {
"tip": "e-Factura",
"produs": "efactura",
"valid": true,
"schema_version": "FACT1",
"errors": [],
"warnings": []
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d835-714f-acc5-2b4923e048f1"
}
}
body: @d394.xml
POSThttps://oneapi.ro/api/anaf/v1/valideaza
{
"data": {
"tip": "D394",
"produs": "declaratii",
"valid": true,
"schema_version": "d394_v5.xsd",
"errors": [],
"warnings": []
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d847-7282-b38c-67a70761e997"
}
}
body: @etransport.xml
POSThttps://oneapi.ro/api/anaf/v1/valideaza
{
"data": {
"tip": "e-Transport",
"produs": "etransport",
"valid": true,
"schema_version": null,
"errors": [],
"warnings": []
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d851-72b2-aa5d-cba6e2f8cfd3"
}
}
body: @saft-d406.xml
POSThttps://oneapi.ro/api/anaf/v1/valideaza
{
"data": {
"tip": "SAF-T (D406)",
"produs": "saft",
"valid": true,
"schema_version": null,
"errors": [],
"warnings": []
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d85d-73df-b664-ff434090510b"
}
}
body: @efactura-stornare.xml
POSThttps://oneapi.ro/api/anaf/v1/valideaza
{
"data": {
"tip": "e-Factura",
"produs": "efactura",
"valid": true,
"schema_version": "FACT1",
"errors": [],
"warnings": []
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d86c-72c9-a97d-778062d35e1f"
}
}
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. |
| 404 | negasit | XML invalid sau document ANAF nerecunoscut (root/namespace necunoscut). |
| 422 | xml_invalid | Corpul cererii lipseşte sau nu are forma aşteptată. |
| 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": "Corpul cererii lipseşte sau nu are forma aşteptată.",
"camp": null,
"request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
}
}