Diferențele dintre două documente
Două documente de acelaşi tip, câmp cu câmp: ce s-a adăugat, ce s-a scos şi ce s-a schimbat. Pentru a vedea exact ce aduce o corecţie faţă de documentul iniţial.
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
a, XML brut ori base64.
{
"a": "@efactura.xml",
"b": "@efactura-corectata.xml"
}
În exemplu, @efactura.xml, @efactura-corectata.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.
{
"a": "@efactura.xml",
"b": "@efactura-stornare.xml"
}
În exemplu, @efactura.xml, @efactura-stornare.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.
{
"a": "@etransport.xml",
"b": "@etransport-lic.xml"
}
În exemplu, @etransport.xml, @etransport-lic.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.
{
"a": "@d100.xml",
"b": "@d100-rectificat.xml"
}
În exemplu, @d100.xml, @d100-rectificat.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
Cum se comportă
- Compară DOUĂ documente ANAF de același tip și întoarce ce s-a schimbat, câmp cu câmp — de regulă „varianta veche" vs „varianta nouă". Merge pe orice produs al platformei (e-Factura, e-Transport, SAF-T, declarații D): tipul se detectează singur din root/namespace.
- Corp JSON:
{a: "<xml>", b: "<xml>"}(XML brut sau base64). Comparația se face pe JSON-ul de business (rezultatul parserului), nu pe XML brut, așa că fiecare diferență vine cu o cale pe câmpuri cu nume (linii.0.pret), nu cu un nod XML. - Listele se compară pozițional, pe index: o linie inserată la mijloc apare ca un lanț de modificări plus una adăugată la coadă. Nu ghicim identitatea elementelor dintr-o listă.
- Nu interpretează nimic fiscal — raportează strict ce diferă. Peste 500 de diferențe răspunsul e trunchiat (
trunchiat: true). - Zero retenție și fără SPV — totul e in-memory.
La ce folosește
- Vezi exact ce s-a schimbat între factura inițială și cea corectată, înainte să trimiți storno-ul sau varianta nouă.
- Verifici, înainte de depunere, ce diferă între declarația depusă luna trecută și varianta pe care o pregătești acum.
- Audit intern: dovedești ce câmpuri s-au modificat între două versiuni ale aceluiași document.
Structura răspunsului
efactura, etransport, saft, declaratii).
true dacă nu există nicio diferență.
modificate, adaugate, sterse, total.
[{cale,inainte,dupa}].
b [{cale,valoare}].
a [{cale,valoare}].
true dacă s-au depășit 500 de diferențe și listele au fost tăiate.
Exemple de răspuns
body: {"a": "@efactura.xml", "b": "@efactura-corectata.xml"}
{
"data": {
"tip": "e-Factura",
"produs": "efactura",
"identice": false,
"sumar": {
"modificate": 1,
"adaugate": 0,
"sterse": 0,
"total": 1
},
"modificate": [
{
"cale": "lines.0.quantity",
"inainte": 2,
"dupa": 3
}
],
"adaugate": [],
"sterse": [],
"trunchiat": false
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d891-7144-ae4c-bffcf733ff72"
}
}
body: {"a": "@efactura.xml", "b": "@efactura-stornare.xml"}
{
"data": {
"tip": "e-Factura",
"produs": "efactura",
"identice": false,
"sumar": {
"modificate": 6,
"adaugate": 1,
"sterse": 2,
"total": 9
},
"modificate": [
{
"cale": "type",
"inainte": "invoice",
"dupa": "credit_note"
}
],
"adaugate": [
{
"cale": "preceding_invoices",
"valoare": {
"_structura": "1 element(e)"
}
}
],
"sterse": [
{
"cale": "due_date",
"valoare": "2026-10-10"
}
],
"trunchiat": false
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d898-7234-a0ac-4a6c6def14ce"
}
}
body: {"a": "@etransport.xml", "b": "@etransport-lic.xml"}
{
"data": {
"tip": "e-Transport",
"produs": "etransport",
"identice": false,
"sumar": {
"modificate": 12,
"adaugate": 1,
"sterse": 1,
"total": 14
},
"modificate": [
{
"cale": "ref_declarant",
"inainte": "AVZ-2026-0142",
"dupa": "LIC-2026-0007"
}
],
"adaugate": [
{
"cale": "loc_final.ptf",
"valoare": "1"
}
],
"sterse": [
{
"cale": "loc_final.locatie",
"valoare": {
"_structura": "5 câmp(uri)"
}
}
],
"trunchiat": false
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d89f-71a0-8a74-4ea4ef66832d"
}
}
body: {"a": "@d100.xml", "b": "@d100-rectificat.xml"}
{
"data": {
"tip": "D100",
"produs": "declaratii",
"identice": false,
"sumar": {
"modificate": 3,
"adaugate": 0,
"sterse": 0,
"total": 3
},
"modificate": [
{
"cale": "total_plata",
"inainte": 2400,
"dupa": 3700
}
],
"adaugate": [],
"sterse": [],
"trunchiat": false
},
"meta": {
"generat_la": "2026-10-06T23: 59: 41+03: 00",
"request_id": "01a11303-d8a4-727f-9772-9fa1ef599056"
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | feature_indisponibil | Planul curent nu include funcţia de care ţine ruta. |
| 422 | xml_invalid | Lipsește a sau b; un document nu e XML valid ori nu e recunoscut; cele două documente sunt de tipuri diferite. |
| 429 | cota_depasita | Cota 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": "Lipsește a sau b; un document nu e XML valid ori nu e recunoscut; cele două documente sunt de tipuri diferite.",
"camp": null,
"request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
}
}