e-bon
e-bon.ro
Arhitectură

Autentifică cererile API

Autentifică-te la API-ul e-bon cu o cheie API sau cu un jeton de Portal, gestionează permisiunile și rolurile și tratează erorile de autentificare.

Fiecare cerere către API-ul e-bon trebuie să poarte unul dintre două credențiale: o cheie API (pentru integrări server-to-server și parteneri POS) sau un jeton de acces din Portal (pentru utilizatorii autentificați în Portalul e-bon sau în aplicația de pe AMEF). Această pagină arată cum obții fiecare credențial, cum îl trimiți și ce faci când autentificarea eșuează.

Dacă ai nevoie doar să trimiți bonuri fiscale dintr-un POS sau dintr-un sistem de back-office, folosește o cheie API. Jetoanele de Portal sunt destinate utilizatorilor umani autentificați în Portal.

Alege metoda de autentificare

Tu ești…Folosește acest credențialTrimis ca
Un partener POS sau o integrare de back-officeCheie APIAntet x-api-key: <cheie> sau Authorization: Bearer <cheie>
Un utilizator autentificat în Portal sau în aplicația de pe AMEFJeton de acces Portal (JWT)Authorization: Bearer <jeton>

Cele două credențiale nu sunt interschimbabile. Cheile API sunt legate de o organizație și au permisiuni (scopes). Jetoanele de Portal sunt legate de un utilizator dintr-o organizație și au un rol.

Autentifică cu o cheie API

Cheile API sunt metoda recomandată pentru a apela API-ul e-bon de pe orice server, AMEF sau sistem de back-office. O cheie arată astfel:

ebon_live_{orgId}_{32-hex}

Cheia completă îți este afișată o singură dată, în fereastra în care o creezi. Salveaz-o imediat într-un seif de secrete — e-bon nu mai afișează niciodată secretul complet. Portalul îți va arăta în continuare doar prefixul (totul înainte de coada aleatoare), ca să poți identifica ulterior cheia.

Trimite prima cerere autentificată

Creează o cheie API în Portal

Autentifică-te în Portal, deschide Setări → Chei API, apasă Creează cheie API, pune o etichetă, alege permisiunile de care are nevoie și copiază cheia din fereastra de confirmare.

Copiază cheia înainte să închizi fereastra. După închidere, secretul nu mai poate fi recuperat. Dacă pierzi o cheie, revoc-o și creează una nouă.

Adaugă cheia în cerere

Trimite cheia în antetul x-api-key (preferat) sau în Authorization: Bearer …:

POST /api/v1/receipts HTTP/1.1
Host: api.e-bon.ro
Content-Type: application/json
x-api-key: ebon_live_abc123def456_0123456789abcdef0123456789abcdef

{ "deviceId": "dev_…", "items": [ … ] }

Sau, echivalent:

Authorization: Bearer ebon_live_abc123def456_0123456789abcdef0123456789abcdef

Tratează răspunsul

La succes primești resursa înapoi. La eșec de autentificare primești un plic JSON 401 sau 403 — vezi Tratează erorile de autentificare mai jos.

Revocă sau rotește o cheie

Cheile API nu expiră singure. Ca să oprești o cheie, deschide Portalul, găsește cheia după prefix și apasă Revocă. Următoarea cerere care o folosește primește imediat 401 UNAUTHORIZED — API key is inactive..

Nu există rotație în loc. Ca să rotești o cheie, creează una nouă, actualizează seiful de secrete, apoi revoc-o pe cea veche după ce noua versiune a fost lansată.

Autentifică-te în Portal

Utilizatorii Portalului se autentifică cu email și parolă și primesc o pereche de jetoane:

  • Un jeton de acces valabil 15 minute, trimis la fiecare apel API ca Authorization: Bearer <jeton>.
  • Un jeton de reîmprospătare valabil 7 zile, folosit doar pentru a obține un nou jeton de acces.

Parcurge fluxul de autentificare

Autentifică-te

POST /api/v1/auth/login
Content-Type: application/json

{ "email": "tu@exemplu.ro", "password": "…" }

Răspunsul conține accessToken, refreshToken și profilul utilizatorului.

Apelează endpoint-uri protejate

Trimite jetonul de acces la fiecare cerere:

GET /api/v1/devices
Authorization: Bearer <accessToken>

Reîmprospătează înainte de expirare

Când jetonul de acces expiră (sau mai devreme — oricând în fereastra de 7 zile a reîmprospătării), schimbă jetonul de reîmprospătare pe o pereche nouă:

POST /api/v1/auth/refresh
Content-Type: application/json

{ "refreshToken": "<refreshToken>" }

Jetonul de reîmprospătare anterior este invalidat imediat. Înlocuiește ambele jetoane stocate cu perechea nouă din răspuns.

Deconectează-te

POST /api/v1/auth/logout
Authorization: Bearer <accessToken>
Content-Type: application/json

{ "refreshToken": "<refreshToken>" }

Asta revocă doar jetonul de reîmprospătare furnizat. Sesiunile de pe alte dispozitive rămân active.

Fiecare jeton de reîmprospătare poate fi folosit o singură dată. Dacă același jeton este prezentat de două ori (de exemplu, după o reîncercare de rețea), a doua tentativă returnează 401 — Refresh token has been revoked. Utilizatorul trebuie să se autentifice din nou.

Pentru forma completă a cererilor și răspunsurilor, vezi Referința API-ului de autentificare.

Gestionează permisiunile cheii API

Fiecare cheie API poartă una sau mai multe permisiuni. Fiecare cerere are nevoie de o permisiune anume; dacă lipsește din cheie, API-ul returnează 403 FORBIDDEN — Insufficient scopes.

PermisiuneFolosește-o pentru
receiptsCreare și citire de bonuri fiscale.
receipts:readAcces doar pentru citire la bonuri (rapoarte, exporturi).
receipts:adminAcțiuni de bon de nivel admin (anulare / stornare).
reportsGenerare și citire de rapoarte X, Z, raport zilnic și raport lunar.
devicesAcces general la dispozitive (listare, citire, actualizare).
devices:readListare și citire de dispozitive doar pentru citire.
devices:writeCreare, actualizare sau ștergere de dispozitive; atribuire de operatori; configurare fiscală.
commandsEmitere de comenzi pe dispozitiv (POST /devices/:id/commands).
allAcces universal — satisface orice verificare de permisiune.
Acordă cel mai îngust set de permisiuni de care are nevoie cheia. Un POS care doar emite bonuri are nevoie doar de receipts; un dashboard de raportare are nevoie doar de receipts:read și reports.

Gestionează rolurile utilizatorilor

Utilizatorii Portalului au unul dintre trei roluri, setat când sunt adăugați în organizație:

RolCe poate face
ownerAcces complet la Portal. Creat automat pentru utilizatorul care înregistrează organizația. Poate șterge organizația.
adminAcelași acces la Portal ca Owner, cu excepția acțiunilor de ștergere a organizației.
operatorUtilizare zilnică a Portalului — vizualizare bonuri, rulare rapoarte, gestionare operatori pe dispozitive. Suprafață administrativă redusă.

Rolurile sunt evaluate la fiecare apel către API-ul Portalului. Dacă un utilizator încearcă o acțiune pe care rolul lui nu o permite, API-ul returnează 403 FORBIDDEN — Insufficient role.

Înțelege limitele de plan

Unele acțiuni sunt limitate de planul tău de abonament:

PlanDispozitive maximeChei API permise
Free2Nu
Pro10Da
EnterpriseNelimitatDa

Când atingi o limită de plan, API-ul returnează 403 TIER_LIMIT_EXCEEDED cu un mesaj care îți spune ce limită ai atins și cum o ridici (de obicei: upgrade de plan).

Tratează limitele de rată

API-ul aplică trei plicuri de limitare a ratei. Toate trei returnează același răspuns la epuizare:

{
  "code": "RATE_LIMIT_EXCEEDED",
  "message": "Too many requests, please try again later.",
  "status": 429
}

Fiecare răspuns 429 include un antet Retry-After în secunde — așteaptă cel puțin atât înainte de a reîncerca.

PlicFereastrăLimităSe aplică laIndexat după
Global10 min150 cereriFiecare cerere către APIPrefix de cheie API dacă există, altfel IP-ul
Autentificare10 min30 cereriPOST /auth/register, /auth/login, /auth/refresh, /auth/forgot-passwordIP-ul clientului
Comenzi pe dispozitiv10 min50 cereriPOST /devices/:deviceId/commands și endpoint-urile wrapperPrefix de cheie API dacă există, altfel IP-ul
Dacă rulezi o integrare de volum mare, indexează-ți traficul după cheie API (nu după IP brut) și retrage-te când vezi răspunsuri 429, respectând antetul Retry-After.

Tratează erorile de autentificare {#trateaza-erorile-de-autentificare}

Fiecare eșec de autentificare și autorizare returnează un plic JSON structurat cu un câmp code stabil. Folosește code (nu mesajul în limbaj natural) când construiești tratarea de erori.

HTTPcodeMesajCe înseamnă
401UNAUTHORIZEDMissing or invalid Authorization header. Expected: Bearer <token>Ai uitat antetul Authorization sau l-ai trimis în format greșit.
401UNAUTHORIZEDMissing access tokenAntetul există, dar jetonul de după Bearer este gol.
401UNAUTHORIZEDInvalid or expired access tokenJetonul de acces din Portal este invalid, expirat sau semnat de altcineva. Reîmprospătează-l.
401UNAUTHORIZEDRefresh token has been revokedJetonul de reîmprospătare a fost deja folosit sau a fost revocat. Autentifică-te din nou.
401UNAUTHORIZEDInvalid or expired refresh tokenJetonul de reîmprospătare este malformat sau a depășit fereastra de 7 zile. Autentifică-te din nou.
401UNAUTHORIZEDMissing API key. Provide via x-api-key header or Authorization: Bearer <key>.Niciun credențial pe un endpoint protejat.
401UNAUTHORIZEDInvalid API key format.Cheia nu se potrivește cu ebon_live_{orgId}_{32-hex}. Probabil este trunchiată sau copiată greșit.
401UNAUTHORIZEDInvalid API key.Cheia are forma corectă, dar nu este înregistrată pentru această organizație.
401UNAUTHORIZEDAPI key is inactive.Cheia a fost revocată din Portal. Creează una nouă.
401UNAUTHORIZEDMissing authentication. Provide an API key via x-api-key header or a JWT via Authorization: Bearer <token>.Endpoint-ul acceptă oricare credențial și nu ai trimis niciunul.
403FORBIDDENInsufficient role. Required: <rol> or <rol>Utilizatorul autentificat nu are un rol permis pentru acest endpoint.
403FORBIDDENInsufficient scopes. Missing: <scope>, <scope>Cheia API este valabilă, dar îi lipsesc permisiunile cerute de acest endpoint.
403TIER_LIMIT_EXCEEDEDDevice limit reached. Your <plan> plan allows a maximum of <N> devices (current: <K>). Upgrade your plan to add more devices.Ai atins plafonul de dispozitive al planului.
403TIER_LIMIT_EXCEEDEDAPI keys are not available on the Free plan. Upgrade to Pro to create API keys.Planul Free nu poate crea chei API.
429RATE_LIMIT_EXCEEDEDToo many requests, please try again later.Ai atins un plic de limită. Așteaptă cel puțin Retry-After secunde.
Răspunsurile 401nu disting o semnătură proastă de un jeton expirat sau de unul malformat — toate returnează Invalid or expired access token. Tratează orice 401 UNAUTHORIZED pe un endpoint protejat ca „credențialul este mort, obține unul nou", nu ca un diagnostic care poate fi parsat.

Unde mergi mai departe