Anaf v1 / Utilitare cross-zonă
Detectează documentul
Spune ce document ANAF ai trimis, fără să-l validezi: tipul, produsul din care face parte, elementul rădăcină şi namespace-ul. Util când primeşti XML-uri de la terţi şi nu ştii pe ce rută să le duci.
POST
https://oneapi.ro/api/anaf/v1/detect
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
Fișier SAF-T
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 XML oarecare în corpul cererii și spune ce document ANAF este, pe baza elementului root și a namespace-ului: e-Factura (
Invoice/CreditNoteUBL), e-Transport, SAF-T / D406 sau o declarație „D" (mapată la codul formularului, ex.D390). - Util ca prim pas într-un flux care primește fișiere eterogene: afli produsul și ruta de validare potrivită (
ruta_validare) fără să ghicești tipul după numele fișierului. - 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: XML-ul primit nu se scrie și nu se loghează.
La ce folosește
- Rutarea automată a unui fișier primit către validatorul/parserul produsului corect.
- Verificarea rapidă că un fișier e chiar tipul așteptat înainte de procesare.
Structura răspunsului
CâmpTipDescriere
data.tip
string
Tipul documentului:
e-Factura, e-Transport, SAF-T (D406) sau codul formularului „D" (ex. D390).
data.produs
string
Produsul umbrelei care îl tratează:
efactura, etransport, saft sau declaratii.
data.root
string
Elementul root al XML-ului.
data.namespace
string
Namespace-ul XML al root-ului (poate fi
null).
data.ruta_validare
string
Calea rutei care validează acest tip de document (ex.
/anaf/v1/efactura/validate), gata de apelat pe acelaşi host. null pentru o declaraţie recunoscută pe care nu o validăm.
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.
data.ruta_conversie
Pentru CII: ruta care îl transformă în CIUS-RO. Apare DOAR la CII, fiindcă e singurul format pe care nu-l validăm pe cont propriu — n-avem Schematronul profilului Factur-X — dar îl putem converti şi încorpora.
Exemple de răspuns
body: @efactura.xml
POSThttps://oneapi.ro/api/anaf/v1/detect
{
"data": {
"tip": "e-Factura",
"produs": "efactura",
"root": "Invoice",
"namespace": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"ruta_validare": "/anaf/v1/efactura/validate"
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d7bb-726f-9bf0-4d8d26b22abf"
}
}
body: @d394.xml
POSThttps://oneapi.ro/api/anaf/v1/detect
{
"data": {
"tip": "D394",
"produs": "declaratii",
"root": "declaratie394",
"namespace": "mfp:anaf:dgti:d394:declaratie:v5",
"ruta_validare": "/anaf/v1/declaratii/D394/validate"
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d7ca-70a2-9f5a-08e8a0b0fc92"
}
}
body: @saft-d406.xml
POSThttps://oneapi.ro/api/anaf/v1/detect
{
"data": {
"tip": "SAF-T (D406)",
"produs": "saft",
"root": "AuditFile",
"namespace": "mfp:anaf:dgti:d406t:declaratie:v1",
"ruta_validare": "/anaf/v1/saft/validate"
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d7ce-7211-af3d-615141729a0a"
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | modul_interzis | Tokenul nu are acces la modulul rutei. |
| 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"
}
}