Naar de inhoud

Voor ontwikkelaars

API-documentatie

Met de MoobPrint API stuurt je kassasysteem, webshop of app bonnen naar elke printer in je team. Alle verzoeken gaan naar https://print.moobpos.nl/api en gebruiken JSON.

Snel starten

1. Maak in het beheerpaneel onder Kassa-koppelingen een sleutel aan. 2. Zoek het printer-ID op in de desktop-app of onder Printers. 3. Stuur je eerste bon:

curl -X POST https://print.moobpos.nl/api/print-jobs \
  -H 'Authorization: Bearer mpk_…' \
  -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -d '{"printer_id": 1, "receipt": {"lines": [{"type": "text", "text": "Hallo!", "align": "center"}], "cut": true}}'

Authenticatie

Stuur de sleutel mee als bearer token: Authorization: Bearer mpk_…. Een sleutel hoort bij één team, dus je ziet en print alleen op printers van dat team. Maak per kassasysteem een eigen sleutel aan; zo zie je in de printlog waar elke bon vandaan kwam, en kun je één koppeling intrekken zonder de rest te raken.

Stuur altijd Accept: application/json mee. Limiet: 300 verzoeken per minuut per sleutel.

Bon insturen

POST /print-jobs met:

  • printer_id: optioneel als de sleutel een standaardprinter heeft.
  • Precies één van: receipt (de bon als JSON, zie hieronder), raw_base64 (eigen ESC/POS-bytes), pdf_base64 of pdf_url (een PDF, zie PDF printen).
  • copies: 1–10 (standaard 1). title: label voor de printlog.
  • idempotency_key: dezelfde sleutel binnen het team geeft de bestaande bon terug in plaats van een tweede print (HTTP 200 i.p.v. 201). Gebruik bijvoorbeeld je bonnummer.

Een bon die niet binnen 15 minuten geprint is, krijgt de status expired en wordt niet meer geprint.

PDF printen

Facturen, pakbonnen of etiketten stuur je als PDF: pdf_base64 met het bestand, of pdf_url met een publieke https-URL (maximaal 20 MB). De bon krijgt content_type: "pdf".

  • macOS en Linux: de printerwachtrij (CUPS) zet de PDF om voor de printer. Werkt met elke printer die in het systeem staat.
  • Windows: installeer SumatraPDF op de kassa-pc (of zet SumatraPDF.exe naast MoobPrint). De app ziet dat vanzelf.
  • Netwerkprinters: de PDF gaat direct naar poort 9100. Dat werkt bij kantoorprinters met PDF-direct-print, niet bij bonnenprinters.

Kan het apparaat van een systeemprinter geen PDF's printen, dan weigert de API de bon direct met 422, zodat je het niet pas achteraf merkt. In de app en onder Apparaten zie je per computer of PDF-printen werkt.

curl -X POST https://print.moobpos.nl/api/print-jobs \
  -H 'Authorization: Bearer mpk_…' -H 'Content-Type: application/json' -H 'Accept: application/json' \
  -d '{"printer_id": 3, "title": "Factuur 2026-001", "pdf_url": "https://jouwzaak.nl/facturen/2026-001.pdf"}'

Bon-JSON

MoobPrint maakt van de bon ESC/POS met de breedte en tekenset van die printer (48 tekens voor 80 mm, 32 voor 58 mm). Het €-teken en accenten werken gewoon.

{
  "logo_url": "https://jouwzaak.nl/logo.png",
  "lines": [
    { "type": "text", "text": "Lunchroom De Kade", "align": "center", "bold": true, "size": 2 },
    { "type": "divider" },
    { "type": "item", "left": "Cappuccino", "right": "€ 3,40" },
    { "type": "item", "left": "Totaal", "right": "€ 3,40", "bold": true },
    { "type": "feed", "lines": 1 },
    { "type": "qr", "data": "https://jouwzaak.nl/bon/1085", "size": 6 },
    { "type": "barcode", "data": "1085" }
  ],
  "cut": true,
  "open_drawer": false
}
typeVeldenWat
texttext, align (left|center|right), bold, underline, size (1–8)Tekstregel; lange tekst loopt door op de volgende regel.
itemleft, right, bold, sizeTwee kolommen: omschrijving links, bedrag rechts.
dividercharLijn over de volle breedte (standaard -).
feedlinesLege regels doorvoeren.
qrdata, size (1–16), alignQR-code.
barcodedata, height, alignCODE128-barcode met leesbare tekst eronder.
imageurl of base64, width, alignAfbeelding (PNG/JPG), zwart-wit gemaakt en verkleind tot de printerbreedte.

Bovenaan de bon kan een logo via logo_url of logo_base64. cut snijdt het papier af (standaard aan), open_drawer opent de kassalade.

Status en printlog

GET /print-jobs/{id} geeft de status (pending, printing, done, failed, expired) en het verloop:

{
  "data": {
    "id": 1085, "status": "done", "printer_id": 1, "bytes": 612, "attempts": 1,
    "events": [
      { "type": "created", "at": "2026-10-12T14:16:40+00:00" },
      { "type": "claimed", "device_id": 1, "at": "2026-10-12T14:16:41+00:00" },
      { "type": "done", "device_id": 1, "at": "2026-10-12T14:16:42+00:00" }
    ]
  }
}

Alle endpoints

  • POST /print-jobs Bon of document insturen (receipt, raw_base64, pdf_base64 of pdf_url)
  • GET /print-jobs/{id} Status en verloop (events) van een bon
  • GET /print-jobs Printlog: ?status, printer_id, user_id, from, until, per_page
  • DELETE /print-jobs/{id} Annuleren zolang de bon nog in de wachtrij staat
  • GET /printers Printers van het team, met online-status
  • GET /printers/{id} Eén printer
  • PATCH /printers/{id} label, columns, dots_width, codepage aanpassen
  • GET /devices Apparaten (pc's) met hun printers
  • POST /devices Apparaat aanmaken; geeft eenmalig een device-token
  • DELETE /devices/{id} Apparaat verwijderen

Fouten

Bij een ongeldige sleutel krijg je 401, bij een printer die niet bij je team hoort 422 of 404. Validatiefouten komen terug als 422 met per veld een melding in errors, bijvoorbeeld {"errors": {"printer_id": ["Printer niet gevonden in dit team."]}}.