oneapi
Autentificare
Anaf v1 / Utilitare cross-zonă

Validează în lot

Validează mai multe documente deodată, de tipuri diferite — facturi, declaraţii, notificări de transport în acelaşi lot. Fiecare primeşte verdictul lui, iar la final un sumar spune câte au trecut.

POST
https://oneapi.ro/api/anaf/v1/valideaza-lot

Corpul cererii

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

NumeTipDescriereValori acceptate
documenteobligatoriu string[] | object[] Documentele de validat, cel mult 50. Un element e fie XML-ul direct (text ori base64), fie obiectul {id, xml} — cu id, rezultatele vin etichetate cu identificatorul tău, nu cu poziţia din listă.
Trei documente diferite Corpul cererii
{
    "documente": [
        "@efactura.xml",
        "@etransport.xml",
        "@d394.xml"
    ]
}

În exemplu, @efactura.xml, @etransport.xml, @d394.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.

Trei facturi dintr-o lună Corpul cererii
{
    "documente": [
        "@efactura.xml",
        "@efactura-stornare.xml",
        "@efactura-intracomunitara.xml"
    ]
}

În exemplu, @efactura.xml, @efactura-stornare.xml, @efactura-intracomunitara.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.

Patru declarații diferite Corpul cererii
{
    "documente": [
        "@d100.xml",
        "@d390.xml",
        "@d311.xml",
        "@d394.xml"
    ]
}

În exemplu, @d100.xml, @d390.xml, @d311.xml, @d394.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

Ruta nu acceptă parametri de interogare.

Cum se comportă

  • Un element din documente poate fi direct XML-ul (text sau base64) sau obiectul {id, xml} — aceeaşi formă acceptată şi de facturi la /reconciliere-facturi şi /declaratii/deriva. Cu id primeşti rezultatele etichetate cu identificatorul tău, nu cu poziţia din listă.
  • Validează mai multe documente ANAF (eterogene) într-un singur apel. Corpul e JSON: {documente:[{id?, xml}]}, unde xml e brut sau base64. Fiecare document e detectat automat și rutat la validatorul produsului lui (e-Factura, e-Transport, SAF-T, declarații „D").
  • Un document defect nu rupe lotul: erorile sunt izolate per element și raportate, restul se validează normal.
  • Plafon de 50 de documente per apel (validarea Schematron/XSD e costisitoare per document).
  • Zero retenție: documentele primite nu se scriu și nu se loghează.

La ce folosește

  • Validarea unui set de facturi/declarații exportate din ERP, într-o singură cerere.
  • Pre-verificarea în masă a unor fișiere înainte de depunerea în SPV.

Structura răspunsului

CâmpTipDescriere
data.rezultate[] array Câte un verdict per document, în ordinea trimisă.
data.rezultate[].id integer Identificatorul dat de client (id) sau indexul din listă.
data.rezultate[].tip string Tipul detectat (sau null dacă documentul nu a fost recunoscut).
data.rezultate[].produs string Produsul din nomenclatorul sursei.
data.rezultate[].valid boolean Verdictul: true/false, sau null când validarea nu a putut rula.
data.rezultate[].nr_erori integer Numărul de erori pentru document.
data.rezultate[].errors array Erorile {cod,mesaj,camp}.
data.rezultate[].warnings array Avertismentele neblocante {cod,mesaj,camp}.
data.sumar object Agregat pe lot: total, valide, invalide, nerecunoscute.
data.sumar.total integer
data.sumar.valide integer
data.sumar.invalide integer
data.sumar.nerecunoscute integer
meta.generat_la string Momentul la care s-a construit răspunsul (ISO 8601).
meta.request_id string Identificatorul cererii. Dă-l când raportezi o problemă: după el se găseşte răspunsul.

Exemple de răspuns

body: {"documente": ["@efactura.xml", "@etransport.xml", "@d394.xml"]}

POSThttps://oneapi.ro/api/anaf/v1/valideaza-lot
{
    "data": {
        "rezultate": [
            {
                "id": 0,
                "tip": "e-Factura",
                "produs": "efactura",
                "valid": true,
                "nr_erori": 0,
                "errors": [],
                "warnings": []
            }
        ],
        "sumar": {
            "total": 3,
            "valide": 3,
            "invalide": 0,
            "nerecunoscute": 0
        }
    },
    "meta": {
        "generat_la": "2026-10-06T23: 59: 41+03: 00",
        "request_id": "01a11303-d7d3-727f-b28c-1623f1a1fd48"
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422xml_invalidCorp fără documente (sau gol), sau peste 50 de documente.
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": "Corp fără documente (sau gol), sau peste 50 de documente.",
        "camp": null,
        "request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
    }
}