Conformitate ANAF · SAF-T · D406

Validezi și citești fișierul SAF-T, printr-un apel.

Verifici un fișier SAF-T (D406) cu XSD-ul oficial ANAF (v2.4.9) plus propriile verificări, îl citești ca JSON cu sinteză pe secțiuni și îl randezi PDF — totul printr-un API, fără să stochezi nimic.

Nu construim declarația de la zero — fișierul îl produce ERP-ul sau programul tău de contabilitate. Noi îl validăm, îl despachetăm și îți dăm verdictul plus sinteza. Procesarea e în memorie; conținutul nu atinge un disc de-al nostru.

Un fișier intră, verdictul și sinteza iesPOST · în memorie · zero retenție
POST /saft/v1/validate
// multipart: fisier=D406.xml

// → { valid: true, standard: "D406", xsd_checked: "v2.4.9",
//     errors: [], warnings: [] }

POST /saft/v1/parse      // același fișier, despachetat

{
  "header":  { "firma": "RO12345678", "perioada": "2026-07", "versiune": "2.4.9" },
  "rezumat": {
    "master_files": { "conturi": 412, "clienti": 1380, "furnizori": 210 },
    "jurnal":       { "nr_jurnale": 8, "total_debit": 4820140.55, "total_credit": 4820140.55 }
  }
}
Ce ai la dispoziție Un endpoint POST, un fișier SAF-T, un răspuns. Fără cont de SPV la noi, fără fișier scris pe disc — doar validarea, sinteza și verdictul. Depunerea D406 în SPV rămâne la tine, cu credențialele tale.
Standard
D406 SAF-T
Namespace
mfp:anaf:dgti:d406t
XSD oficial
ANAF v2.4.9
Operațiuni
validate · parse · render (fără build)
Retenție
niciuna
01 Problema

Un fișier SAF-T valid e greu de verificat. Și nu e produsul tău.

Între fișierul pe care-l scoate ERP-ul și un D406 pe care ANAF îl acceptă la depunere se află un strat de reguli — schemă, structură, echilibru contabil — pe care cineva trebuie să-l verifice înainte.

A

Fișier imens

SAF-T nu e un formular, ci un XML cu rădăcina AuditFile și namespace-ul mfp:anaf:dgti:d406t:declaratie:v1 — master data, tot jurnalul de contabilitate și documentele sursă. Zeci de mii de linii, cu structură și ordine stricte.

B

Schema oficială v2.4.9

Structura se verifică împotriva XSD-ului oficial ANAF, versiunea 2.4.9. Un element lipsă, un tip greșit, o ordine încurcată, și fișierul e respins la validare.

C

Master files

Planul de conturi, clienții, furnizorii, tabela de taxe, produsele, stocurile, mijloacele fixe. Fiecare secțiune are propriile câmpuri obligatorii și coduri din nomenclatoare.

D

Jurnal contabil

Registrul-jurnal complet, cu toate înregistrările contabile. Echilibrul debit=credit trebuie să se închidă — o diferență, oricât de mică, și declarația e greșită.

E

Documente sursă

Facturile de vânzare și de cumpărare, plățile, mișcările de stoc. Legate de master files și de jurnal, cu coerență între totaluri și înregistrări.

F

Reguli care se schimbă

Schema se revizuiește, versiunile se succed (v2.4.9 azi), structura se ajustează. Ce trecea anul trecut poate pica azi, iar tu afli din refuz, nu din anunț.

Nimic din toate astea nu te diferențiazăClientul tău nu te plătește pentru că știi structura unui AuditFile sau că închizi la mână echilibrul debit=credit. Te plătește pentru produsul tău. Stratul de verificare e cost pur — de scris o dată și de întreținut pe termen nelimitat — și e exact ce mutăm de partea noastră.
02 Ce face

Trei operațiuni și un nomenclator. Fără generare.

Fiecare e un apel POST independent. Nu construim fișierul — îl validăm, îl citim și îl randăm. Folosești pe cea de care ai nevoie.

POST /validate

Validează

Trimiți un fișier SAF-T existent, primești verdictul. Îl verificăm cu XSD-ul oficial ANAF v2.4.9 plus propriile verificări — rădăcina AuditFile, antetul, echilibrul debit=credit din jurnal. Primești ce s-a verificat, erorile și avertismentele.

POST /parse

Citește

Un fișier SAF-T devine JSON curat: antetul (firmă, perioadă, monedă, program, versiune) și o sinteză pe secțiuni — câte conturi, clienți, furnizori, produse, câte jurnale cu total debit și credit, câte documente. Îl citești fără să atingi XML-ul.

POST /render

Randează

Din fișier iese un PDF de sinteză lizibil pentru om, generat local. Antetul și totalurile pe secțiuni, pentru dosar sau verificare, fără un serviciu extern de randare.

GET /codes

Nomenclatoare

Listele oficiale pe care le folosește D406 — coduri de taxe, tipuri de conturi, unități de măsură — servite ca referință, ca să verifici din formular înainte de generare.

03 Zero retenție

Contabilitatea ta nu ajunge nicăieri. Nici la noi, nici la ANAF.

Ăsta e răspunsul la „de ce aș trimite tot registrul meu contabil la un terț”. Pentru că, practic, nu-l trimiți nicăieri — procesăm și uităm.

01

Procesare în memorie

Fișierul nu se scrie niciodată pe disc. Intră în request, e validat și citit în memorie și dispare când răspunsul pleacă. Nu există un fișier SAF-T al tău la noi.

02

Validare locală

XSD-ul oficial v2.4.9 și verificările proprii rulează la noi, pe serverul care ține răspunsul tău. Nu trimitem fișierul la ANAF ca să aflăm dacă e valid — regulile sunt aici, verdictul e local.

03

Loguri fără conținut

Ce reținem e un cod de rezultat și o durată — atât. CUI-ul, conturile, partenerii, sumele nu intră în niciun log, nici la noi, nici la un serviciu de observabilitate.

04

Doar verdictul

Un header opțional îți spune să întoarcem doar verdictul și sinteza, fără nimic din conținutul liniilor. Pentru integrări unde vrei validarea, dar preferi ca datele să nu treacă prin răspuns.

De ce contează pentru tineUn fișier SAF-T conține tot registrul contabil: clienți, furnizori, solduri, facturi, stocuri, mijloace fixe. Un serviciu care îl stochează devine o țintă și o răspundere. Noi am ales varianta în care nu există ce fura: un instrument fără stare, care validează și citește și nu ține minte.
04 Validare oficială

Nu-ți spunem doar „invalid”. Îți spunem exact ce și unde.

Rulăm XSD-ul oficial v2.4.9 complet, local, plus propriile verificări, și îți dăm diagnosticul pe care validatorul DUK Integrator nu ți-l dă atât de clar înainte de depunere.

Schema XSD oficială v2.4.9

Verificăm structura împotriva XSD-ului oficial ANAF, versiunea 2.4.9: elemente, tipuri, ordine, cardinalități. Dacă lipsește un câmp obligatoriu sau un tip nu se potrivește, îl prindem înainte să ajungă vreodată la SPV.

Verificări proprii

Peste XSD rulăm propriile verificări: rădăcina AuditFile și namespace-ul corect, antetul complet și coerent, echilibrul debit=credit al jurnalului contabil. Lucrurile care trec de schemă, dar tot fac fișierul greșit.

Diagnostic, nu doar verdict

Răspunsul îți spune ce s-a verificat, dacă fișierul e valid, plus lista de erori și de avertismente cu regula și locul implicat. Diferența dintre a ști că e o problemă și a ști unde e.

Fără depunere în SPV

Validarea e complet locală: implicit, nimic nu pleacă de la noi către ANAF. Depunerea D406 prin SPV rămâne la tine, cu credențialele tale — noi îți dăm verdictul și sinteza înainte de acel pas.

05 Ce acoperim

De la planul de conturi la documentele sursă.

Secțiunile reale ale unui fișier D406, nu doar antetul. Fiecare validată și citită, cu totalurile numărate.

Antet (Header) Plan de conturi Clienți Furnizori Tabela de taxe Produse Stocuri Mijloace fixe Registrul-jurnal Echilibru debit=credit Facturi de vânzare Facturi de cumpărare Plăți Mișcări de stoc

Acoperim fișierul D406 complet, cu master files, jurnal contabil și documente sursă. Dacă întâlnești o secțiune pe care nu o tratăm corect, scrie-ne — cazurile reale au prioritate în ce construim.

06 Integrare

Un fișier SAF-T intră. Verdictul și sinteza ies.

Trimiți fișierul, primești verdictul de validare sau JSON-ul cu antet și sinteză. Fără SDK obligatoriu — clientul HTTP pe care îl ai deja.

POST/api/anaf/v1/saft/validateapplication/json
# validate: un fișier D406 → verdict față de XSD-ul oficial v2.4.9 + verificări proprii
curl "https://oneapi.ro/api/anaf/v1/saft/validate" \
  -H "Authorization: Bearer $ONEAPI_TOKEN" \
  -F "fisier=@d406_2026_07.xml"

# → 200 OK
{
  "valid":       true,
  "standard":    "D406",
  "xsd_checked": "v2.4.9",
  "errors":      [],
  "warnings":    []
}
Când validarea pică

Ce s-a verificat, regula și locul

Un răspuns de validare nu-ți dă doar „invalid”. Îți spune ce s-a verificat — XSD v2.4.9 și verificările proprii —, dacă e valid, plus erorile și avertismentele cu regula implicată. Suficient ca să corectezi din prima, nu să ghicești.

HTTP/1.1 422 Unprocessable Content
{ "valid": false,
  "standard":    "D406",
  "xsd_checked": "v2.4.9",
  "errors": [ {
    "regula": "SAFT-BAL-01",
    "mesaj":  "Jurnal: debit ≠ credit (Δ 0.02).",
    "camp":   "GeneralLedgerEntries"
} ], "warnings": [] }
07 Întrebări

Înainte să depui primul D406.

Restul, în întrebări frecvente și în documentație.

Nu. Fișierul SAF-T îl produce ERP-ul sau programul tău de contabilitate — de acolo vin master data, jurnalul și documentele sursă. Noi nu construim un D406 de la zero (construirea completă e amânată, vezi specificația 23). Ce acoperim e stratul de verificare și citire: validate, parse, render. Depunerea în SPV rămâne la tine.

Prima validare durează cât citirea acestei pagini. Un token, un fișier SAF-T, verdictul și sinteza înapoi. Zero retenție, din primul apel.
Generează un token Toate modulele