Construiești și validezi declarațiile D, printr-un apel.
Construiești XML-ul unei declarații D dintr-un JSON de business — cu totalurile calculate automat —, îl validezi cu XSD-ul oficial ANAF pe formular, îl citești înapoi ca JSON și îl randezi PDF. Un API parametrizat pe formular, fără să stochezi nimic.
API-ul e un registru de formulare, extensibil: azi sunt live 13 declarații fiscale D — de la deconturile de TVA (D300, D301, D311, D390, D394) la impozite și venituri (D101, D205, D212), salarii (D112), mențiuni (D100, D700, D710) și redirecționarea a 3,5% din impozit (D230). D390 (recapitulativa VIES) e doar un exemplu. Procesarea e în memorie; depunerea în SPV rămâne la tine.
// Content-Type: application/json
{ "luna": 7, "an": 2026, "rectificativa": false,
"declarant": { "cui": "RO12345678", "den": "ACME SRL" },
"operatiuni": [
{ "tip": "L", "tara": "DE", "cod": "DE811234567", "baza": 18400 },
{ "tip": "A", "tara": "FR", "cod": "FR40303265045", "baza": 9250 } ] }
// → { formular: "D390", xml: "<Declaratie390 …>",
// totaluri: { livrari_L: 18400, achizitii_A: 9250, nr_randuri: 2 } }
GET /declaratii/v1/forms // registrul de formulare suportate
{ "forms": [
{ "cod": "D390", "nume": "Recapitulativă VIES", "status": "live" },
{ "cod": "D300", "nume": "Decont TVA", "status": "live" },
{ "cod": "D394", "nume": "Informativă", "status": "live" }
// … D100, D101, D112, D205, D212, D301, D700, D710 — toate live ] }
- Formulare
- 13 declarații D (D390 VIES…)
- Rute
- build · validate · parse · render
- Registru
- /forms · /codes/{nomenclator}
- XSD
- oficial ANAF, pe formular
- Retenție
- niciuna
O declarație D corectă e mai mult decât un XML. Și nu e produsul tău.
Între datele din contabilitate și un D390 pe care ANAF îl acceptă la depunere se află un strat de reguli — structură XSD, totaluri pe tip de operațiune, coduri de partener validate — pe care cineva trebuie să-l construiască și să-l verifice.
Formularul, ca XML
D390 nu e un formular web, ci un XML cu structură strictă: antet cu perioada și declarantul, un rând pentru fiecare partener intracomunitar, cu tip de operațiune, țară, cod TVA și bază. Ordinea și tipurile contează.
Totaluri pe tip
Recapitulativa cere sume grupate pe tip de operațiune — livrări, achiziții, servicii, triunghiulare. O sumă greșită sau un rând pus la tipul greșit și declarația nu se potrivește cu decontul.
Coduri de partener
Fiecare rând are un cod de TVA intracomunitar, cu prefix de țară. Un cod invalid sau nepotrivit cu țara trece de om, dar pică la validare — și de multe ori abia la depunere afli.
Schema oficială
Structura se verifică împotriva XSD-ului oficial ANAF pentru formular. Un element lipsă, un tip greșit, o cardinalitate încălcată, și fișierul e respins.
Rectificative
O declarație depusă greșit se corectează printr-o rectificativă, cu propriile reguli de marcare. Trebuie construită la fel de riguros ca originalul, nu improvizată.
Reguli care se schimbă
Schemele se revizuiesc, formularele se adaugă și se modifică. Ce trecea anul trecut poate pica azi, iar tu afli din refuz, nu din anunț.
Patru operațiuni și un registru de formulare.
Fiecare e un apel POST independent, parametrizat pe formular. Construiești, validezi, citești și randezi — și listezi formularele suportate. Folosești pe cea de care ai nevoie.
/{form}/build
Construiește
Trimiți un JSON de business, primești XML-ul declarației. Totalurile pe tip de operațiune se calculează automat din rânduri, nu le duci tu. Ieși cu un fișier valid față de schema formularului.
/{form}/validate
Validează
Trimiți un XML existent, primești verdictul. Îl verificăm cu XSD-ul oficial ANAF pe formular plus propriile verificări — antet, totaluri, coduri de partener. Primești ce s-a verificat, erorile și avertismentele.
/{form}/parse
Citește
Un XML de declarație devine JSON curat: antetul (declarant, perioadă, rectificativă) și rândurile, cu totalurile pe tip. Îl citești fără să atingi XML-ul.
/{form}/render
Randează
Din declarație iese un PDF lizibil pentru om, generat local — antetul, rândurile și totalurile pe tip, pentru dosar sau verificare, fără un serviciu extern de randare.
/forms
Registru de formulare
Lista formularelor suportate, cu statusul fiecăruia — toate cele 13 declarații D live azi, cu statusul luat din GET /forms. Un singur loc din care afli ce poți construi, fără să ghicești.
/codes/{nomenclator}
Nomenclatoare
Listele oficiale pe care le folosesc formularele — coduri de țară, tipuri de operațiune — servite ca referință, ca să verifici din formular înainte de build.
Datele tale fiscale nu ajung nicăieri. Nici la noi, nici la ANAF.
Ăsta e răspunsul la „de ce aș trimite datele mele fiscale la un terț”. Pentru că, practic, nu le trimiți nicăieri — procesăm și uităm.
Procesare în memorie
JSON-ul și XML-ul nu se scriu niciodată pe disc. Intră în request, sunt construite, validate sau citite în memorie și dispar când răspunsul pleacă. Nu există o declarație a ta la noi.
Validare locală
XSD-ul oficial și verificările proprii rulează la noi, pe serverul care ține răspunsul tău. Nu trimitem declarația la ANAF ca să aflăm dacă e validă — regulile sunt aici, verdictul e local.
Loguri fără conținut
Ce reținem e un cod de rezultat și o durată — atât. CUI-ul, partenerii, sumele, codurile de TVA nu intră în niciun log, nici la noi, nici la un serviciu de observabilitate.
Doar rezultatul
Un header opțional îți spune să întoarcem doar verdictul sau totalurile, fără rândurile în clar. Pentru integrări unde vrei construirea sau validarea, dar preferi ca datele să nu treacă prin răspuns.
Nu-ți spunem doar „invalid”. Îți spunem exact ce și unde.
Rulăm XSD-ul oficial ANAF al formularului, local, plus propriile verificări, și îți dăm diagnosticul înainte de depunere — pe câmp și pe rând.
Schema XSD oficială
Verificăm structura împotriva XSD-ului oficial ANAF pentru formular: 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: antetul complet și coerent, totalurile pe tip de operațiune, codurile de TVA cu prefix de țară valid. Lucrurile care trec de schemă, dar tot fac declarația greșită.
Diagnostic, nu doar verdict
Răspunsul îți spune ce s-a verificat, dacă declarația e validă, plus lista de erori și de avertismente cu regula și rândul 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 D390 prin SPV rămâne la tine, cu credențialele tale — noi îți dăm verdictul și totalurile înainte de acel pas.
Treisprezece declarații D, toate live, pe același tipar.
Toată suita de formulare D live acum, fiecare cu build, validate, parse și render, și cu totalurile calculate automat.
Acoperim suita completă a declarațiilor D — de la deconturile de TVA la declarația unică —, fiecare cu XSD oficial, totaluri și rectificative. Adăugăm formulare noi pe același tipar — dacă ai nevoie de unul care nu e încă live, scrie-ne — cazurile reale au prioritate în ce construim.
Un JSON de business intră. XML-ul valid și totalurile ies.
Trimiți JSON-ul, primești XML-ul cu totalurile calculate — sau, pe validate, verdictul. Fără SDK obligatoriu — clientul HTTP pe care îl ai deja.
# build: un JSON de business → XML D390 valid + totaluri calculate automat
curl "https://oneapi.ro/api/anaf/v1/declaratii/D390/build" \
-H "Authorization: Bearer $ONEAPI_TOKEN" \
-H "Content-Type: application/json" \
-d @d390_2026_07.json
# → 200 OK
{
"formular": "D390",
"xml": "<Declaratie390 …>",
"totaluri": { "livrari_L": 18400, "achizitii_A": 9250, "nr_randuri": 2 }
}
Ce s-a verificat, regula și rândul
Un răspuns de validare nu-ți dă doar „invalid”. Îți spune ce s-a verificat — XSD-ul formularului și verificările proprii —, dacă e valid, plus erorile și avertismentele cu regula și rândul implicat. Suficient ca să corectezi din prima, nu să ghicești.
HTTP/1.1 422 Unprocessable Content
{ "valid": false,
"formular": "D390",
"xsd_checked": "v3.0",
"errors": [ {
"regula": "D390-COD-01",
"mesaj": "Cod TVA partener invalid pentru țara DE.",
"camp": "operatiuni[0].cod"
} ], "warnings": [] }
Înainte să depui primul D390.
Restul, în întrebări frecvente și în documentație.