Conformitate ANAF · Declarații D · suită completă

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.

Un JSON intră, XML-ul și totalurile iesPOST · în memorie · zero retenție
POST /declaratii/v1/D390/build
// 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 ] }
Ce ai la dispoziție Un apel POST, un JSON de business, un XML valid cu totalurile calculate. Fără cont de SPV la noi, fără fișier scris pe disc. Depunerea D390 în SPV rămâne la tine, cu credențialele tale.
Formulare
13 declarații D (D390 VIES…)
Rute
build · validate · parse · render
Registru
/forms · /codes/{nomenclator}
XSD
oficial ANAF, pe formular
Retenție
niciuna
01 Problema

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.

A

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ă.

B

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.

C

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.

D

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.

E

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ă.

F

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ț.

Nimic din toate astea nu te diferențiazăClientul tău nu te plătește pentru că știi structura unui D390 sau că grupezi corect sumele pe tip de operațiune. Te plătește pentru produsul tău. Stratul de construire și verificare a declarațiilor e cost pur — de scris o dată și de întreținut pe fiecare formular nou — și e exact ce mutăm de partea noastră.
02 Ce face

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.

POST /{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.

POST /{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.

POST /{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.

POST /{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.

GET /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.

GET /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.

03 Zero retenție

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.

01

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.

02

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.

03

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.

04

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.

De ce contează pentru tineO declarație D conține date fiscale: CUI, parteneri intracomunitari, sume, coduri de TVA. Un serviciu care le stochează devine o țintă și o răspundere. Noi am ales varianta în care nu există ce fura: un instrument fără stare, care construiește, 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 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.

05 Ce acoperim

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.

TVA · D300, D301, D311, D390, D394 Venituri/profit · D101, D205, D212 Salarii · D112 Plăți/mențiuni · D100, D700, D710 Redirecționare 3,5% · D230 build · validate · parse · render XSD oficial ANAF, pe formular Rectificative Nomenclatoare oficiale

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.

06 Integrare

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.

POST/api/anaf/v1/declaratii/D390/buildapplication/json
# 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 }
}
Când validarea pică

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": [] }
07 Întrebări

Înainte să depui primul D390.

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

Da — asta e diferența față de SAF-T. Trimiți un JSON de business și primești XML-ul declarației, cu totalurile pe tip de operațiune calculate automat. Tu duci datele din contabilitate; noi le grupăm, le structurăm și le validăm față de schema formularului. Depunerea în SPV rămâne la tine.

Primul D390 durează cât citirea acestei pagini. Un token, un JSON de business, XML-ul valid și totalurile înapoi. Zero retenție, din primul apel.
Generează un token Toate modulele