oneapi
Autentificare
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

efactura.xml application/xml · 4,0 KB — se trimite ca atare, în corpul cererii.

Declarație D394

d394.xml application/xml · 1,3 KB — se trimite ca atare, în corpul cererii.

Fișier SAF-T

saft-d406.xml application/xml · 17,5 KB — se trimite ca atare, în corpul cererii.

Parametri de interogare

Ruta nu acceptă parametri de interogare.

Cum se comportă

  • Documentul se poate trimite şi ca fişier: multipart/form-data cu câmpul fisier (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ă fisier dă 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/CreditNote UBL), 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 404 cu document_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"
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403modul_interzisTokenul nu are acces la modulul rutei.
404negasitXML invalid sau document ANAF nerecunoscut (root/namespace necunoscut).
422xml_invalidCorpul cererii lipseşte sau nu are forma aşteptată.
429cota_depasitaCota 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"
    }
}