e-bon
e-bon.ro
Referință

Tipuri de comandă

Referință pentru fiecare comandă fiscală pe care e-bon o trimite către AMEF — corpul cererii, forma rezultatului și ce face fiecare comandă pe dispozitiv.

Tipuri de comandă

Fiecare acțiune fiscală pe care POS-ul tău o face prin e-bon — emiterea unui bon, deschiderea sertarului de bani, închiderea zilei cu raport Z — este trimisă ca o comandă tipizată către un dispozitiv AMEF înregistrat.

Această pagină este referința per tip. Pentru fiecare comandă enumeră identificatorul de protocol pe care îl trimiți în corpul cererii, payload-ul JSON (când este necesar) și ce întoarce dispozitivul. Folosește-o împreună cu pagina API Comenzi, care documentează plicul HTTP, polling-ul și idempotența.

Trimite o comandă

Toate tipurile de comandă folosesc același punct de intrare HTTP:

POST /api/v1/devices/:deviceId/commands
Content-Type: application/json
Authorization: Bearer <cheie-api>
{
  "type": "print_receipt",
  "payload": { /* corp specific tipului, vezi mai jos */ }
}

Un singur domeniu de cheie API (commands) autorizează toate tipurile de comandă enumerate aici. Vezi Chei API pentru cum se generează și se rotesc cheile.

Catalogul comenzilor

Cele 27 de tipuri de comandă, grupate după scop:

IdentificatorCategoriePayloadScop
print_receiptBonuriobligatoriuEmitere bon fiscal de vânzare.
void_receiptBonuriobligatoriuAnularea unui bon emis anterior, după ID.
print_reversal_receiptBonuriobligatoriuEmitere storno (bon fiscal de stornare).
void_open_receiptBonurifărăAnularea unui bon deschis pe dispozitiv.
print_duplicateBonurifărăReimprimarea ultimului bon ca duplicat nefiscal.
non_fiscal_receiptBonuriobligatoriuTipărire liberă, nefiscală.
x_reportRapoartefărăCitire totaluri ale zilei fără închiderea ei.
z_reportRapoartefărăÎnchidere zi fiscală și înscriere totaluri în memoria fiscală.
cash_inNumerarobligatoriuÎnregistrare depunere de numerar.
cash_outNumerarobligatoriuÎnregistrare ridicare de numerar.
get_cash_amountNumerarfărăCitire sold curent de numerar.
open_drawerNumerarfărăDeschiderea sertarului de bani.
set_datetimeConfigurareopționalSetarea ceasului dispozitivului.
set_logoConfigurareobligatoriuÎncărcarea unui bitmap de siglă.
delete_logoConfigurarefărăȘtergerea siglei configurate.
set_vat_ratesConfigurareobligatoriuConfigurarea tabelei de cote TVA.
set_header_footerConfigurareobligatoriuÎnlocuirea rândurilor de antet și subsol.
set_operatorConfigurareobligatoriuAdăugarea sau înlocuirea unui operator.
get_statusDiagnosticfărăCitire stare hârtie, capac și erori.
get_infoDiagnosticfărăCitire serie, firmware și stare memorie fiscală.
get_last_receipt_infoDiagnosticfărăCitire metadate ale ultimului bon emis.
get_vat_ratesDiagnosticfărăCitire tabel de cote TVA configurate.
get_vat_capabilitiesDiagnosticfărăCitire cote TVA acceptate de firmware.
get_header_footer_capabilitiesDiagnosticfărăCitire limite de rânduri și lățime pentru antet/subsol.
get_header_footerDiagnosticfărăCitire antet și subsol curent configurate.
get_operator_capabilitiesDiagnosticfărăCitire număr de operatori și limite de parolă.
raw_commandBrutpropagareTrimitere de octeți specifici protocolului către driver.

Bonuri

Emite un bon fiscal

Emite un bon fiscal de vânzare pe AMEF.

Tip: print_receipt

{
  "items": [
    { "name": "Cafea", "quantity": 2, "price": 9.5, "vatRate": 21, "department": 1 }
  ],
  "payments": [
    { "type": "cash", "amount": 19.0 }
  ]
}
CâmpTipObligatoriuNote
itemslistădaTrebuie să fie nevidă.
items[].namestringdaNume de produs nevid.
items[].quantitynumărdaStrict pozitiv.
items[].pricenumărdaPreț unitar.
items[].vatRatenumărdaUna din 0, 9, 11, 21 (cote TVA românești).
items[].departmentnumărnuIndex departament pe dispozitiv.
paymentslistădaTrebuie să fie nevidă.
payments[].typestringdaUna din cash, card, voucher, other.
payments[].amountnumărdaStrict pozitiv.

Totalul items (cantitate × preț) trebuie să fie egal cu totalul payments cu o toleranță de 0.01.

La succes: result.fiscalId poartă ID-ul fiscal atribuit de AMEF. Detaliile specifice driverului ajung în result.data.

Vezi și: API Bonuri, Fluxul de emitere a bonului.

Anulează un bon

Anulează un bon fiscal emis anterior, după ID-ul său.

Tip: void_receipt

{ "receiptId": "rcpt_01HZ..." }
CâmpTipObligatoriuNote
receiptIdstringdaID-ul bonului de anulat.

Emite un bon de stornare

Emite un storno (bon fiscal de stornare) care anulează legal o vânzare anterioară și face referire la bonul original.

Tip: print_reversal_receipt

{
  "uniqueSaleNumber": "USN-2026-000123",
  "originalReceiptNumber": "0000456",
  "originalReceiptDateTime": "2026-04-20T14:32:11Z",
  "fiscalMemorySerialNumber": "DY12345678",
  "originalZReportNumber": "12",
  "reason": "operator_error",
  "items": [
    { "name": "Cafea", "quantity": 1, "price": 9.5, "vatRate": 21 }
  ],
  "payments": [
    { "type": "cash", "amount": 9.5 }
  ]
}
CâmpTipObligatoriuNote
uniqueSaleNumberstringdaUSN-ul vânzării originale.
originalReceiptNumberstringdaNumărul bonului de stornat.
originalReceiptDateTimestringdaDată ISO-8601 validă.
fiscalMemorySerialNumberstringdaSeria AMEF-ului original.
originalZReportNumberstringnuNumărul raportului Z, dacă este cunoscut.
reasonstringdaUna din operator_error, refund, tax_base_reduction.
itemslistădaAceleași reguli per articol ca la print_receipt.
paymentslistănuDacă este prezent, urmează aceleași reguli ca la print_receipt și se verifică suma.

La succes: ID-ul fiscal al bonului de stornare se întoarce în result.fiscalId.

Vezi și: USN, Storno.

Anulează un bon deschis

Anulează un bon care este deschis în acest moment pe dispozitiv. Folosește această comandă pentru a reseta starea după o întrerupere hardware sau de operator.

Tip: void_open_receipt — fără payload.

Reimprimă ultimul bon

Reimprimă ultimul bon ca duplicat nefiscal.

Tip: print_duplicate — fără payload.

Tipărește un bon nefiscal

Tipărește un bon liber, nefiscal — pre-bon, bon de fidelitate, anunț. Tipăririle nefiscale nu se înscriu în memoria fiscală și nu au ID fiscal.

Tip: non_fiscal_receipt

{
  "lines": ["Mulțumim pentru vizită", "Vă așteptăm cu drag!"],
  "header": "Bon de fidelitate"
}
CâmpTipObligatoriuNote
linesstringdaListă nevidă de rânduri.
headerstringnuRând de antet opțional.

Rapoarte

Citește un raport X

Citește totalurile zilei fără a o închide. Întoarce totaluri, defalcare TVA și număr de bonuri în result.data.

Tip: x_report — fără payload.

La succes, e-bon trimite suplimentar webhook-ul report.generated.

Vezi și: Raport X.

Închide ziua cu un raport Z

Închide ziua fiscală, îngheață totalurile zilei în memoria fiscală și resetează contoarele zilnice.

Tip: z_report — fără payload.

La succes, e-bon trimite suplimentar webhook-ul report.generated.

Vezi și: Raport Z.

Numerar

Înregistrează o depunere

Înregistrează o depunere de numerar în sertarul dispozitivului.

Tip: cash_in

{ "amount": 200, "description": "Fond de început de zi" }
CâmpTipObligatoriuNote
amountnumărdaStrict pozitiv.
descriptionstringnuNotă text liber.

Înregistrează o ridicare

Înregistrează o ridicare de numerar din sertar. Aceeași schemă ca cash_in.

Tip: cash_out

{ "amount": 50, "description": "Depunere la bancă" }

Citește soldul de numerar

Citește soldul curent de numerar urmărit de dispozitiv pentru sertar. Întoarce { cashBalance, currency } în result.data.

Tip: get_cash_amount — fără payload.

Deschide sertarul de bani

Deschide sertarul de bani fără a tipări nimic.

Tip: open_drawer — fără payload.

Configurare

Setează ceasul dispozitivului

Sincronizează ceasul dispozitivului, opțional la un moment specificat.

Tip: set_datetime

{ "datetime": "2026-04-25T10:00:00Z" }
CâmpTipObligatoriuNote
datetimestringnuDacă este prezent, trebuie să fie o dată ISO-8601 validă. Dacă lipsește, dispozitivul se sincronizează la ora curentă a serverului.

Încarcă o siglă

Încarcă un bitmap de siglă pe care dispozitivul îl tipărește în partea de sus a bonurilor.

Tip: set_logo

{ "logo": "iVBORw0KGgoAAAANSUhEUgAA..." }
CâmpTipObligatoriuNote
logostringdaBitmap codat base64.
Fiecare firmware AMEF are propriile limite de dimensiune și format pentru sigle. Verifică documentația dispozitivului înainte de a încărca bitmap-uri mari sau neobișnuite.

Șterge sigla

Elimină sigla configurată pe dispozitiv.

Tip: delete_logo — fără payload.

Configurează cotele TVA

Configurează tabela de cote TVA denumite a dispozitivului (de exemplu A → 21, B → 9).

Tip: set_vat_rates

{
  "rates": [
    { "name": "A", "percentage": 21 },
    { "name": "B", "percentage": 9 }
  ]
}
CâmpTipObligatoriuNote
rateslistădaCel puțin o intrare.
rates[].namestringdaNume slot TVA.
rates[].percentagenumărdaProcent non-negativ.

Setează antetul și subsolul

Înlocuiește rândurile tipărite în partea de sus și de jos a fiecărui bon.

Tip: set_header_footer

{
  "header": ["Cafeneaua mea SRL", "Bd. Magheru 12, București"],
  "footer": ["Mulțumim!", "www.exemplu.ro"]
}
CâmpTipObligatoriuNote
headerstringdaRânduri de antet (lista poate fi vidă).
footerstringdaRânduri de subsol (lista poate fi vidă).
Citește mai întâi limitele dispozitivului cu get_header_footer_capabilities — numărul de rânduri și lățimea în caractere variază în funcție de firmware.

Configurează un operator

Adaugă sau înlocuiește un slot de operator (identitate de casier) pe dispozitiv.

Tip: set_operator

{ "operatorId": 1, "name": "Maria", "password": "1234" }
CâmpTipObligatoriuNote
operatorIdnumărdaÎntreg ≥ 1.
namestringdaNumele operatorului.
passwordstringnuParolă opțională.
Citește mai întâi limitele dispozitivului cu get_operator_capabilities — numărul de sloturi și suportul pentru parolă variază în funcție de firmware.

Diagnostic

Citește starea dispozitivului

Citește starea operațională curentă — hârtie, capac, stare zi fiscală și eventuale erori.

Tip: get_status — fără payload.

Citește identitatea dispozitivului

Citește seria, versiunea de firmware, starea memoriei fiscale, producătorul și modelul dispozitivului.

Tip: get_info — fără payload.

Întoarce { serialNumber, firmwareVersion, fiscalMemoryStatus, manufacturer, model? } în result.data.

Citește ultimul bon

Citește metadatele ultimului bon emis.

Tip: get_last_receipt_info — fără payload.

Întoarce { receiptNumber, date, total, fiscalMemoryNumber? } în result.data.

Citește cotele TVA configurate

Citește tabela de cote TVA configurate în acest moment pe dispozitiv.

Tip: get_vat_rates — fără payload.

Întoarce o listă de { name, percentage } în result.data.

Citește cotele TVA suportate

Citește cotele TVA pe care firmware-ul dispozitivului le acceptă (cotele posibile, nu cele configurate).

Tip: get_vat_capabilities — fără payload.

Citește limitele pentru antet/subsol

Citește limitele de antet și subsol ale dispozitivului.

Tip: get_header_footer_capabilities — fără payload.

Întoarce { maxHeaderLines, maxFooterLines, maxCharsPerLine } în result.data.

Citește antetul și subsolul configurate

Citește antetul și subsolul configurate în acest moment pe dispozitiv.

Tip: get_header_footer — fără payload.

Întoarce { header: string[], footer: string[] } în result.data.

Citește limitele de operator

Citește numărul de sloturi de operator și constrângerile de parolă suportate de firmware.

Tip: get_operator_capabilities — fără payload.

Întoarce { maxOperators, maxNameLength, maxPasswordLength, supportsPassword } în result.data.

Trimite o comandă brută

Cale de ieșire specifică driverului pentru trimiterea de octeți specifici protocolului atunci când nu există o comandă tipizată. Orice trimiți în payload este propagat direct către driverul dispozitivului.

Tip: raw_command

raw_command ocolește toate verificările de payload pe care le face e-bon. Folosit incorect, poate aduce un dispozitiv într-o stare nefuncțională sau emite ieșire fiscală neconformă. Tratează-l ca pe un instrument de diagnostic, nu ca pe un primitiv de producție.

Urmărește rezultatul unei comenzi

Fiecare comandă, indiferent de tip, trece prin același ciclu de viață. Câmpul status de pe documentul de comandă ia una din șase valori:

StareCând o vezi
pendingAPI-ul a acceptat și a persistat comanda — comanda este în așteptare.
sentComanda este în drum spre dispozitiv.
processingDispozitivul a confirmat-o și o procesează.
completedDispozitivul a întors succes — comanda a fost acceptată. result.data și (pentru bonuri) result.fiscalId sunt populate.
failedDispozitivul sau dispecerul au raportat eroare — comanda a fost respinsă. result.errorCode și result.errorMessage sunt populate.
timeoutDispozitivul nu a răspuns în timp util. result.errorCode este E500 (TimeoutCommand). Poți face o nouă încercare.

Plicul complet al rezultatului este { success, data?, fiscalId?, errorCode?, errorMessage? }.

Unde mergi mai departe