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

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

D406 trimestrial

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

D406 anual

saft-d406-anual.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 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"
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422xml_invalidXML care nu se poate parsa sau nu e un fișier SAF-T (root <AuditFile>).
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": "XML care nu se poate parsa sau nu e un fișier SAF-T (root ``).",
        "camp": null,
        "request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
    }
}