e-bon
e-bon.ro
Referință API

Bonuri

Endpoint-uri REST pentru stocarea, listarea și consultarea bonurilor fiscale după tipărirea pe AMEF — scheme cerere/răspuns, exemple curl și coduri de eroare per endpoint.

Bonuri

API-ul de bonuri este stratul de jurnal al e-bon: după ce o comandă fiscală a fost executată de AMEF și imprimanta a returnat un ID fiscal, integrarea stochează o copie a bonului în e-bon, ca să poată fi căutat, exportat și auditat ulterior. Endpoint-urile de sub /api/v1/receipts nu tipăresc nimic — tipărirea se face prin stratul Comenzi pentru dispozitive; colecția de bonuri este un jurnal write-once cu ce s-a tipărit deja.

Toate endpoint-urile din acest grup acceptă fie o cheie API (x-api-key / Authorization: Bearer …), fie un JWT din Portal și sunt guvernate de un singur scope: receipts. Nu există acces read-only separat pentru aceste rute — receipts:read și receipts:admin acoperă alte operațiuni (export istoric, storno) documentate în altă parte. Vezi Autentificare › Alege permisiunile pentru catalogul complet.

Plicul de eroare, regulile de idempotență și convențiile de paginare folosite mai jos sunt documentate o singură dată pe Prezentarea API-ului; pe această pagină listăm doar codurile de eroare specifice fiecărui endpoint.

POST /api/v1/receipts

Stochează un bon după o tipărire fiscală reușită. Apelează acest endpoint imediat ce o comandă print_receipt pe dispozitiv întoarce un ID fiscal, ca să păstrezi jurnalul e-bon sincronizat.

  • Scope auth: receipts
  • Idempotență: acceptă header-ul Idempotency-Key (replay-urile întorc răspunsul 201 inițial).
  • Efect lateral: difuzează un eveniment receipt.created pe WebSocket-ul de evenimente al organizației și trimite un webhook receipt.created către abonați.

Corpul cererii

CâmpTipObligatoriuNote
deviceIdstringdaTrebuie să fie un dispozitiv care există în organizația ta.
typestringdaUna dintre sale, refund, storno.
itemsarraydaCel puțin un articol. Fiecare { name, quantity, price, vatGroup, department?, discount? } — omite department pentru o vânzare cu denumire, contabilizată pe propria grupă TVA a articolului. vatGroup ∈ VAT1..VAT16, exempt (grupa TVA a dispozitivului).
paymentsarraydaPoate fi gol (un bon tipărit fără linii de plată explicite este închis de dispozitiv cu numerar). Fiecare { method, amount }. method ∈ cash, card, check, credit, coupons, meal-vouchers, value-tickets, voucher, modern-payment, card-advance, foreign-currency, bank, ext-coupons, packaging, internal-usage, damage, reserved1, reserved2, other.
totalnumberdaTotalul bonului (suma plăților).
vatBreakdownarraydaPoate fi goală (best-effort — citirea tabelei de cote TVA după tipărire poate eșua). Fiecare { group, rate, base, amount } — group este grupa TVA a dispozitivului, rate procentul extras din tabela de cote a imprimantei.
operatorIdstringdaIdentificatorul operatorului / casierului.
fiscalIdstringnuID-ul fiscal returnat de AMEF.
fiscalDatestringnuData fiscală returnată de AMEF.
customerCifstringnuCIF client, 2–20 caractere, fără spații la capete.
qrCodestringnuDate QR code, ≤ 2048 caractere.
sourcestringnuUna dintre api, local, portal. Implicit api.

Răspuns (201 Created)

{
  "receipt": {
    "id": "rec_abc123",
    "deviceId": "dev_pos_01",
    "type": "sale",
    "items": [
      { "name": "Paine alba 500g", "quantity": 2, "price": 5.49, "vatGroup": "VAT2", "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "group": "VAT2", "rate": 9, "base": 10.07, "amount": 0.91 }],
    "operatorId": "casier_01",
    "orgId": "acme_corp",
    "fiscalId": "AMEF-000123",
    "fiscalDate": "2026-04-09",
    "source": "api",
    "createdAt": "2026-04-09T08:10:00.000Z"
  }
}

Exemplu

curl -X POST https://api.e-bon.ro/api/v1/receipts \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-12345-attempt-1" \
  -d '{
    "deviceId": "dev_pos_01",
    "type": "sale",
    "items": [
      { "name": "Paine alba 500g", "quantity": 2, "price": 5.49, "vatGroup": "VAT2", "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "group": "VAT2", "rate": 9, "base": 10.07, "amount": 0.91 }],
    "operatorId": "casier_01",
    "fiscalId": "AMEF-000123",
    "fiscalDate": "2026-04-09"
  }'

Coduri de eroare

Catalogul HTTP complet este pe Prezentare API › Catalogul codurilor de eroare HTTP.

GET /api/v1/receipts

Listează bonurile organizației cu paginare prin cursor și un set de filtre opționale. Bonurile sunt returnate în ordine descrescătoare a datei, implicit.

  • Scope auth: receipts

Parametri query

ParametruTipImplicitNote
deviceIdstring—Filtrează după dispozitiv.
typestring—Una dintre sale, refund, storno.
operatorIdstring—Filtrează după operator.
minTotalnumber—Limită inferioară inclusivă pe total.
maxTotalnumber—Limită superioară inclusivă pe total. Trebuie să fie ≥ minTotal.
startDatestring—Timestamp ISO 8601; bonuri cu createdAt >= startDate.
endDatestring—Timestamp ISO 8601; bonuri cu createdAt <= endDate.
sortBystringcreatedAtcreatedAt sau total. Ignorat când startDate/endDate este setat (sortare după createdAt).
sortOrderstringdescasc sau desc.
limitinteger50Mărime pagină, 1–100.
startAfterstring—Cursor — trimite valoarea lastId din răspunsul precedent.
Când combini un filtru pe interval de total (minTotal / maxTotal) cu sortare, serverul sortează întâi după total (ca să satisfacă regula Firestore pentru range-query), apoi după createdAt desc ca tiebreaker.

Răspuns (200 OK)

{
  "receipts": [
    {
      "id": "rec_abc123",
      "deviceId": "dev_pos_01",
      "type": "sale",
      "total": 10.98,
      "operatorId": "casier_01",
      "orgId": "acme_corp",
      "createdAt": "2026-04-09T08:10:00.000Z"
    }
  ],
  "hasMore": true,
  "lastId": "rec_abc123"
}

Exemplu

curl "https://api.e-bon.ro/api/v1/receipts?deviceId=dev_pos_01&limit=20" \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

Apoi, pentru a aduce pagina următoare:

curl "https://api.e-bon.ro/api/v1/receipts?deviceId=dev_pos_01&limit=20&startAfter=rec_abc123" \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

Coduri de eroare

GET /api/v1/receipts/{receiptId}

Returnează un singur bon după ID.

  • Scope auth: receipts

Parametri cale

ParametruTipNote
receiptIdstringID-ul documentului bon.

Răspuns (200 OK)

{
  "receipt": {
    "id": "rec_abc123",
    "deviceId": "dev_pos_01",
    "type": "sale",
    "items": [
      { "name": "Paine alba 500g", "quantity": 2, "price": 5.49, "vatGroup": "VAT2", "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "group": "VAT2", "rate": 9, "base": 10.07, "amount": 0.91 }],
    "operatorId": "casier_01",
    "orgId": "acme_corp",
    "fiscalId": "AMEF-000123",
    "fiscalDate": "2026-04-09",
    "createdAt": "2026-04-09T08:10:00.000Z"
  }
}

Exemplu

curl https://api.e-bon.ro/api/v1/receipts/rec_abc123 \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

Coduri de eroare

Vezi și

  • Comenzi pentru dispozitive — emite o comandă print_receipt înainte să stochezi bonul aici.
  • Rapoarte — rapoarte live de pe dispozitiv: citiri MF/EJ, tipăriri X/Z/periodice, export arhivă ANAF.
  • Prezentare API — URL de bază, plic de eroare, limite de rată, idempotență, paginare.
  • Depanare — rețete pe simptom când bonurile eșuează la tipărire, expiră sau declanșează respingeri ANAF.