---
title: "Emitere proforma"
method: POST
path: "/estimate/v2"
tags: ["Proforme"]
---

# Emitere proforma

`POST /estimate/v2`

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

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

**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 proforma.

<strong>Erori la emiterea proformei</strong>

<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 proformei, 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>estimateProducts 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 proformei.</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>

## Tipuri de emitere

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

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

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "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 proforma completa</strong></summary>

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

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "isDraft": false,
  "issueDate": "2026-06-15",
  "dueDate": "2026-07-15",
  "deliveryDate": "2026-06-20",
  "language": "RO",
  "currency": "RON",
  "precision": 2,
  "useIntraCif": 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
    }
  ],
  "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 proforma cu link de plata</strong></summary>

Emite proforma 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/">Contul Meu > Integrari</a>. Seteaza `paymentUrl: "Generate URL"` pentru a activa generarea link-ului.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "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 proforma ciorna (draft)</strong></summary>

Emite proforma 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_PROFORMEI",
  "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>5. Emitere proforma 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_PROFORMEI",
  "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>6. Emitere proforma cu servicii</strong></summary>

Marcheaza produsele de tip serviciu cu `isService: true`.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "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>7. Emitere proforma cu data scadenta</strong></summary>

Adauga `dueDate` pentru a specifica data scadentei proformei.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "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>8. Emitere proforma cu trimitere pe email</strong></summary>

Emite proforma 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_PROFORMEI",
  "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>9. Emitere proforma in valuta</strong></summary>

Emite proforma in valuta. Seteaza `currency` si `exchangeRate` la nivel de proforma, si `currency` pe fiecare produs cu aceeasi valuta - cursul apare pe proforma 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_PROFORMEI",
  "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>10. Emitere proforma cu pret referinta in valuta</strong></summary>

Util cand contractele sunt in valuta dar emiti proforma in RON - de exemplu, un abonament de mentenanta de 100 EUR emis 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 proforma 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_PROFORMEI",
  "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>11. Emitere proforma 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 proforma cu acest CIF.

```json
{
  "companyVatCode": "CIF_FIRMA",
  "useIntraCif": true,
  "seriesName": "SERIA_PROFORMEI",
  "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>12. Emitere proforma - 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_PROFORMEI",
  "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>13. Emitere proforma 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_PROFORMEI",
  "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>14. Emitere proforma in limba straina</strong></summary>

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

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_PROFORMEI",
  "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>15. Emitere proforma cu observatii si mentiuni</strong></summary>

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

```json
{
  "companyVatCode": "CIF_FIRMA",
  "seriesName": "SERIA_PROFORMEI",
  "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

- EstimateRequest
  - `companyVatCode` string, required — CIF-ul firmei tale, exact ca in SmartBill Cloud.
  - `seriesName` string, required — Numele seriei de proforma. Seria trebuie sa existe in SmartBill.
  - `issueDate` string, date — Data proformei, in format `YYYY-MM-DD`. Daca lipseste, se foloseste data curenta.
  - `dueDate` string, date — Data scadenta a proformei, in format `YYYY-MM-DD`.
  - `isDraft` boolean — Creeaza proforma 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 proforma.
    - `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.
  - `paymentUrl` string — Link de plata. Trimite `Generate URL` pentru generare automata prin procesatorul configurat in SmartBill sau trimite un URL propriu.
  - `sendEmail` boolean — Trimite proforma 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` string — 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 afisate pe proforma.
  - `mentions` string — Mentiuni afisate pe proforma.
  - `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.
  - `issuerName` string — Numele emitentului.
  - `issuerCnp` string — CNP-ul emitentului, cand pe proforma apare persoana fizica emitenta.
  - `delegateName` string — Numele delegatului.
  - `delegateIdentityCard` string — Seria si numarul cartii de identitate a delegatului.
  - `delegateAuto` string — Numarul de inmatriculare al autovehiculului delegatului.
  - `useIntraCif` boolean — Foloseste codul TVA intracomunitar pentru client.
  - `aviz` string — Numarul avizului de insotire a marfii. Apare pe proforma, in footer, sub forma `Nr aviz: <valoare>`.

## Response `200`

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

- EstimateResponseV2
  - `errorText` string — Mesaj de eroare. Gol = succes.
  - `message` string
  - `number` string — Numarul proformei nou-create
  - `series` string — Seria proformei
  - `url` string
  - `documentUrl` string — URL de editare in SmartBill Cloud (cere autentificare)
  - `documentId` integer — ID intern al documentului. `-1` la eroare.
  - `documentViewUrl` string — URL public partajabil cu clientul.

## 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)
