oneapi
Autentificare
Anaf v1 / e-TVA

Reconciliază e-TVA

Compară decontul precompletat de ANAF cu decontul tău şi arată rândurile care nu se potrivesc, cu diferenţa pe fiecare. Cu prag se ascund diferenţele mici.

POST
https://oneapi.ro/api/anaf/v1/etva/reconciliere

Corpul cererii

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

NumeTipDescriereValori acceptate
precompletatobligatoriu string Decontul precompletat de ANAF (format D300), XML brut ori base64.
propriuobligatoriu string Decontul tău (format D300), XML brut ori base64.
Decont cu o factură omisă Corpul cererii
{
    "precompletat": "@etva-precompletat.xml",
    "propriu": "@etva-propriu.xml"
}

În exemplu, @etva-precompletat.xml, @etva-propriu.xml ţin locul unor documente întregi: trimiţi conţinutul fişierului — XML-ul ca text sau base64, un PDF ca base64 — nu numele lui.

Doar diferenţe peste 500 lei Corpul cererii
{
    "precompletat": "@etva-precompletat.xml",
    "propriu": "@etva-propriu.xml"
}

În exemplu, @etva-precompletat.xml, @etva-propriu.xml ţin locul unor documente întregi: trimiţi conţinutul fişierului — XML-ul ca text sau base64, un PDF ca base64 — nu numele lui.

Toate diferenţele, fără prag Corpul cererii
{
    "precompletat": "@etva-precompletat.xml",
    "propriu": "@etva-propriu.xml"
}

În exemplu, @etva-precompletat.xml, @etva-propriu.xml ţin locul unor documente întregi: trimiţi conţinutul fişierului — XML-ul ca text sau base64, un PDF ca base64 — nu numele lui.

Parametri de interogare

NumeTipDescriereValori acceptate
pragopțional integer Prag (lei) peste care o diferență e raportată; implicit 0 (toate diferențele). ex. 500ex. 0

Cum se comportă

  • Primește două deconturi de TVA (format D300) — cel precompletat de ANAF (RO e-TVA) și cel propriu al contribuabilului — și întoarce diferențele pe rânduri. E fix ce semnalează „Notificarea de conformare RO e-TVA" (OPANAF 6234/2024), dar rulat local, preventiv, înainte ca ANAF s-o trimită.
  • Body JSON: {"precompletat": "<xml>", "propriu": "<xml>"} (XML direct sau base64). ?prag (lei) filtrează diferențele mici — implicit 0 (toate).
  • Comparația e pe rândurile numerice ale decontului (R*) + totalul de plată; antetul textual se ignoră.
  • Fără depunere la SPV. Decontul precompletat și notificarea le generează ANAF; răspunsul la notificare se depune de contribuabil prin SPV, cu credențialele lui — în afara acestui toolkit stateless.
  • Zero retenție: deconturile primite nu se scriu și nu se loghează.

La ce folosește

  • Verifici, înainte de depunerea D300, dacă decontul tău se abate de la cel precompletat de ANAF — ca să eviți notificarea de conformare.
  • Prioritizezi verificarea manuală pe rândurile cu cele mai mari diferențe.

Structura răspunsului

CâmpTipDescriere
data.are_diferente boolean true dacă există cel puțin o diferență peste prag.
data.nr_diferente integer Numărul de rânduri cu diferențe.
data.total_precompletat integer Totalul de plată din decontul precompletat.
data.total_propriu integer Totalul de plată din decontul propriu.
data.diferente[] array Lista {camp, precompletat, propriu, diferenta} per rând.
data.diferente[].camp string
data.diferente[].precompletat integer
data.diferente[].propriu integer
data.diferente[].diferenta integer
meta.generat_la string Momentul la care s-a construit răspunsul (ISO 8601).

Exemple de răspuns

body: {"precompletat": "@etva-precompletat.xml", "propriu": "@etva-propriu.xml"}

POSThttps://oneapi.ro/api/anaf/v1/etva/reconciliere
{
    "data": {
        "are_diferente": true,
        "nr_diferente": 4,
        "total_precompletat": 357,
        "total_propriu": 147,
        "diferente": [
            {
                "camp": "R9_1",
                "precompletat": 1700,
                "propriu": 700,
                "diferenta": -1000
            }
        ]
    },
    "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_invalidLipsesc cele două deconturi, sau un decont nu e XML D300 valid.
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": "Lipsesc cele două deconturi, sau un decont nu e XML D300 valid.",
        "camp": "prag",
        "request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
    }
}