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, vatRate, department, discount? }.
paymentsarraydaCel puțin o plată. Fiecare { method, amount }. methodcash, card, voucher, credit, other.
totalnumberdaTotalul bonului (suma plăților).
vatBreakdownarraydaCel puțin o intrare. Fiecare { rate, base, amount }. rate0, 9, 11, 21.
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, "vatRate": 9, "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "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, "vatRate": 9, "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "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
deviceIdstringFiltrează după dispozitiv.
typestringUna dintre sale, refund, storno.
operatorIdstringFiltrează după operator.
minTotalnumberLimită inferioară inclusivă pe total.
maxTotalnumberLimită superioară inclusivă pe total. Trebuie să fie ≥ minTotal.
startDatestringTimestamp ISO 8601; bonuri cu createdAt >= startDate.
endDatestringTimestamp 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ă, 1100.
startAfterstringCursor — 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, "vatRate": 9, "department": 1 }
    ],
    "payments": [{ "method": "cash", "amount": 10.98 }],
    "total": 10.98,
    "vatBreakdown": [{ "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 — rapoartele X / Z / JE / MF construite peste jurnalul de bonuri.
  • 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.