oneapi
Autentificare
Anaf v1 / e-Factura

Scheletul unei facturi

Opţional, furnizor şi client (CUI) completează părţile din registrul firmelor; ce n-a putut fi completat sigur
e listat în de_verificat.

GET
https://oneapi.ro/api/anaf/v1/efactura/schelet

Parametri de interogare

NumeTipDescriereValori acceptate
typeopțional string Opţional: invoice (implicit), credit_note, corrective, prepayment, self_billed. invoice
furnizoropțional text Opţional: CUI-ul furnizorului, cu ori fără RO, completat din registrul firmelor. ex. 14399840
clientopțional text Opţional: CUI-ul clientului, completat la fel. ex. 6719278

Cum se comportă

  • Întoarce corpul JSON minim pentru POST /efactura/build: exact cheile obligatorii ale tipului cerut, goale, gata de completat. E punctul de plecare pentru cine n-are ERP şi nu vrea să citească schema EN 16931 ca să afle ce e obligatoriu.
  • Scheletul nu e o factură validă. Câmpurile goale (number, issue_date, numele părţilor, linia) trebuie completate; trimis ca atare, build răspunde 422 camp_obligatoriu. obligatorii listează căile de completat, iar linia vine cu valori de pornire (1 bucată H87, TVA 21%).
  • Cu furnizor şi client (CUI, cu ori fără RO), părţile se completează din registrul firmelor: denumirea, codul de TVA (ori tax_id, la neplătitori), numărul de înregistrare şi adresa sediului — în Bucureşti oraşul ca SECTOR1…SECTOR6, cum cere CIUS-RO. Ce nu s-a putut completa sigur apare în de_verificat; un CUI inexistent lasă partea goală, tot acolo semnalat.
  • credit_note şi corrective adaugă preceding_invoices, obligatoriu la ele.

La ce folosește

  • Pornirea unei facturi într-o aplicaţie mică, fără ERP, cu formularul generat din corp şi obligatorii.
  • Pregătirea unei note de credit către un client cunoscut, cu datele de identificare deja completate din registru.
  • Documentarea internă a formei minime acceptate de build, pe tip de document.

Structura răspunsului

CâmpTipDescriere
data.type string Tipul documentului cerut.
data.denumire string Denumirea tipului, în clar.
data.corp object Corpul pentru POST /efactura/build, cu câmpurile obligatorii goale.
data.corp.type string
data.corp.number string
data.corp.issue_date string
data.corp.due_date string
data.corp.currency string
data.corp.supplier.name string
data.corp.supplier.vat_id string
data.corp.supplier.legal_id string
data.corp.supplier.address.street string
data.corp.supplier.address.city string
data.corp.supplier.address.county string
data.corp.supplier.address.postal_code string
data.corp.supplier.address.country string
data.corp.customer.name string
data.corp.customer.vat_id string
data.corp.customer.legal_id string
data.corp.customer.address.street string
data.corp.customer.address.city string
data.corp.customer.address.county string
data.corp.customer.address.postal_code string
data.corp.customer.address.country string
data.corp.lines[].name string
data.corp.lines[].quantity integer
data.corp.lines[].unit string
data.corp.lines[].unit_price integer
data.corp.lines[].vat.rate integer
data.obligatorii array Căile câmpurilor care trebuie completate înainte de build.
data.completate_din_registru array Părţile completate din registru: supplier, customer.
data.de_verificat array Ce n-a putut fi completat sigur ori trebuie verificat de mână.
data.observatie string Cum se foloseşte scheletul.
meta.generat_la string Momentul la care s-a construit răspunsul (ISO 8601).

Exemple de răspuns

GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?type=invoice
{
    "data": {
        "type": "invoice",
        "denumire": "Factură",
        "corp": {
            "type": "invoice",
            "number": "",
            "issue_date": "",
            "due_date": "",
            "currency": "RON",
            "supplier": {
                "name": "",
                "vat_id": "",
                "legal_id": "",
                "address": {
                    "street": "",
                    "city": "",
                    "county": "",
                    "postal_code": "",
                    "country": "RO"
                }
            },
            "customer": {
                "name": "",
                "vat_id": "",
                "legal_id": "",
                "address": {
                    "street": "",
                    "city": "",
                    "county": "",
                    "postal_code": "",
                    "country": "RO"
                }
            },
            "lines": [
                {
                    "name": "",
                    "quantity": 1,
                    "unit": "H87",
                    "unit_price": 0,
                    "vat": {
                        "rate": 21
                    }
                }
            ]
        },
        "obligatorii": [
            "number",
            "issue_date",
            "supplier.name",
            "supplier.address.street",
            "supplier.address.city",
            "supplier.address.country",
            "customer.name",
            "customer.address.city",
            "customer.address.country",
            "lines[].name",
            "lines[].quantity",
            "lines[].unit",
            "lines[].unit_price",
            "lines[].vat.rate"
        ],
        "completate_din_registru": [],
        "de_verificat": [],
        "observatie": "Scheletul nu e o factură validă: completează câmpurile goale şi trimite `corp` la POST /anaf/v1/efactura/build. `due_date` nu e obligatoriu, dar ANAF cere fie `due_date`, fie `payment_terms` când suma de plată e pozitivă (BR-CO-25). Linia are valori de pornire (1 bucată `H87`, TVA 21%) — înlocuieşte-le. Unităţile şi categoriile de TVA sunt la /anaf/v1/efactura/codes/units şi /codes/vat_categories."
    },
    "meta": {
        "generat_la": "2026-10-06T23: 59: 42+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_invalidtip_necunoscut: type nu e unul dintre tipurile acceptate; cui_invalid: furnizor ori client nu e un CUI; parametru_necunoscut: alt parametru în query.
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": "tip_necunoscut: type nu e unul dintre tipurile acceptate; cui_invalid: furnizor ori client nu e un CUI; parametru_necunoscut: alt parametru în query.",
        "camp": "type",
        "request_id": "0199c1f0-6e1a-7c3d-9b2f-4a8e5d1c7b04"
    }
}