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_base64ofpdf_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.exenaast 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
}
| type | Velden | Wat |
|---|---|---|
| text | text, align (left|center|right), bold, underline, size (1–8) | Tekstregel; lange tekst loopt door op de volgende regel. |
| item | left, right, bold, size | Twee kolommen: omschrijving links, bedrag rechts. |
| divider | char | Lijn over de volle breedte (standaard -). |
| feed | lines | Lege regels doorvoeren. |
| qr | data, size (1–16), align | QR-code. |
| barcode | data, height, align | CODE128-barcode met leesbare tekst eronder. |
| image | url of base64, width, align | Afbeelding (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-jobsBon of document insturen (receipt, raw_base64, pdf_base64 of pdf_url) -
GET
/print-jobs/{id}Status en verloop (events) van een bon -
GET
/print-jobsPrintlog: ?status, printer_id, user_id, from, until, per_page -
DELETE
/print-jobs/{id}Annuleren zolang de bon nog in de wachtrij staat -
GET
/printersPrinters van het team, met online-status -
GET
/printers/{id}Eén printer -
PATCH
/printers/{id}label, columns, dots_width, codepage aanpassen -
GET
/devicesApparaten (pc's) met hun printers -
POST
/devicesApparaat 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."]}}.