{
  "versiune": "1",
  "actualizatLa": "2026-09-25",
  "produs": "FiscalBridge",
  "autentificare": {
    "antet": "X-Api-Key",
    "descriere": "Portul api (5078, doar pe acest calculator, implicit): cheia din agent.settings.json, secțiunea Api:ApiKey (utilizatorii Windows o pot citi). Portul statii (5077, casa partajată, oprit implicit): antetul X-Poseo-Fiscal-Key cu cheia din Broker:ApiKey și antetul X-Poseo-Fiscal-Protocol cu versiunea protocolului (1).",
    "anteteStatii": {
      "cheie": "X-Poseo-Fiscal-Key",
      "protocol": "X-Poseo-Fiscal-Protocol"
    }
  },
  "porturi": {
    "api": 5078,
    "statii": 5077
  },
  "licentaClase": {
    "libera": "Mereu disponibilă, și cu licența expirată sau lipsă: rapoarte Z/X, anulare bon deschis, numerar, jurnal, export ANAF, stare.",
    "vanzare-noua": "Bon fiscal nou: cere o licență valabilă care acoperă casa activă.",
    "plata-card": "Plată nouă pe terminalul bancar: cere dreptul de POS bancar.",
    "configurare": "Salvarea configurației și testele de conexiune: mereu disponibile."
  },
  "refuzLicenta": {
    "api": {
      "http": 403,
      "tipContinut": "application/problem+json",
      "antet": "X-FiscalBridge-License",
      "exemplu": {
        "type": "https://poseo.ro/fiscalbridge/licenta",
        "title": "Licență",
        "status": 403,
        "detail": "Nu există o licență activă pe acest calculator.",
        "code": "LICENSE_MISSING"
      }
    },
    "statii": {
      "http": 400,
      "exemplu": {
        "code": "LICENSE_MISSING",
        "message": "Nu există o licență activă pe acest calculator.",
        "kind": "invalid-operation"
      },
      "explicatie": "Stația tratează răspunsul ca NEEMIS: bonul nu s-a tipărit, cardul nu s-a debitat."
    },
    "fisiere": {
      "FiscalNet": "BONOK=0 / ERRCODE=LICENSE_* / ERRINFO=<mesaj>",
      "Fisco": "BonERR cu ErrorCode=LICENSE_*",
      "FPrint": "forma de eroare a profilului; codul în activitate",
      "CLI": "{\"ok\":false,\"code\":\"LICENSE_*\",\"messageRo\":\"…\"} și codul de ieșire 5"
    }
  },
  "copieBon": {
    "cod": "COPY_NOT_ALLOWED",
    "licenta": [
      "libera"
    ],
    "descriere": "Tipărește duplicatul bonului prin funcția de duplicat a casei (marcat DUPLICAT, nefiscal); FiscalBridge nu produce copii; o casă fără funcție de duplicat ⇒ COPY_NOT_ALLOWED, fără nicio comandă trimisă.",
    "statii": {
      "http": 400,
      "kind": "not-supported"
    },
    "fisiere": "BONOK=0 / ERRCODE=COPY_NOT_ALLOWED"
  },
  "rute": [
    {
      "metoda": "GET",
      "cale": "/",
      "port": "api",
      "cheie": false,
      "licenta": [],
      "descriere": "Sonda de viață: agentul răspunde, starea licenței (licensed, license = cod C3) și starea brokerului. Fără I/O pe casă."
    },
    {
      "metoda": "GET",
      "cale": "/about",
      "port": "api",
      "cheie": false,
      "licenta": [],
      "descriere": "Numele, versiunea, mediul (Production/Test), serverul și cheia de licență ale build-ului, timpul de funcționare."
    },
    {
      "metoda": "GET",
      "cale": "/banks",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Catalogul băncilor și al terminalelor POS cunoscute (static)."
    },
    {
      "metoda": "POST",
      "cale": "/close",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Oprește agentul. Doar de pe acest calculator.",
      "doarLocal": true
    },
    {
      "metoda": "POST",
      "cale": "/cloud/flush",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Trimite acum sumarele de bon din coada locală către cloud (dacă abonamentul include cloud)."
    },
    {
      "metoda": "GET",
      "cale": "/cloud/status",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Starea trimiterii sumarelor de bon către cloud (coada locală, ultima trimitere)."
    },
    {
      "metoda": "GET",
      "cale": "/config/device",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Configurația casei de marcat salvată pe acest calculator (secretele mascate)."
    },
    {
      "metoda": "PUT",
      "cale": "/config/device",
      "port": "api",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Salvează configurația casei de marcat (prin coada unică)."
    },
    {
      "metoda": "POST",
      "cale": "/config/device/detect",
      "port": "api",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Caută automat casa de marcat pe porturile calculatorului."
    },
    {
      "metoda": "POST",
      "cale": "/config/device/test",
      "port": "api",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Testează legătura cu casa de marcat din configurația trimisă, fără s-o salveze."
    },
    {
      "metoda": "GET",
      "cale": "/config/devices",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Catalogul aparatelor (mărci, modele, profiluri POS) pe care FiscalBridge le poate configura."
    },
    {
      "metoda": "POST",
      "cale": "/config/devices",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Adaugă un aparat în lista configurată."
    },
    {
      "metoda": "GET",
      "cale": "/config/devices/configured",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Aparatele configurate pe acest calculator."
    },
    {
      "metoda": "POST",
      "cale": "/config/devices/licence",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Retrasă: încărcarea licenței din fișier. Răspunde 410 cu indicația „POST /license/activate”."
    },
    {
      "metoda": "DELETE",
      "cale": "/config/devices/{id}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Scoate un aparat din lista configurată."
    },
    {
      "metoda": "GET",
      "cale": "/config/devices/{id}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Un aparat configurat, după identificator."
    },
    {
      "metoda": "PUT",
      "cale": "/config/devices/{id}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Modifică un aparat din lista configurată."
    },
    {
      "metoda": "POST",
      "cale": "/config/devices/{id}/activate",
      "port": "api",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Face aparatul din listă casa activă (salvare prin coada unică)."
    },
    {
      "metoda": "POST",
      "cale": "/config/reset",
      "port": "api",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Șterge configurarea casei (păstrează jurnalul bonurilor, plățile, licența). Doar de pe acest calculator.",
      "doarLocal": true
    },
    {
      "metoda": "GET",
      "cale": "/config/webservice",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Setările serviciului web local (port, TLS); cheia nu se afișează."
    },
    {
      "metoda": "POST",
      "cale": "/config/webservice",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Salvează setările ne-sensibile ale serviciului web local (efect după repornire)."
    },
    {
      "metoda": "GET",
      "cale": "/events",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Flux de evenimente (Server-Sent Events): starea casei, a terminalului și a lucrărilor."
    },
    {
      "metoda": "GET",
      "cale": "/files/activity",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Activitatea canalului de fișiere (FiscalNet, Fisco, FPrint), cu CNP-urile mascate."
    },
    {
      "metoda": "GET",
      "cale": "/files/activity/{jobId:guid}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Detaliul unui fișier procesat: ce s-a trimis casei și răspunsul scris."
    },
    {
      "metoda": "GET",
      "cale": "/files/attention",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Fișierele care cer o decizie (în așteptare, puse deoparte)."
    },
    {
      "metoda": "GET",
      "cale": "/files/config",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Folderele de fișiere configurate."
    },
    {
      "metoda": "PUT",
      "cale": "/files/config",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Salvează folderele de fișiere."
    },
    {
      "metoda": "POST",
      "cale": "/files/config/validate",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Verifică o configurare de foldere fără s-o salveze."
    },
    {
      "metoda": "POST",
      "cale": "/files/dry-run",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Arată cum ar fi înțeles un fișier (comenzile, răspunsul), fără casă și fără nicio scriere."
    },
    {
      "metoda": "POST",
      "cale": "/files/pending/{claimId:guid}/recheck",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Reverifică pe casă un fișier cu rezultat incert."
    },
    {
      "metoda": "POST",
      "cale": "/files/pending/{claimId:guid}/resolve",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Închide manual un fișier cu rezultat incert (emis / neemis), cu cine a decis."
    },
    {
      "metoda": "POST",
      "cale": "/files/quarantine/{id}/discard",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Mută în istoric un fișier pus deoparte, fără să-l tipărească."
    },
    {
      "metoda": "POST",
      "cale": "/files/quarantine/{id}/release",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Eliberează un fișier pus deoparte (se procesează din nou)."
    },
    {
      "metoda": "GET",
      "cale": "/files/status",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Starea fiecărui folder de fișiere."
    },
    {
      "metoda": "POST",
      "cale": "/kitchen/print",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Tipărește un bon de bucătărie (imprimantă ESC/POS nefiscală), prin coada durabilă a imprimantelor."
    },
    {
      "metoda": "POST",
      "cale": "/label/print",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Tipărește o etichetă (imprimantă ZPL nefiscală)."
    },
    {
      "metoda": "GET",
      "cale": "/license",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Starea licenței FiscalBridge pe acest calculator (cod C3, termene, drepturi)."
    },
    {
      "metoda": "POST",
      "cale": "/license/activate",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Activează licența cu codul de activare din portalul poseo.ro (cere acceptarea termenilor)."
    },
    {
      "metoda": "POST",
      "cale": "/license/demo",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Pornește perioada de probă (CUI-ul firmei + acceptarea termenilor)."
    },
    {
      "metoda": "POST",
      "cale": "/license/refresh",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Reînnoiește acum licența de pe serverul de licențe."
    },
    {
      "metoda": "GET",
      "cale": "/logs",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Ultimele 100 de linii din jurnalul agentului (agent-*.log din folderul de jurnale)."
    },
    {
      "metoda": "GET",
      "cale": "/logs/access",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Ultimele 200 de linii din jurnalul de acces HTTP."
    },
    {
      "metoda": "POST",
      "cale": "/payments",
      "port": "api",
      "cheie": true,
      "licenta": [
        "vanzare-noua",
        "plata-card"
      ],
      "descriere": "Plată cu cardul + bon fiscal în aceeași cerere, idempotentă după id (cardul NU se debitează dacă bonul nu poate fi emis).",
      "idempotenta": "Câmpul requestId: plata se face o singură dată; retrimiterea întoarce rezultatul memorat.",
      "exempluCerere": {
        "id": "plata-2048",
        "currency": "RON",
        "lines": [
          {
            "name": "CAFEA",
            "quantity": 1,
            "unitPrice": 10.0,
            "vatRate": 21,
            "unit": "BUC"
          },
          {
            "name": "APA PLATA",
            "quantity": 2,
            "unitPrice": 0.0,
            "listUnitPrice": 5.0,
            "vatRate": 21,
            "unit": "BUC"
          }
        ]
      },
      "campuriLinie": {
        "unitPrice": "Prețul EFECTIV pe unitate (cu TVA). Suma debitată pe card = Σ (quantity × unitPrice, rotunjit la ban pe fiecare linie) − reducerea de bon − Σ tenders.",
        "listUnitPrice": "Opțional. Prețul de LISTĂ al unui produs gratuit sau redus: dacă e mai mare decât unitPrice, linia se tipărește la prețul de listă cu o reducere valorică până la quantity × unitPrice (ex.: 2 × 5,00 − 10,00 = 0,00). Suma de pe card nu se schimbă. Fără câmp (sau cu o valoare ≤ unitPrice), linia se tipărește ca înainte.",
        "excludeFromOrderDiscount": "Opțional (implicit false). Linia nu primește parte din reducerea de bon: bacșiș, garanție SGR, articole excluse. O linie numită „Bacșiș” e exclusă și fără câmp.",
        "Reducere bon": "O linie cu numele „Reducere bon” și unitPrice NEGATIV nu e o vânzare: e reducerea de bon (quantity × −unitPrice), repartizată pe liniile fără excludeFromOrderDiscount și scăzută din suma de pe card. Orice altă linie cu preț negativ e refuzată (400)."
      },
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEVICE_NOT_COVERED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "GET",
      "cale": "/payments/{id}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Rezultatul memorat al unei plăți, după id. Nu atinge casa, nici terminalul."
    },
    {
      "metoda": "GET",
      "cale": "/pos/cashback/status",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Starea funcției cashback pe terminal."
    },
    {
      "metoda": "POST",
      "cale": "/pos/completion",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Finalizarea unei preautorizări."
    },
    {
      "metoda": "GET",
      "cale": "/pos/device/info",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Informațiile terminalului bancar."
    },
    {
      "metoda": "POST",
      "cale": "/pos/preauthorization",
      "port": "api",
      "cheie": true,
      "licenta": [
        "plata-card"
      ],
      "descriere": "Preautorizare nouă pe terminalul bancar.",
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "GET",
      "cale": "/pos/report/details",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul detaliat al terminalului bancar."
    },
    {
      "metoda": "GET",
      "cale": "/pos/report/summary",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul sumar al terminalului bancar."
    },
    {
      "metoda": "POST",
      "cale": "/pos/sale",
      "port": "api",
      "cheie": true,
      "licenta": [
        "plata-card"
      ],
      "descriere": "Plată nouă pe terminalul bancar (fără bon).",
      "idempotenta": "Câmpul transactionEcrUuid (opțional): aceeași cerere cu același id întoarce rezultatul salvat fără o a doua debitare; același id cu altă sumă ⇒ 409 POS_SALE_ID_REUSED; un duplicat trimis cât prima tranzacție e în curs nu pornește o a doua debitare. După un refuz cert al terminalului, același id se poate reîncerca. Fără id, fiecare cerere e o vânzare nouă.",
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "POST",
      "cale": "/pos/settlement",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Închiderea de zi a terminalului bancar."
    },
    {
      "metoda": "POST",
      "cale": "/pos/void",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Anularea unei tranzacții pe card."
    },
    {
      "metoda": "POST",
      "cale": "/receipt",
      "port": "api",
      "cheie": true,
      "licenta": [
        "vanzare-noua"
      ],
      "descriere": "Emite un bon fiscal (câmpurile cererii documentate mai jos). Idempotent după id: aceeași cerere nu tipărește al doilea bon. Un produs gratuit se trimite la prețul lui de listă, cu discountAmount = price × quantity (reducere valorică pe linie); o reducere procentuală cât toată valoarea liniei (discountPercent) e refuzată de unele case (Tremol). Logarea pe casă: operator (cod), operatorPassword, till; cu operator trimis gol se folosește operatorul din configurarea casei, iar textul tipărit vine din operatorText.",
      "idempotenta": "Câmpul id: o cerere repetată cu același id și același conținut întoarce rezultatul memorat, fără al doilea bon; același id cu alt conținut e refuzat.",
      "exempluCerere": {
        "id": "vanzare-1024",
        "operator": "1",
        "operatorPassword": "0001",
        "till": "1",
        "lines": [
          {
            "name": "CAFEA",
            "quantity": 1,
            "price": 10.0,
            "vatGroup": 1,
            "unit": "buc",
            "department": 1
          }
        ],
        "payments": [
          {
            "type": 1,
            "amount": 10.0
          }
        ]
      },
      "exempluRaspuns": {
        "bonOk": 1,
        "nrBon": "779",
        "fiscalNet": "BONOK=1\r\nNRBON=779\r\nERRINFO=\r\n",
        "fisco": "OK;Z=|NR=779|BF=779",
        "id": "vanzare-1024",
        "code": null,
        "outcome": "Issued",
        "message": null,
        "licenseWarning": null,
        "warnings": []
      },
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEVICE_NOT_COVERED",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 403,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "GET",
      "cale": "/receipt/{id}",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Rezultatul memorat al unui bon, după id (din jurnalul durabil). Nu atinge casa."
    },
    {
      "metoda": "GET",
      "cale": "/reports/{type}",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Rapoartele fiscale: x, z, periodice, jurnal electronic, export ANAF (type = x | z | periodic | journal | anaf …). Mereu disponibile, și fără licență."
    },
    {
      "metoda": "GET",
      "cale": "/status",
      "port": "api",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Starea casei de marcat (citită prin coada unică)."
    },
    {
      "metoda": "POST",
      "cale": "/update/apply-now",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Instalează acum versiunea descărcată: 202 acceptat, 409 casa lucrează, 404 nimic descărcat."
    },
    {
      "metoda": "POST",
      "cale": "/update/check",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Pornește o verificare de versiune nouă; răspunde imediat 202 cu starea curentă."
    },
    {
      "metoda": "GET",
      "cale": "/update/status",
      "port": "api",
      "cheie": true,
      "licenta": [],
      "descriere": "Starea actualizărilor automate (versiune, fereastră, mesaj în română)."
    },
    {
      "metoda": "POST",
      "cale": "/cash/in",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Intrare de numerar."
    },
    {
      "metoda": "POST",
      "cale": "/cash/out",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Extragere de numerar."
    },
    {
      "metoda": "GET",
      "cale": "/device/capabilities",
      "port": "statii",
      "cheie": true,
      "licenta": [],
      "descriere": "Ce știe casa de marcat (duplicat nativ, cote programabile), din configurația salvată, fără I/O."
    },
    {
      "metoda": "POST",
      "cale": "/device/config",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Salvează configurația casei (de pe stația de administrare)."
    },
    {
      "metoda": "GET",
      "cale": "/device/descriptor",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Datele casei (marcă, model, serie)."
    },
    {
      "metoda": "GET",
      "cale": "/device/status",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Starea casei."
    },
    {
      "metoda": "GET",
      "cale": "/device/vat",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Cotele TVA programate în casă."
    },
    {
      "metoda": "POST",
      "cale": "/device/vat",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "configurare"
      ],
      "descriere": "Programează cotele TVA în casă."
    },
    {
      "metoda": "GET",
      "cale": "/device/vat/can-program",
      "port": "statii",
      "cheie": true,
      "licenta": [],
      "descriere": "Dacă se pot programa cotele TVA acum (fără I/O)."
    },
    {
      "metoda": "POST",
      "cale": "/drawer/open",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Deschide sertarul de bani."
    },
    {
      "metoda": "GET",
      "cale": "/health",
      "port": "statii",
      "cheie": true,
      "licenta": [],
      "descriere": "Sonda brokerului: versiunea protocolului și numele real al serviciului."
    },
    {
      "metoda": "GET",
      "cale": "/operations/{key}",
      "port": "statii",
      "cheie": true,
      "licenta": [],
      "descriere": "Starea unei operațiuni idempotente (în curs, încheiată, incertă). Nu atinge casa."
    },
    {
      "metoda": "POST",
      "cale": "/receipt",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "vanzare-noua"
      ],
      "descriere": "Emite bonul unei stații (protocolul v1), idempotent după id.",
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEVICE_NOT_COVERED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "POST",
      "cale": "/receipt/cancel",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Anulează bonul rămas deschis."
    },
    {
      "metoda": "GET",
      "cale": "/receipt/caps",
      "port": "statii",
      "cheie": true,
      "licenta": [],
      "descriere": "Ce acceptă constructorul de bon al acestei versiuni (fără I/O)."
    },
    {
      "metoda": "GET",
      "cale": "/receipt/evidence",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Dovada ultimului bon citită din casă (recuperarea după o întrerupere)."
    },
    {
      "metoda": "POST",
      "cale": "/receipt/unlock",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Deblochează casa rămasă cu un bon neînchis."
    },
    {
      "metoda": "POST",
      "cale": "/receipt/validate",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "vanzare-noua"
      ],
      "descriere": "Validează bonul pe gazdă, fără I/O pe casă, înainte ca stația să debiteze cardul.",
      "erori": [
        {
          "cod": "LICENSE_MISSING",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_EXPIRED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEMO_EXPIRED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_WRONG_ENVIRONMENT",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_DEVICE_NOT_COVERED",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        },
        {
          "cod": "LICENSE_CLOCK_INVALID",
          "http": 400,
          "explicatie": "Refuz de licență: operațiunea nu s-a făcut, niciun octet nu a ajuns la casă sau la terminal."
        }
      ]
    },
    {
      "metoda": "POST",
      "cale": "/reports/anaf",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Exportul ANAF pe interval de date."
    },
    {
      "metoda": "POST",
      "cale": "/reports/anaf-z",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Exportul ANAF pe interval de numere Z."
    },
    {
      "metoda": "POST",
      "cale": "/reports/journal",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Citirea jurnalului electronic."
    },
    {
      "metoda": "POST",
      "cale": "/reports/periodic-date",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul periodic pe interval de date."
    },
    {
      "metoda": "POST",
      "cale": "/reports/periodic-z",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul periodic pe interval de numere Z."
    },
    {
      "metoda": "POST",
      "cale": "/reports/receipt-copy",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Duplicatul bonului prin funcția de duplicat a casei (marcat DUPLICAT, nefiscal). FiscalBridge nu produce copii; o casă fără funcție de duplicat ⇒ 400 COPY_NOT_ALLOWED, fără nicio comandă trimisă."
    },
    {
      "metoda": "POST",
      "cale": "/reports/x",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul X."
    },
    {
      "metoda": "POST",
      "cale": "/reports/z",
      "port": "statii",
      "cheie": true,
      "licenta": [
        "libera"
      ],
      "descriere": "Raportul Z."
    }
  ],
  "coduriLicenta": [
    "LICENSE_OK",
    "LICENSE_WARNING_OFFLINE",
    "LICENSE_EXPIRED",
    "LICENSE_DEMO_EXPIRED",
    "LICENSE_WRONG_ENVIRONMENT",
    "LICENSE_MISSING",
    "LICENSE_DEVICE_NOT_COVERED",
    "LICENSE_CLOCK_INVALID"
  ]
}
