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,buildrăspunde422 camp_obligatoriu.obligatoriilistează căile de completat, iar linia vine cu valori de pornire (1 bucatăH87, TVA 21%). - Cu
furnizorşiclient(CUI, cu ori fărăRO), părţile se completează din registrul firmelor: denumirea, codul de TVA (oritax_id, la neplătitori), numărul de înregistrare şi adresa sediului — în Bucureşti oraşul caSECTOR1…SECTOR6, cum cere CIUS-RO. Ce nu s-a putut completa sigur apare înde_verificat; un CUI inexistent lasă partea goală, tot acolo semnalat. credit_noteşicorrectiveadaugă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şiobligatorii. - 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"
}
}
GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?type=credit_note
{
"data": {
"type": "credit_note",
"denumire": "Notă de credit / stornare",
"corp": {
"type": "credit_note",
"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
}
}
],
"preceding_invoices": [
{
"number": "",
"issue_date": ""
}
]
},
"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",
"preceding_invoices[].number",
"preceding_invoices[].issue_date"
],
"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"
}
}
GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?type=corrective
{
"data": {
"type": "corrective",
"denumire": "Factură rectificativă",
"corp": {
"type": "corrective",
"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
}
}
],
"preceding_invoices": [
{
"number": "",
"issue_date": ""
}
]
},
"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",
"preceding_invoices[].number",
"preceding_invoices[].issue_date"
],
"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"
}
}
GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?type=prepayment
{
"data": {
"type": "prepayment",
"denumire": "Factură de avans",
"corp": {
"type": "prepayment",
"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"
}
}
GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?type=self_billed
{
"data": {
"type": "self_billed",
"denumire": "Autofactură",
"corp": {
"type": "self_billed",
"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"
}
}
GEThttps://oneapi.ro/api/anaf/v1/efactura/schelet?furnizor=14399840&client=6719278
{
"data": {
"type": "invoice",
"denumire": "Factură",
"corp": {
"type": "invoice",
"number": "",
"issue_date": "",
"due_date": "",
"currency": "RON",
"supplier": {
"name": "DANTE INTERNATIONAL SA",
"vat_id": "RO14399840",
"legal_id": "J2002000372404",
"address": {
"street": "Şos. VIRTUŢII nr. 148",
"city": "SECTOR6",
"county": "RO-B",
"postal_code": "60787",
"country": "RO"
}
},
"customer": {
"name": "MEGA IMAGE SRL",
"vat_id": "RO6719278",
"legal_id": "J1994027872407",
"address": {
"street": "Timişoara nr. 26",
"city": "SECTOR6",
"county": "RO-B",
"postal_code": "61331",
"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": [
"supplier",
"customer"
],
"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: 43+03: 00"
}
}
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 | tip_necunoscut: type nu e unul dintre tipurile acceptate; cui_invalid: furnizor ori client nu e un CUI; parametru_necunoscut: alt parametru în query. |
| 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": "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"
}
}