oneapi
Autentificare
Anaf v1 / Declarații D

Construiește declarația

Trimiţi datele de business în JSON şi primeşti XML-ul formularului, validat pe schema oficială înainte de a-ţi fi dat. Dacă nu trece, primeşti erorile schemei, nu un fişier pe care ANAF l-ar refuza.

POST
https://oneapi.ro/api/anaf/v1/declaratii/{form}/build

Parametri de cale

NumeTipDescriereExemplu
formobligatoriu string Codul formularului (D100, D112, D300, D394…). Lista completă e la /anaf/v1/declaratii/forms.

Corpul cererii

Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.

D394 din JSON Corpul cererii
{
    "luna": 9,
    "an": 2026,
    "tip_D394": "L",
    "declarant": {
        "cui": "990000005",
        "caen": "6201",
        "telefon": "0264000000",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28",
        "den": "Exemplu Furnizor SRL"
    },
    "parteneri": [
        {
            "tip": "L",
            "tip_partener": 1,
            "cota": 21,
            "cui": "990000072",
            "den": "Exemplu Client SRL",
            "nr_facturi": 1,
            "baza": 700,
            "tva": 147
        }
    ],
    "reprezentant": {
        "den": "Exemplu Reprezentant",
        "functie": "Administrator",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28"
    },
    "intocmit": {
        "den": "Exemplu Contabil",
        "cif": "990000005"
    }
}
D300 din JSON Corpul cererii
{
    "luna": 9,
    "an": 2026,
    "tip_decont": "L",
    "declarant": {
        "cui": "990000005",
        "den": "Exemplu Furnizor SRL",
        "nume": "Exemplu",
        "prenume": "Ion",
        "functie": "Administrator",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28",
        "banca": "Banca Exemplu",
        "cont": "RO49AAAA1B31007593840000",
        "caen": "6201"
    },
    "randuri": {
        "R9_1": 1700,
        "R9_2": 357,
        "R64_1": 357
    }
}
D100 — obligații la bugetul de stat Corpul cererii
{
    "luna": 9,
    "an": 2026,
    "declarant": {
        "cui": "990000005",
        "den": "Exemplu Furnizor SRL",
        "nume": "Exemplu",
        "prenume": "Ion",
        "functie": "Administrator",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28"
    },
    "obligatii": [
        {
            "cod_oblig": "102",
            "cod_bugetar": "20100101",
            "scadenta": "2026-10-25",
            "nr_evid": "1",
            "suma_dat": 1200,
            "suma_plata": 1200
        }
    ]
}
D390 — recapitulativa VIES Corpul cererii
{
    "luna": 9,
    "an": 2026,
    "declarant": {
        "cui": "990000005",
        "den": "Exemplu Furnizor SRL",
        "nume": "Exemplu",
        "prenume": "Ion",
        "functie": "Administrator",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28"
    },
    "operatiuni": [
        {
            "tip": "L",
            "tara": "DE",
            "cod": "999000009",
            "denumire": "Exemplu Client GmbH",
            "baza": 15000
        }
    ]
}
D311 — TVA de neînregistrați Corpul cererii
{
    "luna": 9,
    "an": 2026,
    "temei": "1",
    "total_plata": 850,
    "declarant": {
        "cui": "990000005",
        "den": "Exemplu Furnizor SRL",
        "nume": "Exemplu",
        "prenume": "Ion",
        "functie": "Administrator",
        "adresa": "Cluj-Napoca, Str. Memorandumului 28"
    }
}

Parametri de interogare

NumeTipDescriereValori acceptate
validateopțional string Validarea aplicată: local (implicit, XSD oficial) sau none. ex. localex. anafex. none
strictopțional boolean true (implicit) întoarce 422 fără XML dacă validarea eșuează; false întoarce XML-ul oricum. ex. false
formatopțional text Forma XML-ului: xml (implicit) sau base64. ex. base64

Cum se comportă

  • Primește un JSON de business și întoarce declarația fiscală ca XML în formatul oficial ANAF al formularului din cale ({form}, ex. D390). Totalurile se calculează automat din rânduri.
  • Formularele suportate se văd la GET /anaf/v1/declaratii/forms — sunt 13: D100, D101, D112, D205, D212, D230, D300, D301, D311, D390, D394, D700, D710. Câmpurile fiecăruia (din XSD-ul oficial) se văd la GET /anaf/v1/declaratii/{form}/campuri.
  • Un câmp necunoscut în corp e respins, nu ignorat. Dacă trimiți emaill în loc de mail, primești 422 camp_necunoscut cu lista celor acceptate la acel nivel — altfel ai fi primit o declarație validă, dar incompletă, fără să afli de ce.
  • validate alege validarea: local (implicit) rulează XSD-ul oficial al formularului; none doar generează.
  • Zero retenție și fără submitere la SPV — livrăm XML-ul gata de depus; depunerea o face contribuabilul.

La ce folosește

  • Generarea XML-ului D390 din evidența operațiunilor intracomunitare, înainte de depunere.

Structura răspunsului

CâmpTipDescriere
data.valid boolean Rezultatul validării; null la validate=none.
data.formular string Codul formularului generat.
data.schema string
data.xml string XML-ul generat (text sau base64).
data.meta object Metadate (namespace, totaluri calculate).
data.meta.namespace string
data.meta.op_efectuate integer
data.meta.nr_parteneri integer
data.meta.nr_rezumat1 integer
data.meta.nr_rezumat2 integer
data.meta.total_plata_A integer
data.errors array Erorile de validare, când strict=false (la strict=true vin în plicul de eroare).
data.warnings array Avertismente neblocante.
meta.generat_la string Momentul la care s-a construit răspunsul (ISO 8601).

Exemple de răspuns

body: {"luna": 9, "an": 2026, "tip_D394": "L", "declarant": {"cui": "990000005", "caen": "6201", "telefon": "0264000000", "adresa": "Cluj-Napoca, Str. Memorandumului 28", "den": "Exemplu Furnizor SRL"}, "parteneri": [{"tip": "L", "tip_partener": 1, "cota": 21, "cui": "990000072", "den": "Exemplu Client SRL", "nr_facturi": 1, "baza": 700, "tva": 147}], "reprezentant": {"den": "Exemplu Reprezentant", "functie": "Administrator", "adresa": "Cluj-Napoca, Str. Memorandumului 28"}, "intocmit": {"den": "Exemplu Contabil", "cif": "990000005"}}

POSThttps://oneapi.ro/api/anaf/v1/declaratii/D394/build
{
    "data": {
        "valid": true,
        "formular": "D394",
        "schema": "d394_v5.xsd",
        "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<declaratie394 xmlns=\"mfp:anaf:dgti:d394:declaratie:v5\" luna=\"9\" an=\"2026\" tip_D394=\"L\" sistemTVA=\"0\" op_efectuate=\"1\" cui=\"990000005\" caen=\"6201\" den=\"Exemplu Furnizor SRL\" adresa=\"Cluj-Napoca, Str. Memorandumului 28\" telefon=\"0264000000\" totalPlata_A=\"701\" denR=\"Exemplu Reprezentant\" functie_reprez=\"Administrator\" adresaR=\"Cluj-Napoca, Str. Memorandumului 28\" tip_intocmit=\"0\" den_intocmit=\"Exemplu Contabil\" cif_intocmit=\"990000005\" calitate_intocmit=\"administrator\" optiune=\"0\" prsAfiliat=\"0\">\n  <informatii nrCui1=\"1\" nrCui2=\"0\" nrCui3=\"0\" nrCui4=\"0\" nr_BF_i1=\"0\" incasari_i1=\"0\" incasari_i2=\"0\" nrFacturi_terti=\"0\" nrFacturi_benef=\"0\" nrFacturi=\"1\" nrFacturiL_PF=\"0\" nrFacturiLS_PF=\"0\" val_LS_PF=\"0\" tvaDedAI24=\"0\" tvaDedAI21=\"0\" tvaDedAI11=\"0\" tvaDedAI20=\"0\" tvaDedAI19=\"0\" tvaDedAI9=\"0\" tvaDedAI5=\"0\" solicit=\"0\"/>\n  <rezumat1 tip_partener=\"1\" cota=\"21\" facturiL=\"1\" bazaL=\"700\" tvaL=\"147\"/>\n  <rezumat2 cota=\"21\" bazaFSLcod=\"0\" TVAFSLcod=\"0\" bazaFSL=\"0\" TVAFSL=\"0\" bazaFSA=\"0\" TVAFSA=\"0\" bazaFSAI=\"0\" TVAFSAI=\"0\" bazaBFAI=\"0\" TVABFAI=\"0\" nrFacturiL=\"1\" bazaL=\"700\" tvaL=\"147\" nrFacturiA=\"0\" bazaA=\"0\" tvaA=\"0\" nrFacturiAI=\"0\" bazaAI=\"0\" tvaAI=\"0\" bazaL_PF=\"0\" tvaL_PF=\"0\"/>\n  <op1 tip=\"L\" tip_partener=\"1\" cota=\"21\" cuiP=\"990000072\" denP=\"Exemplu Client SRL\" nrFact=\"1\" baza=\"700\" tva=\"147\"/>\n</declaratie394>\n",
        "meta": {
            "namespace": "mfp:anaf:dgti:d394:declaratie:v5",
            "op_efectuate": 1,
            "nr_parteneri": 1,
            "nr_rezumat1": 1,
            "nr_rezumat2": 1,
            "total_plata_A": 701
        },
        "errors": [],
        "warnings": []
    },
    "meta": {
        "generat_la": "2026-10-06T23: 59: 41+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.
404negasitFormular nesuportat.
422xml_invalidJSON invalid sau — la strict=true — declarație care nu trece validarea.
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": "JSON invalid sau — la strict=true — declarație care nu trece validarea.",
        "camp": "form",
        "request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
    }
}