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

Dispozitive

Endpoint-uri REST pentru gestionarea dispozitivelor fiscale (AMEF) — CRUD, claim/release, status live, alerte și setul complet de comenzi (sold de casă, dată/oră, sigle, cote TVA, antet/subsol, operatori, anulare, storno etc.).

Dispozitive

API-ul de dispozitive este cea mai largă suprafață din e-bon. Se împarte în două straturi, ambele montate sub /api/v1/devices:

  • CRUD & introspecție — înregistrează, actualizează și șterge dispozitive, le listează, citește status și alerte. Aceste endpoint-uri citesc/scriu în înregistrarea dispozitivului din Firestore și în gateway-ul WebSocket din memorie.
  • Comenzi & operațiuni live — preluare/eliberare control (claim/release), trimitere de comenzi fiscale (set_datetime, print_duplicate, non_fiscal_receipt, set_logo, configurări TVA/antet/subsol/operator, anulări, stornări…) și citire de date live de pe dispozitiv. Pentru majoritatea rutelor de comandă, platforma transmite cererea spre dispozitiv prin WebSocket și așteaptă răspunsul acestuia înainte de a răspunde.

Fiecare endpoint își declară mai jos propriul scope. Cele patru scope-uri folosite în acest grup sunt devices:read, devices:write, commands și receipts — vezi Autentificare › Alege permisiunile pentru catalogul complet. Plicul de eroare, limitele de rată și regulile de autentificare sunt documentate o singură dată pe Prezentarea API-ului.

Endpoint-urile de tip comandă live (sold de casă, set datetime, print duplicate, non-fiscal, sigla, cote TVA, antet/subsol, operator, info, last-receipt, void, storno) cer ca dispozitivul să fie online prin WebSocket și să aibă un controller atribuit. Dacă vreuna din condiții nu e îndeplinită, cererea eșuează cu 503 SERVICE_UNAVAILABLE.

CRUD

POST /api/v1/devices

Înregistrează un dispozitiv fiscal nou pe organizație.

  • Scope auth: devices:write
  • Verificare plan: cererea este verificată față de limita de dispozitive a planului tău înainte de validarea corpului; dacă organizația ta a atins deja limita de dispozitive, cererea este respinsă cu 403.

Corpul cererii

CâmpTipObligatoriuNote
namestringda1–255 caractere.
protocolstringdaUna dintre datecs_compact, datecs_professional, datecs_extended, daisy, daisy_ro, eltrade, incotex, tremol, tremol_v2, custom, mfje.
transportstringdaUna dintre tcp, bluetooth, serial, usb.
locationIdstringdaLocația de care aparține dispozitivul (≥ 1 caracter).
connectionParamsobjectdaFie { host: string, port: number (1–65535) } (TCP), fie { address: string } (bluetooth/serial/usb).

Răspuns (201 Created)

{
  "id": "dev_pos_01",
  "name": "Tejghea POS 1",
  "protocol": "datecs_compact",
  "transport": "tcp",
  "locationId": "loc_main",
  "connectionParams": { "host": "192.168.1.50", "port": 9100 },
  "orgId": "acme_corp",
  "status": "offline",
  "controllerId": null,
  "controllerName": null,
  "createdAt": "2026-04-09T08:10:00.000Z",
  "updatedAt": "2026-04-09T08:10:00.000Z"
}

Exemplu

curl -X POST https://api.e-bon.ro/api/v1/devices \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Tejghea POS 1",
    "protocol": "datecs_compact",
    "transport": "tcp",
    "locationId": "loc_main",
    "connectionParams": { "host": "192.168.1.50", "port": 9100 }
  }'

Coduri de eroare

GET /api/v1/devices

Listează dispozitivele organizației, opțional filtrate după status sau locationId.

  • Scope auth: devices:read

Parametri query

ParametruTipNote
statusstringUna dintre online, offline, busy, error.
locationIdstringFiltrează după locație.

Răspuns (200 OK)

[
  {
    "id": "dev_pos_01",
    "name": "Tejghea POS 1",
    "protocol": "datecs_compact",
    "transport": "tcp",
    "locationId": "loc_main",
    "connectionParams": { "host": "192.168.1.50", "port": 9100 },
    "status": "online",
    "orgId": "acme_corp",
    "controllerId": "instance_a",
    "controllerName": "Counter A",
    "createdAt": "2026-04-09T08:10:00.000Z",
    "updatedAt": "2026-04-09T08:10:00.000Z"
  }
]

Exemplu

curl "https://api.e-bon.ro/api/v1/devices?status=online" \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

GET /api/v1/devices/statuses

Returnează conectivitatea WebSocket (wsConnected) și statusul Firestore pentru toate dispozitivele organizației, într-un singur apel.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "statuses": {
    "dev_pos_01": {
      "wsConnected": true,
      "firestoreStatus": "online",
      "lastSeen": "2026-04-09T08:09:55.000Z"
    },
    "dev_pos_02": { "wsConnected": false, "firestoreStatus": "offline", "lastSeen": null }
  }
}

Exemplu

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

GET /api/v1/devices/alerts

Returnează alertele derivate pentru toate dispozitivele organizației, indexate după deviceId.

  • Scope auth: devices:read

Parametri query

ParametruTipNote
severitystringFiltrează după severitate: warning, error, info.

Răspuns (200 OK)

{
  "alerts": {
    "dev_pos_01": [
      {
        "type": "paper_low",
        "severity": "warning",
        "message": "Paper roll is below 10%",
        "deviceId": "dev_pos_01",
        "deviceName": "Tejghea POS 1",
        "detectedAt": "2026-04-09T08:00:00.000Z"
      }
    ]
  }
}

Exemplu

curl "https://api.e-bon.ro/api/v1/devices/alerts?severity=error" \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

GET /api/v1/devices/{deviceId}

Returnează un singur dispozitiv după ID.

  • Scope auth: devices:read

Exemplu

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

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există în organizația ta.

PATCH /api/v1/devices/{deviceId}

Actualizează name, connectionParams și/sau locationId. Trebuie furnizat cel puțin un câmp.

  • Scope auth: devices:write

Corpul cererii

CâmpTipNote
namestring1–255 caractere.
connectionParamsobjectAceeași formă ca la creare.
locationIdstringMută dispozitivul într-o altă locație.

Exemplu

curl -X PATCH https://api.e-bon.ro/api/v1/devices/dev_pos_01 \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Tejghea POS 1 (renumită)" }'

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei (de ex. corp gol).
  • NOT_FOUND (404) — dispozitivul nu există în organizația ta.

DELETE /api/v1/devices/{deviceId}

Șterge definitiv un dispozitiv.

  • Scope auth: devices:write
  • Răspuns: 204 No Content la succes.

Exemplu

curl -X DELETE https://api.e-bon.ro/api/v1/devices/dev_pos_01 \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există în organizația ta.

Control & status

POST /api/v1/devices/{deviceId}/claim

Setează controllerId și controllerName pe un dispozitiv, indicând care instanță de aplicație îl conduce în prezent. Difuzează un eveniment device.claimed pe WebSocket-ul de evenimente al organizației.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
controllerIdstringda1–255 caractere. Stabil pe instanță.
controllerNamestringda1–255 caractere. Etichetă lizibilă.

Exemplu

curl -X POST https://api.e-bon.ro/api/v1/devices/dev_pos_01/claim \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
  -H "Content-Type: application/json" \
  -d '{ "controllerId": "instance_a", "controllerName": "Counter A" }'

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • CONFLICT (409) — dispozitivul este deja controlat de un alt controllerId.

POST /api/v1/devices/{deviceId}/release

Șterge controllerId / controllerName. Doar controllerul curent poate elibera dispozitivul.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
controllerIdstringdacontrollerId al instanței care eliberează controlul.

Coduri de eroare

  • FORBIDDEN (403) — controllerId nu corespunde controllerului curent.
  • NOT_FOUND (404) — dispozitivul nu există.

GET /api/v1/devices/{deviceId}/status

Returnează conectivitatea WebSocket și statusul Firestore pentru un singur dispozitiv.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "deviceId": "dev_pos_01",
  "wsConnected": true,
  "firestoreStatus": "online",
  "lastSeen": "2026-04-09T08:09:55.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.

GET /api/v1/devices/{deviceId}/connection-history

Returnează ultimele 20 de evenimente de conectare/deconectare pentru un dispozitiv, cele mai noi primele.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "events": [
    {
      "type": "connected",
      "timestamp": "2026-04-09T08:00:00.000Z",
      "deviceModel": "Datecs DP-25",
      "appVersion": "2.4.1",
      "osVersion": "Android 14",
      "code": null,
      "reason": null
    },
    {
      "type": "disconnected",
      "timestamp": "2026-04-08T22:15:00.000Z",
      "deviceModel": "Datecs DP-25",
      "appVersion": "2.4.1",
      "osVersion": "Android 14",
      "code": 1006,
      "reason": "network unreachable"
    }
  ]
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.

GET /api/v1/devices/{deviceId}/alerts

Returnează alertele derivate pentru un singur dispozitiv.

  • Scope auth: devices:read

Parametri query

ParametruTipNote
severitystringFiltrează după severitate: warning, error, info.

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.

Comenzi

POST /api/v1/devices/{deviceId}/commands

Scurtătură generică pentru a pune în coadă o comandă fiscală țintită spre un dispozitiv. Corpul este pre-validat față de schema payload-ului pentru type-ul dat înainte de dispatch.

  • Scope auth: commands
  • Limită de rată: această rută este supusă unei limite de rată dedicate, mai stricte, pentru comenzi (în plus față de limita globală a API-ului).

Corpul cererii

CâmpTipObligatoriuNote
typestringdaUna dintre: print_receipt, void_receipt, x_report, z_report, cash_in, cash_out, get_status, get_cash_amount, set_datetime, print_duplicate, non_fiscal_receipt, set_logo, delete_logo, raw_command, open_drawer (plus tipurile mai specifice listate în rutele dedicate de mai jos).
payloadobjectdaPayload specific comenzii. Pre-validat pe server.

Răspuns (201 Created)

{
  "id": "cmd_abc123",
  "deviceId": "dev_pos_01",
  "type": "print_receipt",
  "payload": { "items": [], "payments": [] },
  "orgId": "acme_corp",
  "status": "pending",
  "apiKeyId": "apikey_abc",
  "createdAt": "2026-04-09T08:10:00.000Z",
  "updatedAt": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • VALIDATION_ERROR (400) — payload de comandă invalid.
  • NOT_FOUND (404) — dispozitivul nu există.
  • RATE_LIMIT_EXCEEDED (429) — limita de rată pentru comenzi a fost atinsă.

GET /api/v1/devices/{deviceId}/cash-balance

Trimite o comandă get_cash_amount și returnează soldul curent de casă al dispozitivului.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "cashBalance": 1234.5,
  "currency": "RON",
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul a răspuns dar nu a returnat date despre sold.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/set-datetime

Trimite o comandă set_datetime. Dacă datetime lipsește, se folosește ora curentă a serverului.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
datetimestringnuȘir ISO 8601. Implicit, ora serverului.

Răspuns (200 OK)

{
  "success": true,
  "datetime": "2026-04-09T08:10:00.000Z",
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/print-duplicate

Trimite o comandă print_duplicate pentru a retipări ultimul bon. Fără corp.

  • Scope auth: devices:write

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/non-fiscal

Tipărește un bon non-fiscal cu text liber (ocolește logica fiscală). Util pentru note interne, training, vouchere etc.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
linesstringdaCel puțin o linie. Fiecare linie ≤ 48 caractere.
headerstringnuAntet opțional, tipărit bold/centrat în partea de sus. ≤ 48 caractere.

Exemplu

curl -X POST https://api.e-bon.ro/api/v1/devices/dev_pos_01/non-fiscal \
  -H "x-api-key: ebon_live_acme_corp_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
  -H "Content-Type: application/json" \
  -d '{
    "header": "MULȚUMIM",
    "lines": ["Cod cupon: ABC-123", "Valabil până la 30.06.2026"]
  }'

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Încarcă o siglă de bon codată base64 (BMP/PNG/JPEG, în funcție de dispozitiv).

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
logostringdaDate imagine codate base64, ≥ 1 caracter.

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Șterge sigla de bon stocată curent pe dispozitiv. Fără corp.

  • Scope auth: devices:write

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Configurare TVA

GET /api/v1/devices/{deviceId}/vat-rates

Interoghează cotele TVA programate curent pe dispozitiv.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "rates": [
    { "name": "Standard", "percentage": 21 },
    { "name": "Redusă alimente", "percentage": 9 }
  ],
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul a răspuns dar nu a returnat datele despre cote.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

GET /api/v1/devices/{deviceId}/vat-capabilities

Interoghează capabilitățile dispozitivului pentru cotele TVA (număr maxim de cote, dacă numele sunt programabile etc.).

  • Scope auth: devices:read

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele despre capabilități.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/vat-rates

Reprogramează cotele TVA pe dispozitiv.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
ratesarraydaCel puțin o intrare. Fiecare { name: string (≥ 1 caracter), percentage: number (≥ 0) }.

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Antet / subsol / operator

Interoghează capabilitățile dispozitivului pentru antet/subsol (număr maxim de linii, lungime linie etc.).

  • Scope auth: devices:read

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele despre capabilități.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Returnează antetul și subsolul programate curent pe dispozitiv.

  • Scope auth: devices:read

Răspuns (200 OK)

{
  "header": ["ACME SRL", "Strada Exemplu 1, Bucuresti"],
  "footer": ["www.acme.ro", "Vă mulțumim!"],
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele despre antet/subsol.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/header-footer

Reprogramează antetul și subsolul tipărite pe fiecare bon.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
headerstringdaPână la 10 linii, fiecare ≤ 48 caractere.
footerstringdaPână la 10 linii, fiecare ≤ 48 caractere.

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

GET /api/v1/devices/{deviceId}/operator-capabilities

Interoghează capabilitățile dispozitivului pentru operatori (număr maxim de operatori, dacă numele/parolele sunt programabile etc.).

  • Scope auth: devices:read

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele despre capabilități.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/operator

Programează un slot de operator (casier) pe dispozitiv.

  • Scope auth: devices:write

Corpul cererii

CâmpTipObligatoriuNote
operatorIdintegerdaSlot operator, ≥ 1.
namestringda1–32 caractere.
passwordstringnu≤ 8 caractere.

Coduri de eroare

  • VALIDATION_ERROR (400) — corpul nu a trecut validarea schemei.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

Date live & acțiuni corective

GET /api/v1/devices/{deviceId}/info

Trimite o comandă get_info și returnează informațiile de identificare ale dispozitivului (model, firmware, serie fiscală etc., după cum sunt expuse de protocol).

  • Scope auth: devices:read

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele cerute.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

GET /api/v1/devices/{deviceId}/last-receipt

Trimite o comandă get_last_receipt_info și returnează rezumatul ultimului bon al dispozitivului.

  • Scope auth: devices:read

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • INTERNAL_ERROR (500) — dispozitivul nu a returnat datele cerute.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/void-open

Trimite o comandă void_open_receipt pentru a anula un bon deschis pe AMEF (de ex. după o vânzare întreruptă). Fără corp.

  • Scope auth: devices:write

Răspuns (200 OK)

{
  "success": true,
  "message": "Open receipt voided successfully",
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

POST /api/v1/devices/{deviceId}/reversal

Trimite o comandă print_reversal_receipt. Corpul este transmis ca payload al comenzii după validarea pe server față de schema payload-ului de stornare. Returnează receiptNumber-ul bonului de stornare tipărit, atunci când dispozitivul îl raportează.

  • Scope auth: devices:write

Răspuns (201 Created)

{
  "success": true,
  "message": "Reversal receipt printed successfully",
  "receiptNumber": "0000123",
  "deviceId": "dev_pos_01",
  "timestamp": "2026-04-09T08:10:00.000Z"
}

Coduri de eroare

  • VALIDATION_ERROR (400) — payload-ul nu a trecut validarea bonului de stornare.
  • NOT_FOUND (404) — dispozitivul nu există.
  • SERVICE_UNAVAILABLE (503) — dispozitiv offline sau fără controller atribuit.

GET /api/v1/devices/{deviceId}/receipts

Scurtătură pentru a lista bonurile filtrate după dispozitiv, cele mai noi primele. Este un wrapper de comoditate peste GET /receipts.

  • Scope auth: receipts

Parametri query

ParametruTipImplicitNote
typestringFiltrează după tipul bonului (sale / refund / storno).
limitinteger501100.

Exemplu

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

Coduri de eroare

  • VALIDATION_ERROR (400) — query invalid.
  • NOT_FOUND (404) — dispozitivul nu există.

Vezi și

  • Bonuri — stochează și caută bonurile produse de aceste dispozitive.
  • Rapoarte — rapoartele X / Z / JE / MF construite peste jurnalul de bonuri.
  • Autentificare — catalogul scope-urilor folosit de fiecare endpoint de mai sus.
  • Prezentare API — URL de bază, plic de eroare, limite de rată, idempotență, paginare.