---
title: "Emitere factura"
method: POST
path: "/invoice/v2"
tags: ["Facturi"]
---

# Emitere factura

`POST /invoice/v2`

Emite o factura noua. Poti emite factura ca ciorna (draft), pe care o finalizezi ulterior din interfata SmartBill.

**Ai primit o eroare la emiterea facturii?**

**Erorile de autentificare si autorizare sunt comune tuturor endpoint-urilor V1.** Pentru email/token, `companyVatCode`, drepturi pe firma sau pe serie, vezi [Erori API V1](#api-1/description/erori-api-v1). Mai jos gasesti doar erorile specifice emiterii de factura.

<details>
<summary><strong>Date document si serii</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Serie inexistenta in cont</td>
      <td><code>Seria nu a fost gasita! Folositi o serie creata in contul de cloud.</code></td>
      <td>Seria trebuie definita in SmartBill Cloud. Trimite in `seriesName` seria facturii, exact cum e configurata in cont.</td>
    </tr>
    <tr>
      <td>Contul a atins numarul maxim de documente permis de pachetul de abonament</td>
      <td><code>Pentru acest pachet s-a emis numarul maxim de documente permis</code></td>
      <td>Limita vine din abonamentul contului SmartBill Cloud, nu din API, deci nu se ridica din integrare. Verifica pachetul in cont.</td>
    </tr>
    <tr>
      <td>Moneda inexistenta sau scrisa gresit</td>
      <td><code>Moneda nu a fost gasita pe server!</code></td>
      <td>Verifica moneda trimisa in `currency`. Valorile acceptate sunt listate in schema campului.</td>
    </tr>
    <tr>
      <td>Data documentului in format gresit</td>
      <td><code>Data documentului trebuie sa fie de forma yyyy-MM-dd.</code></td>
      <td>Trimite `issueDate` in format `yyyy-MM-dd`, de exemplu `2026-06-15`.</td>
    </tr>
    <tr>
      <td><code>sendEmail</code> fara adresa destinatar</td>
      <td><code>Trebuie specificata adresa de email a clientului.</code></td>
      <td>Cand `sendEmail` e `true`, completeaza adresa destinatarului in `email.to` sau in `client.email`.</td>
    </tr>
    <tr>
      <td><code>sendEmail</code> fara server de email</td>
      <td><code>Server-ul de email nu a fost configurat.</code></td>
      <td>Contul nu are un server de email configurat. Intra in SmartBill Cloud si configureaza-ti propriul server de email din <a href="https://cloud.smartbill.ro/core/configurare_mailuri/">Configurare > Email</a>.</td>
    </tr>
  </tbody>
</table>

</details>

<details>
<summary><strong>Client</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Obiectul <code>client</code> lipseste</td>
      <td><code>tara trebuie specificata</code></td>
      <td>Trimite `client` cu cel putin `name` si `country`.</td>
    </tr>
    <tr>
      <td><code>client.name</code> gol sau <code>null</code></td>
      <td><code>Client invalid!</code></td>
      <td>Trimite un `client.name` valid (nu gol, nu `null`).</td>
    </tr>
    <tr>
      <td><code>client.country</code> lipseste</td>
      <td><code>tara trebuie specificata</code></td>
      <td>Completeaza `client.country`, ex. `Romania`.</td>
    </tr>
    <tr>
      <td>Client duplicat in nomenclator</td>
      <td><code>Clientul exista deja pe server</code></td>
      <td>Exista deja un client cu acelasi nume dar alt CIF. Sterge duplicatul din nomenclator.</td>
    </tr>
  </tbody>
</table>

</details>

<details>
<summary><strong>Produse, TVA si discounturi</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Lista `products` goala</td>
      <td><code>invoiceProducts trebuie specificat si trebuie sa contina cel putin un element</code></td>
      <td>Trimite cel putin un produs in `products`.</td>
    </tr>
    <tr>
      <td><code>products[].name</code> lipsa</td>
      <td><code>name trebuie specificat pentru fiecare produs</code></td>
      <td>Trimite `name` la fiecare produs.</td>
    </tr>
    <tr>
      <td><code>products[].measuringUnitName</code> lipsa</td>
      <td><code>measuringUnitName trebuie specificat pentru fiecare produs</code></td>
      <td>Trimite `measuringUnitName` (case-sensitive, sa existe in cont).</td>
    </tr>
    <tr>
      <td>Cota TVA a produsului inexistenta</td>
      <td><code>Cota tva a produsului ... nu a fost gasita pe server!</code></td>
      <td>Foloseste o cota TVA existenta in cont.</td>
    </tr>
    <tr>
      <td>Produs fara cota TVA setata</td>
      <td><code>Trebuie sa setezi o cota tva pentru produsul ...</code></td>
      <td>Seteaza `taxPercentage` la fiecare produs.</td>
    </tr>
    <tr>
      <td>Document doar cu discount</td>
      <td><code>Nu poti sa emiti un document care contine doar un discount. Trebuie sa ai si produse / servicii adaugate.</code></td>
      <td>Adauga si produse, nu doar linie de discount.</td>
    </tr>
    <tr>
      <td>Discount procentual fara procent</td>
      <td><code>Trebuie sa introduceti valoarea procentului!</code></td>
      <td>Trimite `discountPercentage` pe linia de discount.</td>
    </tr>
    <tr>
      <td>Produs fara cod</td>
      <td><code>Produsul ... nu are codul specificat.</code></td>
      <td>Daca firma foloseste cod produs, trimite `code` la fiecare produs.</td>
    </tr>
    <tr>
      <td>Produs fara cota TVA in nomenclator</td>
      <td><code>Produsul ... nu are cota tva setata in cloud. Setati o cota din nomenclatorul de produse.</code></td>
      <td>Seteaza cota TVA a produsului in <a href="https://cloud.smartbill.ro/nomenclator/produse/">Nomenclatoare &gt; Produse</a>.</td>
    </tr>
    <tr>
      <td>Fara cota TVA implicita</td>
      <td><code>Cota default nu a fost gasita pe server!</code></td>
      <td>Marcheaza o cota TVA ca implicita in <a href="https://cloud.smartbill.ro/core/configurare/cote-tva/">Configurare > Cote TVA</a>.</td>
    </tr>
    <tr>
      <td>Cota discountului inexistenta</td>
      <td><code>Cota ... nu a fost gasita pe server!</code></td>
      <td>Foloseste o cota TVA predefinita in cont.</td>
    </tr>
    <tr>
      <td>Discount pe produse cu cote TVA diferite</td>
      <td><code>La aplicarea unui discount pentru produse cu cote tva diferite, trebuie sa specifici si cota tva a discountului.</code></td>
      <td>Specifica si cota TVA a discountului.</td>
    </tr>
    <tr>
      <td>Discount valoric fara valoare</td>
      <td><code>discountValue trebuie specificat pentru fiecare produs de tip discount</code></td>
      <td>Trimite `discountValue` pe linia de discount.</td>
    </tr>
    <tr>
      <td>Moneda produsului inexistenta</td>
      <td><code>Moneda nu a fost gasita pe server!</code></td>
      <td>Trimite o valoare acceptata de schema campului `products[].currency` sau omite campul.</td>
    </tr>
    <tr>
      <td>Moneda de referinta diferita</td>
      <td><code>Nu puteti emite documente in ... cu moneda de referinta a produselor in ... !</code></td>
      <td>Moneda documentului si cea de referinta trebuie sa coincida (cand nu e RON).</td>
    </tr>
    <tr>
      <td>Pret in alta moneda decat documentul</td>
      <td><code>Aveti produse care au pretul in alta moneda decat cea a facturii.</code></td>
      <td>Activeaza in cont lucrul cu pret de referinta in valuta.</td>
    </tr>
    <tr>
      <td>Peste 400 de linii pe document</td>
      <td><code>Numarul maxim acceptat de 400 intrari pe document a fost depasit.</code></td>
      <td>Maxim 400 de pozitii pe document.</td>
    </tr>
  </tbody>
</table>

</details>

<details>
<summary><strong>Incasare</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Incasare fara tip (<code>payment.type</code> lipseste)</td>
      <td><code>type trebuie specificat pentru incasare</code></td>
      <td>Trimite tipul incasarii in `payment.type`.</td>
    </tr>
    <tr>
      <td>Incasare fara <code>isCash</code></td>
      <td><code>isCash trebuie specificat pentru incasare</code></td>
      <td>Trimite `payment.isCash` (`true`/`false`) cand adaugi o incasare.</td>
    </tr>
    <tr>
      <td>Incasare fara valoare (<code>payment.value</code> lipseste)</td>
      <td><code>value trebuie specificat pentru incasare</code></td>
      <td>Trimite valoarea incasarii in `payment.value`.</td>
    </tr>
    <tr>
      <td>Tip de incasare inexistent</td>
      <td><code>Tipul documentului nu a fost gasit pe server!</code></td>
      <td>Tipul de incasare trimis nu exista. Foloseste un tip valid (de exemplu `Chitanta`, `Ordin de plata`, `Card`).</td>
    </tr>
    <tr>
      <td>Serie de incasare inexistenta in cont</td>
      <td><code>Seria nu a fost gasita! Folositi o serie creata in contul de cloud.</code></td>
      <td>Seria incasarii trebuie definita in contul SmartBill Cloud.</td>
    </tr>
  </tbody>
</table>

</details>

<details>
<summary><strong>Din proforma</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Proforma sursa inexistenta</td>
      <td><code>Factura proforma ... nu a fost gasita!</code></td>
      <td>Proforma pe baza careia vrei sa emiti factura nu a fost gasita. Verifica in SmartBill Cloud daca documentul mai exista si daca ai trimis corect seria si numarul proformei.</td>
    </tr>
    <tr>
      <td>Proforma sursa fara produse</td>
      <td><code>Proforma nu contine produse!</code></td>
      <td>Proforma pe baza careia emiti factura nu are produse adaugate. Verifica in SmartBill Cloud daca proforma respectiva are produse.</td>
    </tr>
  </tbody>
</table>

</details>

<details>
<summary><strong>Stoc si gestiuni</strong></summary>

<table>
  <thead>
    <tr>
      <th>Situatie</th>
      <th>Eroare</th>
      <th>Sugestie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gestiune lipsa pe produs (cu <code>useStock</code>)</td>
      <td><code>Gestiunea predatoare nu este setata pentru produsul Produs Test API Erori.</code></td>
      <td>Cand `useStock` este `true`, trimite o gestiune existenta in `products[].warehouseName`.</td>
    </tr>
    <tr>
      <td>Gestiune inexistenta in cont</td>
      <td><code>Gestiunea predatoare GESTIUNE_INEXISTENTA a produsului Produs Test API Erori nu a fost gasita.</code></td>
      <td>Verifica ca `warehouseName` este scrisa corect si ca gestiunea a fost creata in prealabil in contul Cloud.</td>
    </tr>
    <tr>
      <td>Gestiune invalida</td>
      <td><code>Gestiunea predatoare este invalida!</code></td>
      <td>Gestiunea trimisa nu este valida. Verifica `warehouseName` si gestiunile definite in contul Cloud.</td>
    </tr>
    <tr>
      <td>Modulul de stoc inactiv pe cont</td>
      <td><code>Modulul stoc nu este activ!</code></td>
      <td>Contul pe care emiti nu are activat modulul de gestiune. Contacteaza-ne la api@smartbill.ro.</td>
    </tr>
    <tr>
      <td>Produs fara stoc (nicio achizitie)</td>
      <td><code>Nu ai facut nicio achizitie pentru produsul ...</code></td>
      <td>Incarca intai stoc pentru produs sau emite documentul fara descarcare de gestiune. Verifica codul si numele produsului (case-sensitive).</td>
    </tr>
    <tr>
      <td>Stoc insuficient pe gestiune</td>
      <td><code>Cantitate stoc insuficienta ...</code></td>
      <td>Nu exista stoc suficient pe gestiunea aleasa. Schimba gestiunea sau emite cu `useStock` `false` si descarca stocul ulterior din contul Cloud.</td>
    </tr>
    <tr>
      <td>Cod produs care nu coincide cu cel din stoc</td>
      <td><code>Exista deja pe stoc un produs cu numele ... si codul ...</code></td>
      <td>Codul produsului trimis nu coincide exact cu cel din SmartBill. Codul este case-sensitive (de exemplu `25xl` vs `25XL`).</td>
    </tr>
    <tr>
      <td>Unitate de masura fara factor de conversie</td>
      <td><code>Unitatea de masura ... nu are factor de conversie setat.</code></td>
      <td>Unitatea de masura trebuie trecuta exact ca in contul Cloud pentru produs. Parametrul este case-sensitive.</td>
    </tr>
    <tr>
      <td>Data document anterioara importului de stoc initial</td>
      <td><code>Nu poti adauga documente cu tranzactii pe stoc la data anterioara datei importului de stoc initial ...</code></td>
      <td>Alege o `issueDate` ulterioara datei importului de stoc initial pentru gestiunea respectiva.</td>
    </tr>
  </tbody>
</table>

</details>

- --

## Tipuri de emitere

<details>
<summary><strong>1. Emitere factura simpla</strong></summary>

Campurile minime obligatorii pentru o factura valida. Punct de start recomandat pentru integrari noi sau cazuri simple.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": {
    "name": "Client SRL",
    "country": "Romania"
  },
  "products": [{
    "name": "Produs 1",
    "code": "PRD001",
    "quantity": 1,
    "measuringUnitName": "buc",
    "taxPercentage": 21,
    "price": 10
  }]
}
```

</details>

<details>
<summary><strong>2. Emitere factura completa</strong></summary>

Un payload complex care combina mai multe optiuni intr-un singur apel - util ca referinta cand integrezi scenarii care depasesc factura simpla.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "isDraft": false,
  "issueDate": "2026-06-15",
  "dueDate": "2026-07-15",
  "deliveryDate": "2026-06-20",
  "paymentDate": "2026-06-15",
  "language": "RO",
  "currency": "RON",
  "precision": 2,
  "useStock": false,
  "useIntraCif": false,
  "usePaymentTax": false,
  "useEstimateDetails": false,
  "delegateName": "Ion Popescu",
  "delegateIdentityCard": "AB 123456",
  "delegateAuto": "B-123-ABC",
  "issuerCnp": "1234567890123",
  "issuerName": "Maria Ionescu",
  "client": {
    "name": "Client SRL",
    "vatCode": "RO22222222",
    "code": "CLI001",
    "regCom": "J40/1234/2020",
    "isTaxPayer": true,
    "address": "Str. Lalelei 1",
    "city": "Sector 1",
    "county": "Bucuresti",
    "country": "Romania",
    "email": "client@example.com",
    "phone": "0722000000",
    "contact": "Andrei Popa",
    "iban": "RO49AAAA1B31007593840000",
    "bank": "BCR",
    "saveToDb": false
  },
  "products": [
    {
      "name": "Servicii consultanta",
      "code": "SRV001",
      "productDescription": "Servicii de consultanta IT",
      "translatedName": "Consulting services",
      "measuringUnitName": "ora",
      "translatedMeasuringUnit": "hour",
      "quantity": 1,
      "price": 100,
      "taxName": "Normala",
      "taxPercentage": 21,
      "isService": true,
      "saveToDb": false
    },
    {
      "name": "Discount valoric",
      "isDiscount": true,
      "numberOfItems": 1,
      "discountType": 1,
      "discountValue": -10,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    },
    {
      "name": "Produs 1",
      "code": "PRD001",
      "quantity": 2,
      "price": 200,
      "measuringUnitName": "buc",
      "taxName": "Normala",
      "taxPercentage": 21,
      "isService": false,
      "saveToDb": false
    },
    {
      "name": "Discount procentual 10%",
      "isDiscount": true,
      "numberOfItems": 1,
      "discountType": 2,
      "discountPercentage": 10,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    }
  ],
  "payment": {
    "value": 450,
    "type": "Ordin plata",
    "isCash": false
  },
  "paymentUrl": "",
  "sendEmail": false,
  "email": {
    "to": "client@example.com",
    "cc": "",
    "bcc": ""
  },
  "observations": "Marfa se ridica de la sediu in termen de 5 zile lucratoare",
  "mentions": "Plata se face in contul IBAN specificat in contract"
}
```

</details>

<details>
<summary><strong>3. Emitere factura cu link de plata</strong></summary>

Emite factura cu un link de plata asociat butonului 'Plateste cu cardul' de pe document. Necesita un cont Netopia, euPlatesc sau Stripe configurat in  <a href="https://cloud.smartbill.ro/core/integrari/">Configurare > Integrari</a>. Seteaza `paymentUrl: "Generate URL"` pentru a activa generarea link-ului.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }],
  "paymentUrl": "Generate URL"
}
```

</details>

<details>
<summary><strong>4. Emitere factura cu descarcare de gestiune</strong></summary>

Emite factura si scade stocul produselor din gestiune. Gestiunea trebuie sa existe deja in SmartBill Cloud si sa aiba stoc disponibil pentru produsele facturate. Seteaza `useStock: true` si specifica `warehouseName` pe fiecare produs.

> **Denumirea produsului la descarcarea de gestiune.** Produsul este identificat prin `code`. Daca valoarea din `name` difera de denumirea din nomenclator, aceasta suprascrie automat numele produsului in nomenclator, indiferent de valoarea `saveToDb`.
>
> *Exemplu:* produsul `Apa minerala` (cod `A1`) exista in nomenclator. La emiterea unei facturi cu descarcare de gestiune pe codul `A1`, transmitand `"name": "Apa minerala 1.5"`, denumirea produsului din nomenclator devine `Apa minerala 1.5`.
>
> Pentru a pastra denumirea din SmartBill, astfel incat numele transmis prin API sa fie folosit doar pe factura fara a modifica nomenclatorul, seteaza `useSBProductName: true` in parametrii produsului. Necesita setarea "Foloseste cod produs" activata pe firma.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "useStock": true,
  "products": [{
    "name": "Produs 1",
    "code": "PRD001",
    "quantity": 1,
    "price": 100,
    "measuringUnitName": "buc",
    "warehouseName": "NUME_GESTIUNE",
    "taxPercentage": 21
  }]
}
```

</details>

<details>
<summary><strong>5. Emitere factura ciorna (draft)</strong></summary>

Emite factura in stare de ciorna, fara numar atribuit. Documentul ramane ca ciorna pana la finalizare manuala din SmartBill Cloud. Seteaza `isDraft: true`.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "isDraft": true,
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }]
}
```

</details>

<details>
<summary><strong>6. Emitere factura cu discounturi</strong></summary>

Discounturile se adauga ca linii separate cu `isDiscount: true`. `numberOfItems` stabileste pe cate produse imediat anterioare se aplica discountul. Pentru discount valoric, seteaza `discountType: 1` si foloseste `discountValue`. Pentru discount procentual, seteaza `discountType: 2` si foloseste `discountPercentage`; valoarea procentului trebuie sa fie mai mare decat 0.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [
    {
      "name": "Produs 1",
      "code": "PRD001",
      "quantity": 1,
      "price": 100,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    },
    {
      "name": "Discount valoric",
      "isDiscount": true,
      "numberOfItems": 1,
      "discountType": 1,
      "discountValue": -10,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    },
    {
      "name": "Produs 2",
      "code": "PRD002",
      "quantity": 1,
      "price": 200,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    },
    {
      "name": "Discount procentual 10%",
      "isDiscount": true,
      "numberOfItems": 1,
      "discountType": 2,
      "discountPercentage": 10,
      "measuringUnitName": "buc",
      "taxPercentage": 21
    }
  ]
}
```

</details>

<details>
<summary><strong>7. Emitere factura cu servicii</strong></summary>

Marcheaza produsele de tip serviciu cu `isService: true`. Serviciile sunt excluse automat din descarcarea de gestiune atunci cand `useStock: true` este setat la nivel de factura.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{
    "name": "Servicii consultanta",
    "code": "SRV001",
    "quantity": 1,
    "price": 100,
    "measuringUnitName": "ora",
    "taxPercentage": 21,
    "isService": true
  }]
}
```

</details>

<details>
<summary><strong>8. Emitere factura cu data scadenta</strong></summary>

Adauga `dueDate` pentru a specifica data scadentei facturii.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "dueDate": "2026-07-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }]
}
```

</details>

<details>
<summary><strong>9. Emitere factura ca incasata</strong></summary>

Emite factura si inregistreaza plata simultan, intr-un singur apel, prin obiectul `payment`. Util atunci cand clientul a platit comanda in magazinul tau online.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }],
  "payment": {
    "value": 100,
    "paymentSeries": "SERIA_CHITANTEI",
    "type": "Chitanta",
    "isCash": true
  }
}
```

</details>

<details>
<summary><strong>10. Emitere factura cu trimitere pe email</strong></summary>

Emite factura si o trimite automat pe email clientului. Seteaza `sendEmail: true` si specifica adresa in `email.to`. Adresa de expeditor si template-ul se configureaza din [Configurare > Email](https://cloud.smartbill.ro/core/configurare_mailuri/).

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "sendEmail": true,
  "email": {
    "to": "client@example.com",
    "cc": "",
    "bcc": ""
  },
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }]
}
```

</details>

<details>
<summary><strong>11. Emitere factura in valuta</strong></summary>

Emite factura in valuta. Seteaza `currency` si `exchangeRate` la nivel de factura, si `currency` pe fiecare produs cu aceeasi valuta - cursul apare pe factura alaturi de echivalentul in RON. `exchangeRate` este optional - daca nu e specificat, se foloseste cursul din [Preferinte personale](https://cloud.smartbill.ro/core/configurare/preferinte-personale/) (sectiunea "Curs valutar preluat de pe Internet": cursul de azi sau de ieri, cu adaos procentual optional).

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "currency": "EUR",
  "exchangeRate": 4.97,
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [
    {
      "name": "Produs 1",
      "code": "PRD001",
      "quantity": 1,
      "price": 100,
      "measuringUnitName": "buc",
      "taxPercentage": 21,
      "currency": "EUR"
    }
  ]
}
```

</details>

<details>
<summary><strong>12. Emitere factura cu pret referinta in valuta</strong></summary>

Util cand contractele sunt in valuta dar facturezi in RON - de exemplu, un abonament de mentenanta de 100 EUR facturat la cursul zilei. Necesita activarea optiunii "Am preturi cu moneda de referinta in valuta" din [Configurare > Generale](https://cloud.smartbill.ro/documente/preferinte-generale/) in SmartBill Cloud. Seteaza `currency` la nivel de produs cu valuta contractului si `currency` la nivel de factura cu moneda de emitere. `exchangeRate` pe produs este optional - daca nu e specificat, se foloseste cursul din [Preferinte personale](https://cloud.smartbill.ro/core/configurare/preferinte-personale/) (sectiunea "Curs valutar preluat de pe Internet": cursul de azi sau de ieri, cu adaos procentual optional).

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "currency": "RON",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [
    {
      "name": "Produs 1",
      "code": "PRD001",
      "quantity": 1,
      "price": 497,
      "measuringUnitName": "buc",
      "taxPercentage": 21,
      "currency": "EUR",
      "exchangeRate": 4.97
    }
  ]
}
```

</details>

<details>
<summary><strong>13. Emitere factura cu CIF intracomunitar</strong></summary>

Daca esti inregistrat in sistemul electronic One Stop Shop, intra in contul SmartBill la [Configurare > Date Firma](https://cloud.smartbill.ro/core/configurare/date-firma/) si completeaza campul `CIF intracomunitar`. Daca ai nevoie de CIF OSS, foloseste optiunea `Genereaza CIF OSS` afisata langa camp. Dupa configurare, seteaza `useIntraCif: true` pentru a emite factura cu acest CIF.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "useIntraCif": true,
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Company GmbH", "vatCode": "DE123456789", "address": "Musterstrasse 1", "city": "Berlin", "county": "Berlin", "country": "Germania" },
  "products": [{ "name": "Servicii consultanta", "code": "SRV001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 0, "taxName": "Taxare inversa", "isService": true }]
}
```

</details>

<details>
<summary><strong>14. Emitere factura - emitent neplatitor de TVA</strong></summary>

Daca firma ta nu este platitoare de TVA, nu este necesar sa completezi campurile legate de TVA pe produse.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc" }]
}
```

</details>

<details>
<summary><strong>15. Emitere factura cu cote TVA diferite</strong></summary>

Adauga produse cu cote TVA diferite ca linii separate cu `taxPercentage` corespunzator - SmartBill grupeaza automat pe cote in document. La cota 0%, specifica intotdeauna si un `taxName` existent in cont, de exemplu `Taxare inversa`, `TVA Inclus`, `SDD` sau `SFDD` - fara el, API-ul alege implicit `Taxare inversa`, indiferent de regimul fiscal corect.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [
    { "name": "Produs standard", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 },
    { "name": "Aliment", "code": "PRD002", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 11 },
    { "name": "Produs scutit", "code": "PRD003", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 0, "taxName": "SDD" }
  ]
}
```

</details>

<details>
<summary><strong>16. Emitere factura in limba straina</strong></summary>

Factura se emite implicit in limba romana (`RO`). Pentru emiterea intr-o alta limba, seteaza parametrul `language` la nivelul facturii.

Poti folosi o limba predefinita in SmartBill Cloud sau o limba definita de administrator in cont. Valoarea trimisa in `language` trebuie sa corespunda unei limbi disponibile in cont.

`language` controleaza limba documentului, dar denumirea produselor si unitatile de masura trebuie traduse explicit pe fiecare produs, prin `translatedName` si `translatedMeasuringUnit`.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "language": "EN",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{
    "name": "Produs 1",
    "translatedName": "Product 1",
    "code": "PRD001",
    "quantity": 1,
    "price": 100,
    "measuringUnitName": "buc",
    "translatedMeasuringUnit": "piece",
    "taxPercentage": 21
  }]
}
```

</details>

<details>
<summary><strong>17. Emitere factura din proforma</strong></summary>

Creeaza factura pe baza unei proforme existente. Nu e nevoie de client sau produse - se preiau din proforma.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "issueDate": "2026-06-15",
  "seriesName": "SERIA_FACTURII",
  "useEstimateDetails": true,
  "estimate": {
    "seriesName": "SERIA_PROFORMEI",
    "number": "0001"
  },
  "useStock": false
}
```

</details>

<details>
<summary><strong>18. Emitere factura cu observatii si mentiuni</strong></summary>

Foloseste `observations` si `mentions` pentru textele afisate pe factura.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_FACTURII",
  "issueDate": "2026-06-15",
  "client": { "name": "Client SRL", "vatCode": "RO22222222", "isTaxPayer": true, "address": "Str. Lalelei 1", "city": "Sector 1", "county": "Bucuresti", "country": "Romania", "email": "client@example.com" },
  "products": [{ "name": "Produs 1", "code": "PRD001", "quantity": 1, "price": 100, "measuringUnitName": "buc", "taxPercentage": 21 }],
  "observations": "Marfa se ridica de la sediu in termen de 5 zile lucratoare",
  "mentions": "Plata se face in contul IBAN specificat in contract"
}
```

</details>

## Request body

- InvoiceRequest
  - `companyVatCode` string, required — CIF-ul firmei tale, exact ca in SmartBill Cloud.
  - `seriesName` string, required — Numele seriei de factura. Seria trebuie sa existe in SmartBill.
  - `issueDate` string, date — Data facturii, in format `YYYY-MM-DD`. Daca lipseste, se foloseste data curenta.
  - `dueDate` string, date — Data scadenta a facturii, in format `YYYY-MM-DD`.
  - `isDraft` boolean — Creeaza factura ca ciorna, fara numar alocat pana la finalizarea manuala.
  - `client` Client, required
    - `name` string, required — Numele clientului, persoana juridica sau persoana fizica.
    - `vatCode` string — Codul fiscal al clientului. Poate fi CUI/CIF romanesc sau cod TVA extern.
    - `isTaxPayer` boolean — Indica daca clientul este platitor de TVA. Implicit `false`: un client trimis fara acest camp se salveaza ca neplatitor.
    - `regCom` string — Numarul de inregistrare la Registrul Comertului.
    - `address` string — Adresa clientului.
    - `city` string — Orasul clientului. Daca `county` este "Bucuresti", valoarea trebuie sa fie Sector 1 - Sector 6, altfel e-Factura nu se va valida in SPV.
    - `county` string — Judetul clientului sau regiunea/statul pentru clienti externi.
    - `country` string, required — Tara clientului. API-ul accepta text liber; recomandat este numele tarii sau codul uzual, de exemplu `Romania` sau `RO`.
    - `email` string, email — Adresa de email a clientului.
    - `phone` string — Numarul de telefon al clientului.
    - `contact` string — Persoana de contact
    - `iban` string — IBAN cont bancar
    - `bank` string — Numele bancii
    - `code` string — Codul intern al clientului in SmartBill
    - `saveToDb` boolean — Salveaza clientul in nomenclator daca e nou. Implicit `false`, deci clientul nu se salveaza daca nu ceri explicit - nici la descarcare de gestiune.
  - `products` Product[], required — Liniile de produse, servicii sau discount de pe factura.
    - `name` string, required — Numele produsului sau serviciului
    - `code` string — Codul produsului (SKU). **Obligatoriu daca firma ta are activata setarea "Foloseste cod produs"** in SmartBill Cloud, altfel optional.
    - `productDescription` string — Descriere suplimentara produs
    - `isService` boolean — Este serviciu (nu produs fizic)
    - `quantity` number, required — Cantitate. API-ul nu o valideaza: `0` si valorile negative sunt acceptate, iar documentul se emite fara eroare. Valideaza cantitatea in integrarea ta inainte de a trimite.
    - `measuringUnitName` string, required — Unitate de masura
    - `price` number, required — Pret unitar
    - `currency` 'RON' | 'EUR' | 'USD' | 'GBP' | 'CAD' | 'AUD' | 'CHF' | 'TRY' | 'CZK' | 'DKK' | 'HUF' | 'MDL' | 'SEK' | 'NOK' | 'JPY' | 'EGP' | 'PLN' | 'RUB' | 'AED' | 'BRL' | 'CNY' | 'HRK' | 'INR' | 'KRW' | 'MXN' | 'NZD' | 'RSD' | 'THB' | 'UAH' | 'XDR' | 'ZAR' — Moneda pretului
    - `exchangeRate` number — Curs valutar pentru acest produs
    - `isTaxIncluded` boolean — Pretul include TVA. Implicit `false`, deci preturile sunt considerate fara TVA.
    - `taxName` string — Numele cotei TVA
    - `taxPercentage` number, required — Cota TVA a liniei. SmartBill accepta cotele existente in cont, inclusiv cote personalizate.
    - `warehouseName` string — Numele gestiunii pentru descarcare stoc (case-sensitive!)
    - `isDiscount` boolean — Este linie de discount
    - `numberOfItems` integer — Numarul de linii **imediat anterioare** la care se aplica discountul. **Obligatoriu pe o linie de discount**: fara el discountul e ignorat in silentiu, apelul intoarce `200`, iar documentul se emite cu totalul neredus.
    - `discountType` 1 | 2 — Tipul discountului. `1` = valoric, cu valoarea in `discountValue`. `2` = procentual, cu procentul in `discountPercentage`. Implicit `2`: o linie de discount fara `discountType`, dar cu ambele valori trimise, aplica procentul. **Trimite doar `1` sau `2`.** O alta valoare nu e respinsa, dar produce un document gresit: discountul valoric se scade din total fara sa ajusteze TVA-ul, iar un discount procentual e ignorat complet. Pentru un produs de 100 lei cu TVA 21% si un discount de 10 lei, `discountType: 1` da 108.9, iar o valoare in afara enumerarii da 111.
    - `discountValue` number — Valoarea discountului, pentru discount valoric, cand `discountType` este `1`. **Trebuie sa fie negativa**, deci se trimite cu semnul minus: `-10` pentru un discount de 10 lei. O valoare pozitiva nu e respinsa, dar **creste** totalul in loc sa il scada - un produs de 100 lei cu `discountValue: 10` da 133.1, nu 108.9.
    - `discountPercentage` number — Procentul discountului. Se foloseste pentru discount procentual, cand `discountType` este `2`. Valoarea trebuie sa fie mai mare decat 0 si cel mult 100.
    - `translatedName` string — Numele produsului in limba documentului
    - `translatedMeasuringUnit` string — Unitatea de masura in limba documentului
    - `saveToDb` boolean — Salveaza produsul in nomenclator daca e nou. Cand produsul exista deja si e trimis cu `saveToDb: true`, datele lui din nomenclator se actualizeaza din cerere - inclusiv numele. La descarcare de gestiune (`useStock: true`) actualizarea se face oricum, chiar si cu `saveToDb: false`.
    - `useSBProductName` boolean — Controleaza ce nume apare pe factura cand produsul este identificat prin `code`, iar denumirea trimisa in `name` difera de cea din nomenclator. `true` = pe factura se foloseste numele produsului din SmartBill, iar numele din nomenclator NU se modifica. `false` sau absent = pe factura se foloseste numele trimis prin `name`, iar acesta suprascrie numele produsului in nomenclator (inclusiv cand `saveToDb` este `false`). Necesita setarea "Foloseste cod produs" activata pe firma.
  - `currency` 'RON' | 'EUR' | 'USD' | 'GBP' | 'CAD' | 'AUD' | 'CHF' | 'TRY' | 'CZK' | 'DKK' | 'HUF' | 'MDL' | 'SEK' | 'NOK' | 'JPY' | 'EGP' | 'PLN' | 'RUB' | 'AED' | 'BRL' | 'CNY' | 'HRK' | 'INR' | 'KRW' | 'MXN' | 'NZD' | 'RSD' | 'THB' | 'UAH' | 'XDR' | 'ZAR' — Codul monedei documentului
  - `exchangeRate` number — Cursul valutar folosit pentru document. Daca lipseste, SmartBill foloseste cursul disponibil pentru moneda.
  - `precision` integer — Numarul de zecimale folosit pentru sume. Valorile suportate sunt `2`, `3` si `4`. O valoare mai mare se limiteaza automat la `4`, fara eroare.
  - `useStock` boolean — Descarca stocul la emiterea facturii. Liniile de produs trebuie sa includa gestiunea potrivita. Modul de identificare a produsului depinde de setarea `Foloseste cod produs` din cont. Cand e activa, produsul se identifica **doar prin `code`**: unul care exista pe stoc nu e gasit dupa nume, iar apelul intoarce `Produsul ... nu are codul specificat.`. Cand e inactiva, se identifica **prin nume**, fara sensibilitate la litere mari. In ambele cazuri numele din nomenclator se rescrie cu cel trimis, chiar si cand `saveToDb` este `false` - `mere - 76` trimis pentru produsul `Mere - 76` il redenumeste. Unitatea de masura trebuie sa fie exact cea a produsului din nomenclator, iar `buc` si `BUC` sunt tratate diferit.
  - `payment` InvoicePayment — Plata la crearea facturii
    - `value` number — Suma platii
    - `paymentSeries` string — Seria chitantei
    - `type` 'Chitanta' | 'Bon' | 'Card' | 'Card online' | 'CEC' | 'Bilet ordin' | 'Ordin plata' | 'Mandat postal' | 'Extras de cont' | 'Ramburs' | 'Alta incasare' — Tipul platii
    - `isCash` boolean — Marcheaza incasarea ca numerar. Pentru factura cu incasare, API-ul poate accepta obiectul `payment` si fara acest camp.
  - `paymentDate` string, date — Data incasarii, in format `YYYY-MM-DD`.
  - `paymentUrl` string — Link de plata. Trimite `Generate URL` pentru generare automata prin procesatorul configurat in SmartBill sau trimite un URL propriu, de exemplu un link Stripe.
  - `sendEmail` boolean — Trimite factura pe email dupa emitere.
  - `email` object — Destinatarii emailului, folositi cand `sendEmail` este `true`.
    - `to` string — Adresa destinatarului. Daca lipseste, se foloseste `client.email`.
    - `cc` string — Adrese in copie.
    - `bcc` string — Adrese in copie ascunsa.
  - `language` 'RO' | 'EN' | 'DE' | 'FR' | 'IT' | 'ES' — Limba documentului. Valorile valide sunt limbile predefinite in SmartBill Cloud, plus cele definite in cont la `Configurare > Limbi`. O valoare necunoscuta nu e respinsa de server, dar documentul se emite in limba implicita. Pentru numele produsului si unitatea de masura in limba documentului, foloseste `translatedName` si `translatedMeasuringUnit` pe linia de produs.
  - `observations` string — Observatii vizibile pe document
  - `mentions` string — Mentiuni vizibile pe document
  - `deliveryDate` string, date — Data livrarii, in format `YYYY-MM-DD`.
  - `issuerName` string — Numele emitentului
  - `issuerCnp` string — CNP-ul emitentului (persoana fizica care emite factura)
  - `delegateName` string — Numele delegatului
  - `delegateIdentityCard` string — Seria si numarul cartii de identitate a delegatului
  - `delegateAuto` string — Numarul de inmatriculare al autovehiculului delegatului
  - `aviz` string — Numarul avizului de insotire a marfii, cand factura se emite pe baza unui aviz. Apare pe factura, in footer, sub forma `Nr aviz: <valoare>`.
  - `useIntraCif` boolean — Foloseste codul TVA intracomunitar pentru client.
  - `usePaymentTax` boolean — Aplica TVA la incasare pentru factura.
  - `paymentBase` number — Baza incasata pentru TVA la incasare.
  - `colectedTax` number — TVA incasata.
  - `paymentTotal` number — Totalul incasat.
  - `useEstimateDetails` boolean — Creeaza factura pe baza unei proforme existente.
  - `estimate` object — Proforma sursa, folosita cand `useEstimateDetails` este `true`.
    - `seriesName` string — Seria proformei sursa.
    - `number` string — Numarul proformei sursa.
    - `useStock` boolean — Descarca stocul la emiterea facturii generate din proforma.

## Response `200`

Raspuns V1. `errorText` gol inseamna succes; `errorText` completat inseamna eroare functionala.

- InvoiceResponseV2
  - `errorText` string — Mesaj de eroare. Gol = succes.
  - `message` string
  - `number` string — Numarul facturii nou-create
  - `series` string — Seria facturii
  - `url` string — Link de plata (populat doar daca trimiti `paymentUrl: "Generate URL"`)
  - `documentUrl` string — URL de editare in SmartBill Cloud (cere autentificare)
  - `documentId` integer — ID intern al documentului. Util pentru operatii ulterioare (anulare, restore, storno). `-1` la eroare.
  - `documentViewUrl` string — URL public partajabil cu clientul (deschide PDF-ul fara autentificare; contine hash criptografic).

## Other responses

- `400` — Eroare functionala V1. Toate erorile 400 au aceeasi forma (`errorText` + envelope-ul standard). Exemplele de mai jos arata doar forma raspunsului; lista completa de mesaje si cum le rezolvi e in tabelele din descrierea endpoint-ului (sectiunea "Ai primit o eroare...").
- `401` — Autentificare esuata
- `410` — Limita document depasita
- `500` — Eroare interna V1

---

[API](https://skmtc.dev/smartbill/apis/smartbill-api.md) · [All operations](https://skmtc.dev/smartbill/apis/smartbill-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/smartbill/smartbill-api/revisions/29940a27d41c/schema)
