Met de Print API haal je de keukentickets van je evenement als JSON op en stuur je ze naar je eigen printer: een Sunmi, een labelprinter, een Raspberry Pi met een USB-bonprinter, of gewoon een script dat de bestellingen ergens anders naartoe stuurt. De Print API is onderdeel van de Presto Developer API en vereist een API-sleutel en een actief Presto Pro-abonnement.
Heb je een Epson-bonprinter met Server Direct Print? Dan heb je deze API niet nodig: de printer haalt de tickets zelf op via de URL die je in het Print Station vindt. Zie onderaan voor de details.
GET /events/{id}/print-queue.POST /orders/{id}/mark-printed.De wachtrij ophalen verandert niets: een bestelling blijft erin staan tot je ze bevestigt. Crasht je script halverwege, dan komen de ongeprinte tickets bij de herstart gewoon terug. Print je iets twee keer, dan is dat omdat je het twee keer ophaalde zonder tussendoor te bevestigen.
Poll om de 2 à 3 seconden. Sneller heeft geen zin en de API laat 60 aanvragen per minuut per sleutel toe, bevestigingen inbegrepen.
https://app.getpresto.be/api/v1
Authorization: Bearer presto_JOUW_SLEUTEL
Accept: application/json
Je maakt een sleutel aan in je Presto-dashboard onder het sleutelbeheer. Zie de Developer API-pagina voor het volledige verhaal rond sleutels en rate limiting.
GET /events : je evenementen, met het id dat de andere endpoints nodig hebbenGET /events/{id}/print-queue : tickets die nog geprint moeten worden, oudste eerstGET /orders/{id}/ticket : één ticket, ook als het al geprint is (voor herdrukken)POST /orders/{id}/mark-printed : ticket kwam uit de printer, haal het uit de wachtrijPOST /orders/{id}/skip-ticket : haal het uit de wachtrij zonder het als geprint te tellenEen evenement of bestelling die niet bestaat of niet van jou is geeft 404. Gedeelde evenementen (waar de eigenaar jou toegang tot het dashboard gaf) zie je ook.
curl https://app.getpresto.be/api/v1/events
-H "Authorization: Bearer presto_JOUW_SLEUTEL"
-H "Accept: application/json"
{
"data": [
{
"id": 412,
"name": "Spaghettiavond 2026",
"slug": "spaghettiavond-2026",
"created_at": "2026-09-01T18:20:11.000000Z",
"activated_at": "2026-09-01T18:25:40.000000Z"
}
]
}
curl https://app.getpresto.be/api/v1/events/412/print-queue
-H "Authorization: Bearer presto_JOUW_SLEUTEL"
-H "Accept: application/json"
{
"data": {
"server_time": "2026-09-21T18:42:07.311204Z",
"queue": [
{
"id": 9031,
"order_number": "3fcb6bce-088d-418e-ac4b-fe6fabff53b9",
"short_order_number": "3fcb6bce",
"sequential_number": 27,
"name": "Yannick",
"table_number": "12",
"channel": "qr",
"status": "pending",
"payment_method": "bancontact",
"grand_total": "23.50",
"comments": "Zonder ajuin aub",
"notes": null,
"placed_at": "2026-09-21T18:41:50.000000Z",
"paid_at": "2026-09-21T18:41:58.000000Z",
"printed_at": null,
"print_count": 0,
"items_by_list": [
{
"list_name": "Eten",
"items": [
{ "name": "Spaghetti bolognaise", "quantity": 2 },
{ "name": "Spaghetti veggie", "quantity": 1 }
]
},
{
"list_name": "Dranken",
"items": [
{ "name": "Cola", "quantity": 2 }
]
}
],
"total_items": 5
}
]
}
}
sequential_number: het volgnummer dat de klant op zijn scherm ziet en dat op het ticket hoort te staan. short_order_number is de fallback voor oudere bestellingen zonder volgnummer.items_by_list: de producten gegroepeerd per menulijst, in de volgorde waarin de keuken ze afwerkt.comments: de opmerking van de klant. notes: interne notities van de toog.server_time: de klok van de server. Meet de leeftijd van een bestelling hiertegen af en niet tegen de klok van je eigen toestel, zodat een verkeerd ingestelde tijd de achterstand van de hele dag niet als “nieuw” laat afdrukken.print_count: hoe vaak dit ticket al geprint werd. Groter dan 0 in de wachtrij betekent dat iemand het opnieuw in de wachtrij zette.curl -X POST https://app.getpresto.be/api/v1/orders/9031/mark-printed
-H "Authorization: Bearer presto_JOUW_SLEUTEL"
-H "Accept: application/json"
{
"data": {
"id": 9031,
"printed_at": "2026-09-21T18:42:09.000000Z",
"print_count": 1
}
}
Roep je mark-printed een tweede keer aan voor een herdruk, dan gaat print_count omhoog en blijft printed_at het moment van de eerste print. Gebruik skip-ticket als je een achterstand wil wegwerken zonder ze te printen, bijvoorbeeld wanneer je het script pas halverwege de service opstart.
import time
import requests
BASE = "https://app.getpresto.be/api/v1"
HEADERS = {
"Authorization": "Bearer presto_JOUW_SLEUTEL",
"Accept": "application/json",
}
EVENT_ID = 412
def print_ticket(ticket):
"""Stuur het ticket naar je printer. Geef True terug als het papier eruit kwam."""
lines = [f"#{ticket['sequential_number'] or ticket['short_order_number']}"]
if ticket["table_number"]:
lines.append(f"Tafel {ticket['table_number']}")
for group in ticket["items_by_list"]:
lines.append(f"-- {group['list_name']} --")
for item in group["items"]:
lines.append(f"{item['quantity']} x {item['name']}")
if ticket["comments"]:
lines.append(f"Opmerking: {ticket['comments']}")
print("n".join(lines)) # vervang door je printer-code
return True
while True:
try:
r = requests.get(f"{BASE}/events/{EVENT_ID}/print-queue", headers=HEADERS, timeout=10)
r.raise_for_status()
for ticket in r.json()["data"]["queue"]:
if print_ticket(ticket):
requests.post(f"{BASE}/orders/{ticket['id']}/mark-printed", headers=HEADERS, timeout=10)
except requests.RequestException as e:
print("Presto onbereikbaar:", e)
time.sleep(3)
Het Print Station in je dashboard, een Epson-printer via Server Direct Print en je eigen script putten alle drie uit dezelfde wachtrij. Ze weten niets van elkaar: laat je er twee tegelijk lopen, dan printen ze allebei elk ticket. Kies er één per evenement en zet de andere uit.
De URL die je in het Print Station vindt (https://app.getpresto.be/api/print/<token>) is bedoeld voor de printer zelf. Ze volgt het Epson Server Direct Print-protocol en geeft tickets als ePOS-Print XML terug. Voor een eigen script gebruik je beter de Print API hierboven: die is JSON, vereist geen XML-parser en heeft geen timing-eisen.
Bouw je toch rechtstreeks op die URL, dan moet je het volledige protocol volgen. Dat bestaat uit twee stappen:
POST met ConnectionType=GetRequest geeft één ticket terug (of een lege 200 als er niets is).POST met ConnectionType=SetResponse en het printresultaat als ResponseFile.Sla je stap 2 over, dan wacht de server 60 seconden op een resultaat, beschouwt het ticket daarna als verloren en biedt het opnieuw aan, tot drie keer toe. Je ziet dan elk ticket drie keer met een minuut ertussen, en maar één nieuw ticket per drie minuten. Dat is geen bug in je script maar het failsafe-gedrag dat een uitgevallen printer opvangt.
ConnectionType=SetResponse&ID=mijn-printer&ResponseFile=<?xml version="1.0" encoding="utf-8"?>
<PrintResponseInfo Version="1.00">
<ePOSPrint>
<Parameter><devid>local_printer</devid><printjobid></printjobid></Parameter>
<PrintResponse>
<response success="true" code="" status="0" xmlns="http://www.epson-pos.com/schemas/2011/03/epos-print"/>
</PrintResponse>
</ePOSPrint>
</PrintResponseInfo>
Stuur success="false" als het printen mislukte: het ticket komt dan terug in de wachtrij (maximaal drie pogingen).
Alle calls van de Print API zitten in de Bruno-collectie van de Developer API, in de map Print API v1. Importeer het .zip-bestand in Bruno.
Vragen over de integratie of een printer die je aan de praat wil krijgen? Neem gerust contact met ons op.