API local

    Programul tău vorbește cu casa de marcat, prin aplicația FiscalLink.

    Aplicația FiscalLink servește un API REST pe calculatorul sau telefonul de lângă casă. Trimiți JSON, aplicația comandă casa și îți întoarce rezultatul. Aceleași rute pentru Datecs, Tremol și Daisy; diferențele dintre mărci le tratează aplicația.

    Adresa API-ului

    Aplicația ascultă pe două porturi fixe. Toate rutele încep cu /api.

    ModAdresăNote
    Securizat (HTTPS)https://localhost.fiscallink.ro:65401/apiAdresa recomandată. Numele se rezolvă la 127.0.0.1, adică același calculator.
    Local (HTTP)http://{ip-local}:65400/apiÎn rețeaua locală, fără TLS.

    Porturile nu se configurează. Ca să afli adresa exactă când rulezi, întreabă aplicația: cele două rute de mai jos merg mereu, chiar și fără licență.

    GET /get-secure-api-address

    Adresa API-ului securizat

    Întoarce adresa HTTPS completă a API-ului, cu /api.

    json
    {
      "StatusCode": 200,
      "Data": "https://localhost.fiscallink.ro:65401/api"
    }

    GET /get-local-api-address

    Adresa API-ului din rețeaua locală

    Întoarce adresa HTTP completă a API-ului în rețeaua locală, cu /api.

    json
    {
      "StatusCode": 200,
      "Data": "http://192.168.1.100:65400/api"
    }

    Acces și securitate

    • Fără cheie, fără token. Nu trimiți nicio credențială pe cerere. O cerere e refuzată doar dacă:
      • casa conectată nu are licență: 401 (rutele Shopify cer licența Commerce: 403);
      • nu e nicio casă conectată sau casa nu răspunde: 424.
    • Licența. Orice licență (Essential sau Commerce) deschide API-ul local. Fără internet, aplicația folosește licența salvată pe dispozitiv cât timp e valabilă; fără ea, casa e tratată ca nelicențiată.
    • CORS. Doar serverul HTTPS trimite antete CORS și permite orice origine (*). Serverul HTTP nu trimite niciunul, deci o pagină web din browser poate apela doar adresa HTTPS. Niciunul nu verifică antetele Origin sau Host.
    • O comandă pe rând. O casă execută o singură comandă odată, indiferent dacă vine din API-ul local, din Cloud sau din Shopify POS. Trimite apelurile unui bon în ordine și așteaptă fiecare răspuns.
    • Tot ce tipărești se vede în Cloud. Bonurile, rapoartele X și Z, citirile de cote TVA și lucrul cu articole făcute prin API-ul local sunt raportate organizației FiscalLink Cloud a casei, cât timp casa e asociată.

    Formatul răspunsului

    Toate rutele, în afară de /api/Receipt, răspund în același plic. La succes primești StatusCode și Data. La eroare primești statusCode și message, niciodată o pagină HTML. Unde un singur cod de stare acoperă două refuzuri, corpul are și un câmp code, un identificator stabil. Textul din message e în limba aplicației: ramifică după cod, nu după text.

    Data e textul de răspuns al casei la majoritatea rutelor; la rapoarte, cote TVA, articole, starea tranzacției, copia ultimului bon și raportul Z arhivat e un obiect.

    json
    {
      "StatusCode": 200,
      "Data": "Receipt printed successfully."
    }
    json
    {
      "statusCode": 424,
      "message": "Serial communication service not started. Please connect to a device."
    }

    Fluxul recomandat

    1. Afli adresa: GET /get-secure-api-address.
    2. Trimiți bonul întreg dintr-un singur apel: POST /print-fiscal-receipt.
    3. Citești răspunsul. 200: bonul e tipărit. 400: cererea sau casa a refuzat bonul și niciun bon nu a rămas deschis. 424 sau 500: citește „Înainte să retrimiți” din „Erori și coduri” înainte să trimiți din nou.
    4. La sfârșitul zilei: POST /report-z.

    Aplicația verifică bonul înainte să-l deschidă pe casă. Dacă ceva eșuează după deschidere, aplicația anulează bonul, iar mesajul se termină cu | Receipt cancelled successfully.

    Bonuri

    Rapoarte

    POST /report-z

    Tipărește raportul Z

    Închide ziua fiscală și îi aduce totalurile la zero. E ireversibil. Fără corp.

    POST /report-x

    Tipărește raportul X

    Tipărește totalurile zilei de până acum, fără să închidă ziua. Fără corp.

    Răspuns (Z; la X, Zeroing e false)

    json
    {
      "StatusCode": 200,
      "Data": {
        "Zeroing": true,
        "ReportNumber": "0142",
        "TaxGroups": { "A": "1250.00", "B": "310.50", "C": "0.00", "D": "0.00", "E": "0.00", "F": "0.00" },
        "Payments": { "payment_method1": "980.50", "payment_method2": "580.00", "payment_method3": "0.00" },
        "Message": "Report Z printed successfully."
      }
    }
    CâmpDescriere
    Zeroingtrue la Z (ziua se închide), false la X.
    ReportNumberNumărul raportului. Pe Tremol e calculat din ultimul Z și poate fi null.
    TaxGroupsVânzările pe grupe TVA, text cu 2 zecimale: A–F pe Datecs și Tremol, A–D pe Daisy.
    PaymentsTotalurile pe metode de plată, payment_method1 … payment_method10 (1 e numerarul), text cu 2 zecimale.
    MessageMesajul de succes, în limba aplicației.

    GET /ask-for-z-report-structured-information/{number} Doar Tremol

    Raport Z arhivat, după număr

    Întoarce datele unui raport Z arhivat, ca obiect, după numărul lui. Doar pe Tremol; Datecs și Daisy refuză cererea.

    Parametru în caleDescriere
    numberNumărul raportului Z cerut.

    Cote TVA

    POST /read-vat-rates

    Citește cotele TVA

    Citește grupele TVA programate în casă. Nu schimbă nimic pe casă. Fără corp.

    Programarea cotelor TVA nu există în API-ul local.

    json
    {
      "StatusCode": 200,
      "Data": {
        "Groups": { "A": "21.00", "B": "11.00", "C": "0.00" },
        "DisabledGroups": ["D", "E", "F", "G", "H"],
        "ZReportNumber": "0042",
        "EndDate": "01-08-25",
        "Brand": "Datecs",
        "ReadAtUtc": "2026-09-25T10:15:30.1234567Z",
        "Message": "VAT rates read successfully."
      }
    }
    CâmpDescriere
    GroupsCota activă pe fiecare literă de grupă, text cu 2 zecimale. A–H; A–F pe Tremol; A–D pe Daisy.
    DisabledGroupsGrupele oprite pe casă.
    ZReportNumberDoar Datecs: primul raport Z de la care se aplică cotele.
    EndDateDoar Datecs: când au fost introduse cotele.
    BrandDatecs, Daisy sau Tremol.
    ReadAtUtcCând a citit aplicația cotele.

    Articole (PLU)

    Articolele (PLU) sunt produsele salvate în memoria casei. Regulile diferă între mărci:

    DatecsDaisyTremol
    Grupe TVA pe articolA–G (H e refuzat)TVA-ul vine din departamentA–F
    Departament—obligatoriu, de la 11–19
    Nume72 de caractere32 de caractere34 de caractere
    Coduri de bare411
    Ștergereda, într-un intervaldanu

    POST /read-plu-items

    Citește articolele

    Citește baza de articole a casei. E lentă: aplicația face câte un drum la casă pentru fiecare articol programat. Fără corp, citește toată baza. Pe Tremol, aplicația caută în pozițiile 1–500; prima poziție goală e următorul număr liber, iar rezultatul e marcat ca trunchiat.

    POST /program-plu-item

    Programează un articol

    Creează sau actualizează un articol cu aceeași comandă. Un număr existent e suprascris complet, deci trimiți tot articolul. Fără număr de PLU, aplicația folosește următorul număr liber al casei. Răspunsul e articolul citit înapoi de pe casă.

    POST /delete-plu-item

    Șterge articole

    Șterge articole și citește înapoi intervalul. Un articol cu vânzări rămâne pe casă, pentru că nicio casă nu șterge vânzările. Răspunsul spune ce s-a șters și ce a rămas blocat. Pe Tremol, ștergerea unui singur articol e refuzată: protocolul lui șterge doar toată baza.

    Notă

    Câmpurile cererii și ale răspunsului pentru articole nu sunt încă publicate aici.

    Afișaj client

    POST /display-line-one

    Afișează pe linia 1

    Scrie un text pe prima linie a afișajului pentru client. Pe Tremol, textul are exact 20 de caractere: se completează sau se taie.

    CâmpDescriere
    TextTextul afișat.
    json
    {
      "Text": "Total 27.00"
    }

    POST /display-line-two

    Afișează pe linia 2

    Scrie un text pe a doua linie a afișajului pentru client, cu aceleași reguli.

    POST /clear-display

    Golește afișajul

    Șterge ce e pe afișajul pentru client. Fără corp.

    Coduri de bare și linii

    În fluxul recomandat, codurile de bare și liniile de separare sunt linii ale bonului dintr-un singur apel: Type 3 și 4 la bonul fiscal, Type 1 și 2 la cel nefiscal. Rutele de mai jos le tipăresc pe un bon deja deschis.

    Modelul BarCode

    CâmpTipObligatoriuDescriere
    TypeintDaSimbologia, 1–16, din tabelul de mai jos. Un tip pe care marca nu îl tipărește e refuzat cu 400.
    DatastringDaConținutul codului. Fiecare tip are regulile lui, de exemplu EAN-13 exact 13 cifre, QR 3–279 de caractere. Date greșite: 400.
    QrSizeintNuMărimea modulului pentru QR, 3–10. Doar Datecs.
    PositionintNu1 centru, 2 stânga, 3 dreapta. Doar Daisy.
    ScaleintNuLățimea barelor, de la 0. Doar Daisy.
    HeightintNuÎnălțimea barelor, de la 0. Doar Daisy.
    PrintTextboolNuTipărește conținutul sub cod. Doar Daisy.

    Tipuri de coduri de bare

    TypeSimbologieDatecsDaisy
    1EAN-8DaDa
    2EAN-13DaDa
    3Code 128DaDa
    4QR CodeDaNu
    5Standard 2 of 5NuDa
    6Interleaved 2 of 5DaDa
    7Interleaved 2 of 5 mod 10NuDa
    10UPC-ENuDa
    11UPC-ANuDa
    12Code 39NuDa
    13Code 39 mod 43NuDa
    14Code 93NuDa
    15CodabarNuDa
    16POSTNETNuDa

    Notă

    Pe Daisy, comanda de cod de bare (54h) nu e descrisă în protocolul românesc; tipurile din coloana Daisy vin din altă ediție a protocolului.

    Alte rute

    POST /copy-of-last-fiscal-receipt

    Copia ultimului bon fiscal

    Tipărește o copie a ultimului bon fiscal. Data e un obiect. Daisy nu are această comandă. Fără corp.

    POST /status-of-the-fiscal-transaction

    Starea tranzacției fiscale

    Întoarce starea tranzacției fiscale de pe casă (de exemplu, dacă e un bon deschis și suma strânsă), ca obiect. Fără corp.

    Diferențe între mărci

    ComportamentDatecsDaisyTremol
    Vânzare liberă (FreeSale)DaDoar cu „Vânzare liberă pe Daisy”, ca articol programatDa; nume de cel mult 30 de caractere
    Grupe TVA pe vânzare (TaxCode)1–7Grupa alege departamentul1–6
    Operator la bonul fiscalObligatoriu dacă trimiți antetulObligatoriu dacă trimiți antetulOpțional; lipsă, e citit de pe casă
    Parola operatorului——Exact 4 caractere
    Factură (Invoice)Bon „CIF Client”IgnoratIgnorat
    Formatarea textuluiDaDoar textulDoar textul, maximum 33 de caractere
    Plăți——Se pot face mai multe plăți; bonul se închide când ultima plată acoperă suma de plată
    Subtotal fără tipărire, cu reducereDaDaDoar fără reducere sau majorare
    Copia ultimului bonDaNuDa
    Raport Z arhivat după numărNuNuDa
    Afișaj client——Exact 20 de caractere pe linie
    Conexiune în rețeaDaNuDa

    Coduri de plată (PaymentMode)

    MetodăDaisyTremolDatecs
    Numerar300
    Card111
    Tichet de masă432
    Tichet valoric543
    Voucher654
    Credit765
    Plată modernă876
    Avans în numerar—27
    Altă metodă988
    Valută——9

    Bon pas cu pas: se elimină

    Aceste rute trimit un bon comandă cu comandă. Ele se elimină, iar anularea bonului deschis pleacă odată cu ele. Folosește /print-fiscal-receipt și /print-non-fiscal-receipt.

    Corpurile folosesc aceleași modele ca bonul dintr-un singur apel.

    IdMetodă · rutăCorpul cereriiDescriere
    open-non-fiscalPOST /open-non-fiscal-receipt— (Tremol: OperatorCode, OperatorPassword)Deschide un bon nefiscal.
    close-non-fiscalPOST /close-non-fiscal-receipt—Închide bonul nefiscal.
    cancel-non-fiscalPOST /cancel-non-fiscal-receipt—Anulează bonul nefiscal deschis.
    open-fiscalPOST /open-fiscal-receiptOpenFiscalReceiptDeschide un bon fiscal.
    register-free-salePOST /register-free-saleFreeSaleAdaugă o vânzare liberă.
    register-plu-salePOST /register-plu-salePluSaleAdaugă o vânzare de articol PLU.
    subtotalPOST /subtotalSubtotalTrimite subtotalul.
    paymentPOST /paymentRegisterPaymentÎnregistrează o plată.
    close-fiscalPOST /close-fiscal-receipt—Închide bonul fiscal.
    cancel-fiscalPOST /cancel-fiscal-receipt—Anulează bonul fiscal deschis.

    Rutele Shopify

    GET /get-shopify-order/{orderId} și POST /print-shopify-order/{orderId} aparțin integrării FiscalLink pentru Shopify POS. Cer licența Commerce și tokenul de sesiune Shopify în Authorization: Bearer. Integrarea Shopify POS e descrisă în documentația ei (/shopify-pos/docs).