Dezvoltatori
API pentru dezvoltatori
API-ul public eBil expune la /api/v1 facturi emise, clienți, produse, categorii, plăți, facturi primite, jurnalul de casă și bancă și datele firmei. Te autentifici cu o cheie API cu prefixul ebil_, generată din Setări → API (doar managerii), iar consumul se plătește pay-as-you-go din portofel: citirile de la 0,02 € per apel, scrierile de la 0,01 €. Fiecare răspuns include meta.charged_tokens și meta.balance.
API-ul public eBil îți dă acces programatic la datele firmei tale: facturi emise, clienți, produse, categorii, plăți, facturi primite, jurnalul de casă și bancă și datele firmei. Toate cererile se autentifică cu o cheie API, iar consumul se plătește pay-as-you-go din portofel, per apel.
Facturi emise
Listare, creare cu linii, detalii și actualizare.
Clienți
CRUD complet pentru clienți și firme legate.
Produse
Nomenclator cu prețuri, TVA și categorii.
Categorii produse
CRUD cu suport pentru categorii părinte.
Plăți
Agendă de plăți, export CSV bancar, marcare plătită.
Facturi primite
Citire cu filtre pe status și perioadă, cu liniile incluse.
Casă și bancă
Conturi cu sold calculat și jurnalul de intrări și ieșiri.
Firmă
Datele firmei active ale cheii: CUI, regim fiscal, CAEN.
Autentificare
Generezi cheia API din aplicație, din pagina
Setări → API (doar managerii firmei pot
gestiona chei). Cheia începe cu prefixul ebil_ și se afișează
o singură dată, la generare. O trimiți la fiecare cerere în headerul
Authorization: Bearer sau X-API-Key.
Cheia lucrează în contextul firmei pentru care a fost generată și consumă din portofelul proprietarului de resurse al firmei.
Exemplu de cerere
curl -X GET "https://app.ebil.ro/api/v1/invoices?per_page=5" \ -H "Authorization: Bearer ebil_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Accept: application/json"
Coduri de eroare
| Cod | Semnificație | Exemplu de răspuns |
|---|---|---|
| 401 | Cheie API lipsă, invalidă sau revocată. | {"message": "Cheie API invalidă sau lipsă."} |
| 402 | Portofelul firmei nu are credit suficient pentru apel. | {"message": "Credit insuficient. Încarcă portofelul pentru a continua."} |
| 422 | Validare eșuată (câmp lipsă sau invalid, resursă în stare imutabilă). | {"message": "Unul dintre câmpurile customer_id sau customer_cui este obligatoriu."} |
| 404 | Resursa nu există în firma cheii. | {"message": "Factura nu a fost găsită."} |
Costuri
Citirile (listări, detalii, exporturile de date) costă 0,02 € per apel,
iar scrierile și acțiunile (creări, actualizări, ștergeri, marcarea plăților) 0,01 €.
Crearea de facturi, clienți, produse, categorii și generarea de plăți din facturi primite au costul propriu, mai jos.
Fiecare răspuns include meta.charged_tokens (câți tokeni s-au consumat) și
meta.balance (soldul rămas al portofelului).
Citire (api_sync)
0,02 €
0,2 tokeni
Scriere (api_call)
0,01 €
0,1 tokeni
Factură creată/actualizată
0,05 €
0,5 tokeni
Client creat/actualizat/șters
0,01 €
0,1 tokeni
Produs creat/actualizat/șters
0,01 €
0,1 tokeni
Categorie creată/actualizată/ștearsă
0,01 €
0,1 tokeni
Plată generată din factură primită
0,01 €
0,1 tokeni
Export CSV plăți bancare
0,025 €
0,25 tokeni
Convenții
- Prefixul tuturor rutelor este
/api/v1. - Listările returnează
data(array) plus câmpurile de paginare Laravel:current_page,last_page,from,to,total. - Controlul paginii se face cu
per_page(implicit 50; maximum 200 la majoritatea listelor, 100 la jurnal). - După fiecare răspuns primești și
meta.charged_tokensșimeta.balance.
Facturi emise
/api/v1/invoices
Filtre: status (draft, issued, pending, paid, partial, overdue), series, number, updated_since, per_page.
/api/v1/invoices
/api/v1/invoices/{id}
acceptă și număr, ex. „EB 142"
/api/v1/invoices/{id}
Creare factură (câmpuri acceptate la POST)
| Câmp | Tip | Obligatoriu | Observații |
|---|---|---|---|
| customer_id | integer | da, altfel customer_cui | Clientul trebuie să existe în firmă. |
| customer_cui | string | alternativă la customer_id | Căutare după CUI pe clientul de tip companie. |
| issue_date | date (Y-m-d) | da | Data emiterii. |
| due_date | date | nu | Trebuie să fie ≥ issue_date. |
| items | array (min. 1) | da | Vezi liniile de mai jos. |
| items.*.product_id | integer | alternativă la name | Prețul și TVA se moștenesc din produs. |
| items.*.name | string | da, fără product_id | Denumire liberă a liniei. |
| items.*.quantity | numeric | nu | Implicit 1. |
| items.*.unit_price | numeric | nu | Implicit prețul produsului, altfel 0. |
| items.*.vat_rate | numeric (0-100) | nu | Implicit TVA-ul produsului, altfel 21. |
| items.*.unit | string | nu | Implicit „buc". |
| currency | string (3 litere) | nu | Implicit RON. |
| type | invoice | proforma | nu | Implicit invoice. |
| series_id | integer | nu | Implicit seria implicită a firmei. |
| payment_method | transfer, cash, card, check, other | nu | Implicit transfer. |
| payment_terms | integer | nu | Termen de plată în zile. |
| notes | string | nu | Notă vizibilă pe document. |
| internal_notes | string | nu | Notă internă, neafișată clientului. |
La PUT se pot actualiza doar: issue_date, due_date, payment_method, payment_terms, notes, internal_notes. Facturile înscrise în SPV nu mai pot fi modificate (corectarea se face prin notă de credit).
Exemplu
curl -X POST "https://app.ebil.ro/api/v1/invoices" \
-H "Authorization: Bearer ebil_..." -H "Content-Type: application/json" \
-d '{
"customer_cui": "RO34958130",
"issue_date": "2026-10-16",
"due_date": "2026-10-30",
"items": [
{"product_id": 12, "quantity": 2},
{"name": "Servicii consultanță", "quantity": 1, "unit_price": 450, "vat_rate": 21}
]
}'
{
"data": {
"id": 871,
"series": "EB",
"number": "142",
"display_number": "EB 142",
"status": "pending",
"is_draft": true,
"type": "invoice",
"issue_date": "2026-10-16",
"due_date": "2026-10-30",
"currency": "RON",
"subtotal": 1240.0,
"total_vat": 260.4,
"total": 1500.4,
"paid_amount": 0.0,
"customer": {"id": 55, "name": "BRANDED S.R.L.", "cui": "RO34958130"},
"anaf_status": null,
"items": [ ... ],
"created_at": "2026-10-16T09:12:34.000000Z",
"updated_at": "2026-10-16T09:12:34.000000Z"
},
"meta": {"charged_tokens": 0.2, "balance": 41.3}
}
Clienți
/api/v1/customers
filtre: q, updated_since, per_page
/api/v1/customers
/api/v1/customers/{id}
/api/v1/customers/{id}
/api/v1/customers/{id}
La POST: type (individual, company) și name sunt obligatorii. Opționale:
cnp, email, phone, address, city, county, postal_code, country, bank_name, bank_iban, payment_term, discount_percent, contact_name, contact_role, contact_email, contact_phone, notes. Toate sunt acceptate și la PUT.
curl -X POST "https://app.ebil.ro/api/v1/customers" \
-H "Authorization: Bearer ebil_..." -H "Content-Type: application/json" \
-d '{"type": "individual", "name": "Ion Popescu", "email": "[email protected]"}'
{
"data": {
"id": 102,
"type": "individual",
"name": "Ion Popescu",
"cnp": null,
"cui": null,
"email": "[email protected]",
"phone": null,
"payment_term": null,
"created_at": "2026-10-16T09:20:11.000000Z",
"updated_at": "2026-10-16T09:20:11.000000Z"
},
"meta": {"charged_tokens": 0.5, "balance": 40.8}
}
Produse
/api/v1/products
filtre: q, updated_since, per_page
/api/v1/products
/api/v1/products/{id}
/api/v1/products/{id}
/api/v1/products/{id}
La POST: name și price sunt obligatorii. Opționale:
sku, description, unit, cost_price, vat_rate sau vat_rate_id (din nomenclatorul de cote), currency_id, product_type_id, category_id, is_active, barcode.
curl -X POST "https://app.ebil.ro/api/v1/products" \
-H "Authorization: Bearer ebil_..." -H "Content-Type: application/json" \
-d '{"name": "Consultanță fiscală", "unit": "oră", "price": 450, "vat_rate": 21, "category_id": 3}'
{
"data": {
"id": 12,
"sku": null,
"name": "Consultanță fiscală",
"unit": "oră",
"price": 450.0,
"cost_price": null,
"vat_rate": 21.0,
"currency": "RON",
"product_type": "Serviciu",
"category": "Servicii profesionale",
"category_id": 3,
"is_active": true,
"created_at": "2026-10-16T09:25:02.000000Z",
"updated_at": "2026-10-16T09:25:02.000000Z"
},
"meta": {"charged_tokens": 0.5, "balance": 40.3}
}
Categorii produse
/api/v1/product-categories
filtre: updated_since, per_page
/api/v1/product-categories
/api/v1/product-categories/{id}
/api/v1/product-categories/{id}
/api/v1/product-categories/{id}
Câmpuri: name (obligatoriu la POST), slug (generat din name dacă lipsește), description, parent_id (altă categorie a firmei, pentru ierarhie).
curl -X POST "https://app.ebil.ro/api/v1/product-categories" \
-H "Authorization: Bearer ebil_..." -H "Content-Type: application/json" \
-d '{"name": "Servicii profesionale"}'
{
"data": {"id": 3, "name": "Servicii profesionale", "slug": "servicii-profesionale", "parent_id": null, "parent_name": null},
"meta": {"charged_tokens": 0.25, "balance": 40.05}
}
Plăți
/api/v1/payments
filtre: status (pending, paid, cancelled), kind (supplier, tax, fee, manual), q, per_page
/api/v1/payments
plată manuală
/api/v1/payments/{id}
/api/v1/payments/{id}
/api/v1/payments/{id}
doar plățile pending
/api/v1/payments/export
CSV pentru import bancar (plățile pending)
/api/v1/payments/from-received/{receivedInvoiceId}
/api/v1/payments/{id}/paid
La POST (plată manuală): beneficiary_name și amount sunt obligatorii. Opționale:
beneficiary_fiscal_id, beneficiary_iban, payer_iban, currency, due_date, description, kind (manual, fee), deductible, category.
La POST /{id}/paid: opționale paid_at, paid_amount, payment_method.
curl -X POST "https://app.ebil.ro/api/v1/payments" \
-H "Authorization: Bearer ebil_..." -H "Content-Type: application/json" \
-d '{"beneficiary_name": "RCS & RDS S.A.", "amount": 120.5, "due_date": "2026-10-25", "description": "Abonament internet"}'
{
"data": {
"id": 340,
"kind": "manual",
"status": "pending",
"reference": "EB-20261016-001",
"beneficiary_name": "RCS & RDS S.A.",
"amount": 120.5,
"currency": "RON",
"due_date": "2026-10-25",
"paid_at": null
},
"meta": {"charged_tokens": 0.1, "balance": 39.95}
}
Facturi primite (doar citire)
Importul rămâne în aplicație (upload XML/PDF, SPV, email); API-ul expune listarea și detaliul, cu liniile incluse, pentru sincronizări externe.
/api/v1/received-invoices
Filtre: q, status (imported, validated, paid, partial, rejected, archived, storno), date_from, date_to, per_page (max. 200).
/api/v1/received-invoices/{id}
cu items
curl "https://app.ebil.ro/api/v1/received-invoices?status=paid&date_from=2026-10-01" \ -H "Authorization: Bearer ebil_..."
{
"data": [
{
"id": 61,
"series": "AR",
"number": "4412",
"display_number": "AR 4412",
"status": "paid",
"payment_status": "paid",
"supplier": {"name": "Romtelecom S.A.", "fiscal_id": "RO 7738111"},
"issue_date": "2026-10-02",
"currency": "RON",
"subtotal": 238.0,
"total_vat": 57.12,
"total": 295.12,
"paid_amount": 295.12,
"remaining_amount": 0.0
}
],
"current_page": 1, "last_page": 1, "from": 1, "to": 1, "total": 1,
"meta": {"charged_tokens": 0.2, "balance": 39.75}
}
Casă și bancă (doar citire)
Jurnalul se scrie exclusiv prin fluxurile interne (extrase bancare, plăți, sincronizări); API-ul expune conturile, cu soldul calculat, și intrările de jurnal pentru reconciliere și raportare externă.
/api/v1/cashbook-accounts
/api/v1/cashbook-entries
Filtre: account_id, direction (in, out), date_from, date_to, q, per_page (max. 100).
curl "https://app.ebil.ro/api/v1/cashbook-entries?direction=out&date_from=2026-10-01&per_page=3" \ -H "Authorization: Bearer ebil_..."
{
"data": [
{
"id": 5231,
"account": {"id": 4, "name": "Cont ING", "type": "bank", "currency": "RON"},
"date": "2026-10-03",
"direction": "out",
"amount": 295.12,
"currency": "RON",
"counterparty": "Romtelecom S.A.",
"details": "Plata factura AR 4412",
"received_invoice_id": 61
}
],
"current_page": 1, "last_page": 8, "from": 1, "to": 3, "total": 22,
"meta": {"charged_tokens": 0.2, "balance": 39.55}
}
Firmă
/api/v1/company
curl "https://app.ebil.ro/api/v1/company" -H "Authorization: Bearer ebil_..."
{
"data": {
"id": 7,
"name": "BRANDED S.R.L.",
"cui": "RO34958130",
"registration_number": "J2015001395167",
"legal_form": "Societate cu raspundere limitata",
"is_vat_payer": true,
"tax_regime": "profit",
"address": "Str. Vidin nr. 12, Pielești, Dolj",
"caen_code": "6201",
"caen_description": "Activități de realizare a softului la comandă (software orientat pe client)"
},
"meta": {"charged_tokens": 0.2, "balance": 39.35}
}
MCP (Model Context Protocol)
Același registru de tool-uri AI al asistentului eBil este expus și ca server MCP streamable HTTP la
POST /api/mcp, cu aceeași cheie API (vezi
autentificarea):
tool-urile de citire rulează gratuit, iar cele mutante necesită opțiunea „Permite modificări prin MCP" activată pe cheie.
Se pot conecta clienți AI precum Claude Desktop sau ChatGPT.
API eBil
Generează o cheie și începe integrarea
Din aplicație, pagina Setări → API (doar managerii). Plătești doar apelurile efectuate, din portofelul firmei.
Primești 5 € credit de start. Nu ai nevoie de card.