De API: bestellen vanuit je eigen systeem
19 min leestijdBijgewerkt
Met de Reseller API koppel je je eigen webshop, ERP of script rechtstreeks aan Printen.eu. In dit artikel maak je een sleutel, haal je de catalogus op, vraag je een offerte aan en plaats je je eerste order, eerst in de sandbox en daarna live. De volledige referentie vind je op de [ontwikkelaarspagina](page:developers).
In dit artikel
Hoe maak en beheer je een API-sleutel?
Elke aanroep van de API gebruikt een sleutel. Er zijn twee soorten: een live sleutel (begint met prk_live_) plaatst echte orders die worden afgerekend en geproduceerd, een testsleutel (begint met prk_test_) werkt in de sandbox: orders worden aangemaakt, maar niets wordt afgerekend of geproduceerd.
Open het tabblad
Ga in je dashboard naar API-sleutels.
Geef de sleutel een naam
Vul bij Naam van de sleutel een herkenbare naam in, bijvoorbeeld de naam van je webshop of server. Zo weet je later welke sleutel waar gebruikt wordt.
Kies test of live
Vink Testsleutel aan voor een sandboxsleutel (
prk_test_). Laat het vakje leeg voor een live sleutel (prk_live_). Kies daarna bij Rechten (scopes) wat de sleutel mag; laat je alles aangevinkt, dan heeft hij alle rechten.Maak de sleutel
Klik op Sleutel maken. De volledige sleutel verschijnt één keer, met de melding Kopieer deze sleutel nu. Je ziet hem maar één keer.
Kopieer en bewaar hem
Klik op Kopiëren en zet de sleutel direct op een veilige plek, zoals een omgevingsvariabele op je server of een wachtwoordkluis. Daarna zie je in de lijst alleen nog het begin van de sleutel en wanneer hij Laatst gebruikt is.
De API kent rechten (scopes) per sleutel. Een sleutel zonder scopes heeft alle rechten. In het dashboard kies je ze bij Rechten (scopes) als je de sleutel maakt. Laat je alles aangevinkt, dan krijgt de sleutel alle rechten, ook rechten die later bijkomen. In de lijst zie je per sleutel welke rechten hij heeft. Wil je de rechten van een sleutel wijzigen, maak dan een nieuwe sleutel en trek de oude in.
| Scope | Wat de sleutel ermee mag |
|---|---|
catalog:read | De catalogus en productopties opvragen (GET /products). |
quotes:write | Prijzen berekenen (POST /quotes). |
orders:read | Orders en hun status opvragen (GET /orders). |
orders:write | Orders plaatsen en annuleren (POST /orders, POST /orders/{id}/cancel). |
reseller-products:read | Je eigen producten opvragen. |
reseller-products:write | Je eigen producten maken, wijzigen en verwijderen. |
wallet:read | Je saldo en mutaties opvragen (GET /wallet). |
webhooks:read | Je webhook-endpoints opvragen. |
webhooks:write | Webhook-endpoints toevoegen en verwijderen. |
| Geen scopes | Alles hierboven. |
Base URL, authenticatie en limieten
- Base URL:
https://www.printen.eu/api/reseller/v1. Alle paden in dit artikel zijn relatief daaraan. - Authenticatie: stuur bij elk verzoek de header
Authorization: Bearer prk_live_...ofAuthorization: Bearer prk_test_.... - Formaat: verzoeken en antwoorden zijn JSON. Een geslaagd antwoord staat altijd in een
data-veld; lijsten hebben daarnaastnextCursorom de volgende pagina op te halen. - Bedragen: altijd in eurocenten.
2873betekent dus € 28,73. - Limiet: maximaal 120 verzoeken per minuut per sleutel. Offertes (
POST /quotes) en nieuwe orders hebben daarnaast een eigen limiet per account, die voor nieuwe accounts lager is. Elk antwoord bevatRateLimit-Limit,RateLimit-RemainingenRateLimit-Reset(seconden) voor de limiet die het eerst op is. Daarboven krijg je status 429 met eenRetry-After-header. - Specificatie: de volledige OpenAPI-specificatie staat op https://www.printen.eu/reseller-api/openapi.json. Je kunt die importeren in Postman, Insomnia of een codegenerator.
Test je sleutel met een eenvoudige aanroep, bijvoorbeeld het saldo opvragen. Krijg je JSON terug met data, dan werkt je sleutel.
curl https://www.printen.eu/api/reseller/v1/wallet \
-H "Authorization: Bearer prk_test_..."Hoe vraag je de catalogus en de opties op?
Met GET /products zoek je in de catalogus. Gebruik q als zoekterm, category voor een categorie, lang voor de taal van namen en opties (nl, en, de of fr), en limit (maximaal 100) en cursor om door de pagina’s te bladeren.
curl "https://www.printen.eu/api/reseller/v1/products?q=poster&lang=nl&limit=5" \
-H "Authorization: Bearer prk_test_..."Met het id uit die lijst haal je één product op met alle opties en de bestandseisen.
curl "https://www.printen.eu/api/reseller/v1/products/PRODUCT_ID?lang=nl" \
-H "Authorization: Bearer prk_test_..."{
"data": {
"id": "PRODUCT_ID",
"slug": "poster",
"name": "Poster",
"options": [
{
"key": "size",
"label": "Formaat",
"type": "select",
"values": [
{ "value": "A3", "label": "A3" },
{ "value": "A2", "label": "A2" }
]
}
],
"quantities": [1, 5, 10],
"fileRequirements": {
"required": true,
"formats": ["pdf", "png", "jpg"],
"minDpi": 300,
"colorProfile": "CMYK",
"bleedMm": 3,
"fileUrlMustBeHttps": true
}
}
}| Veld | Betekenis |
|---|---|
options | De keuzes van het product. Gebruik key als naam en een value uit values als waarde in je offerte, order of eigen product. |
quantities | De aantallen die je kunt bestellen, als het product vaste aantallen heeft. |
fileRequirements | Bestandseisen: toegestane formaten, minimale resolutie (minDpi), kleurprofiel, afloop in mm (bleedMm) en of de bestands-url https moet zijn. |
Je eerste offerte: wat kost een order?
Met POST /quotes bereken je de prijs van één of meer regels voor een bestemmingsland, inclusief je korting, verzending en btw. Er wordt niets besteld of afgerekend. Een regel bevat een resellerSku (je eigen product) of een productId met options, plus een quantity.
curl -X POST https://www.printen.eu/api/reseller/v1/quotes \
-H "Authorization: Bearer prk_test_..." -H "Content-Type: application/json" \
-d '{"country":"NL","lines":[{"resellerSku":"POSTER-A2","quantity":1}]}'{
"data": {
"lines": [
{
"productId": "PRODUCT_ID",
"productName": "Poster",
"options": { "size": "A2" },
"quantity": 1,
"retailNetCents": 2000,
"netCents": 1800,
"resellerProductId": "RESELLER_PRODUCT_ID"
}
],
"discountPercent": 10,
"subtotalNetCents": 1800,
"shippingNetCents": 574,
"vatRate": 21,
"vatTreatment": "domestic-business",
"vatCents": 499,
"totalCents": 2873,
"currency": "EUR"
}
}| Veld | Betekenis |
|---|---|
lines[].retailNetCents | De gewone consumentenprijs van de regel, exclusief btw. |
lines[].netCents | Jouw prijs voor de regel na korting, exclusief btw. |
discountPercent | Je huidige kortingspercentage. |
subtotalNetCents | Alle regels samen, exclusief btw. |
shippingNetCents | Verzendkosten naar het opgegeven land, exclusief btw. |
vatRate | Het btw-percentage dat op jou van toepassing is, bijvoorbeeld 21 of 0. |
vatTreatment | Hoe de btw is bepaald, bijvoorbeeld domestic-business (Nederlandse btw) of reverse-charge-eu-b2b (btw verlegd). |
vatCents | Het btw-bedrag. |
totalCents | Het totaal dat bij een order van je saldo of kaart wordt afgerekend. |
Je eerste order plaatsen (met Idempotency-Key)
Kies een unieke sleutel
Bedenk per order een unieke
Idempotency-Key, bij voorkeur je eigen ordernummer (bijvoorbeeldshop-order-1001). Deze header is verplicht.Stel de regels samen
Gebruik per regel een
resellerSkuen eenquantity. Heeft je product nog geen ontwerp, stuur dan eenfileUrl(https) mee.Vul de ontvanger in
Verplicht zijn
name,address1,postalCode,cityencountry(ISO-2, bijvoorbeeld NL). Optioneel:company,email,phone,address2enstate.Voeg je eigen kenmerken toe
Met
externalOrderIdenexternalOrderNumberkoppel je de order aan je eigen systeem; die komen terug in elke webhook.referenceis je eigen kenmerk.Verstuur het verzoek
Een nieuwe order geeft status 201. Controleer
statein het antwoord:SUBMITTEDbetekent betaald en onderweg naar productie.
curl -X POST https://www.printen.eu/api/reseller/v1/orders \
-H "Authorization: Bearer prk_test_..." -H "Content-Type: application/json" \
-H "Idempotency-Key: shop-order-1001" \
-d '{"externalOrderId":"1001","lines":[{"resellerSku":"POSTER-A2","quantity":1}],
"recipient":{"name":"Anna de Vries","address1":"Dorpsstraat 1","postalCode":"1234 AB","city":"Utrecht","country":"NL"}}'{
"data": {
"id": "ORDER_ID",
"resellerOrderId": "RESELLER_ORDER_ID",
"orderNumber": "RS-3F9A1C7B2E",
"state": "SUBMITTED",
"totalCents": 2873,
"chargedCents": 0,
"duplicate": false,
"test": true
}
}Waarom een Idempotency-Key? Netwerken zijn onbetrouwbaar: een time-out betekent niet dat je order niet is aangekomen. Met een Idempotency-Key kun je een verzoek veilig herhalen. Stuur je dezelfde sleutel nog een keer, dan krijg je de bestaande order terug met "duplicate": true en status 200. Er ontstaat nooit een tweede order.
{
"data": {
"id": "ORDER_ID",
"resellerOrderId": "RESELLER_ORDER_ID",
"orderNumber": "RS-3F9A1C7B2E",
"state": "SUBMITTED",
"totalCents": 2873,
"chargedCents": 0,
"duplicate": true,
"test": true
}
}- Gebruik één sleutel per order, en altijd dezelfde sleutel als je die order opnieuw probeert.
- Met een bestaande sleutel krijg je altijd de oorspronkelijke order terug, ook als de inhoud van je verzoek anders is. Wil je echt een nieuwe order, gebruik dan een nieuwe sleutel.
- Een sleutel is maximaal 200 tekens (zichtbare ASCII-tekens).
- Live sleutels en testsleutels hebben elk hun eigen verzameling. Een testorder met
shop-order-1001blokkeert dus geen live order met dezelfde sleutel.
Eigen producten beheren via de API
Een eigen product is een catalogusproduct met vaste opties, jouw SKU, je ontwerpbestand, een titel en optioneel je verkoopprijs. Via POST /reseller-products maak je er een aan; daarna bestel je het met resellerSku.
curl -X POST https://www.printen.eu/api/reseller/v1/reseller-products \
-H "Authorization: Bearer prk_test_..." -H "Content-Type: application/json" \
-d '{"productId":"PRODUCT_ID","sku":"POSTER-A2-MAT","title":"Poster A2 mat",
"options":{"size":"A2"},"fileUrl":"https://example.com/designs/poster-a2.pdf",
"retailPriceCents":4995,"active":true}'Met PATCH /reseller-products/{id} wijzig je een bestaand product. In plaats van het id mag je ook de SKU gebruiken. Je stuurt alleen de velden mee die je wilt veranderen, bijvoorbeeld een nieuw bestand, een andere prijs of mockupafbeeldingen in mockupUrls.
curl -X PATCH https://www.printen.eu/api/reseller/v1/reseller-products/POSTER-A2-MAT \
-H "Authorization: Bearer prk_test_..." -H "Content-Type: application/json" \
-d '{"mockupUrls":["https://example.com/mockups/poster-a2-living-room.jpg",
"https://example.com/mockups/poster-a2-detail.jpg"],
"retailPriceCents":4495}'productId,skuentitlezijn verplicht bij het maken. Bedragen zoalsretailPriceCentszijn in eurocenten.- Een SKU moet uniek zijn in je account. Bestaat hij al, dan krijg je 409.
- Kloppen de opties niet voor dit product, dan krijg je 422.
- Met
"active": falsezet je een product op inactief. Orders met die SKU worden dan geweigerd. - Met
DELETE /reseller-products/{id}verwijder je een product. Is het nog gekoppeld aan een verbonden winkel, dan krijg je 409.
Welke orderstatussen zijn er, en wat moet je doen?
Elke order heeft een state: de status aan jouw kant (betaling en bestand). Zodra de order SUBMITTED is, volgt ook een productiestatus in status.
| state | Betekenis | Wat te doen |
|---|---|---|
AWAITING_FUNDS | Je saldo is te laag. Er is niets afgerekend. | Waardeer op. Staat automatisch opwaarderen aan, dan proberen we dat eerst. Na een opwaardering gaat de order vanzelf door; we proberen wachtende orders ook elke 15 minuten opnieuw. |
AWAITING_FILE | Een regel heeft geen ontwerpbestand. Er is niets afgerekend. | Annuleer de order en plaats hem opnieuw met een nieuwe Idempotency-Key, met een fileUrl of met een product dat wel een bestand heeft. |
PAYMENT_FAILED | De betaling met je opgeslagen kaart is mislukt. | Controleer je kaart of leg een andere vast bij Saldo & betalen en klik bij de order op Opnieuw proberen. |
SUBMITTED | Betaald en onderweg naar productie. | Niets. Volg de productiestatus en de tracking via webhooks of GET /orders/{id}. |
CANCELLED | De order is geannuleerd en eventueel terugbetaald. | Niets. |
De productiestatus in status loopt van PAID via PROCESSING en PRINTING naar SHIPPED en DELIVERED. Bij SHIPPED vind je de trackingcode en de trackinglink in tracking. Een geannuleerde order krijgt CANCELLED of REFUNDED.
# Orders that are waiting for balance
curl "https://www.printen.eu/api/reseller/v1/orders?state=AWAITING_FUNDS" \
-H "Authorization: Bearer prk_test_..."
# One order: by id, resellerOrderId or order number
curl https://www.printen.eu/api/reseller/v1/orders/RS-3F9A1C7B2E \
-H "Authorization: Bearer prk_test_..."Hoe annuleer je een order?
Met POST /orders/{id}/cancel annuleer je een order, zolang hij nog niet naar productie is gegaan. Als {id} mag je het order-id, het resellerOrderId of het ordernummer gebruiken.
curl -X POST https://www.printen.eu/api/reseller/v1/orders/RS-3F9A1C7B2E/cancel \
-H "Authorization: Bearer prk_test_..."- Lukt het, dan krijg je de order terug met
stateCANCELLED. - Is de order al in productie, dan krijg je 409: annuleren kan dan niet meer.
- Betaald met saldo: het bedrag komt terug op je saldo en staat als Terugbetaling bij Mutaties.
- Betaald met je kaart: het bedrag gaat terug naar die kaart.
- Is er nog niets afgerekend (bijvoorbeeld bij
AWAITING_FUNDS), dan wordt er ook niets terugbetaald.
Hoe test je veilig in de sandbox?
Met een testsleutel (prk_test_) bouw en test je je koppeling zonder risico. Je gebruikt dezelfde base URL en dezelfde aanroepen als live.
| In de sandbox | Wat er gebeurt |
|---|---|
| Orders plaatsen | Orders worden aangemaakt en krijgen meteen SUBMITTED, met "test": true. |
| Afrekenen | Er wordt niets van je saldo of kaart afgeschreven. |
| Productie | Er wordt niets gedrukt of verzonden. |
| Webhooks | Je ontvangt order.created en order.submitted, en order.cancelled als je de testorder annuleert. Productie-events zoals order.shipped komen niet. |
| Idempotency-Key | Testsleutels hebben een eigen verzameling sleutels, los van live. |
Test alles met prk_test_
Controleer offertes, orders, herhaalde verzoeken met dezelfde Idempotency-Key, annuleren en je webhook-verwerking.
Maak een live sleutel
Maak bij API-sleutels een sleutel zonder Testsleutel aan te vinken.
Wissel de sleutel
Vervang in je configuratie de
prk_test_-sleutel door deprk_live_-sleutel. Verder verandert er niets.Controleer je betaalwijze
Zorg voor genoeg saldo of een opgeslagen kaart bij Saldo & betalen, anders blijven live orders op
AWAITING_FUNDSofPAYMENT_FAILEDstaan.
Wat betekent een foutmelding?
Elke fout heeft dezelfde vorm: een error-object met een korte code en een leesbare message. Kijk eerst naar de HTTP-status; de message vertelt je meestal precies wat er mis is.
{
"error": {
"code": "...",
"message": "..."
}
}| Status | Betekenis | Wat te doen |
|---|---|---|
| 400 | Ongeldig verzoek, bijvoorbeeld een ontbrekend verplicht veld of een ontbrekende Idempotency-Key bij een order. | Lees de message en verbeter je verzoek. |
| 401 | Sleutel ontbreekt, is ongeldig of is ingetrokken. | Controleer de Authorization-header en maak zo nodig een nieuwe sleutel. |
| 403 | Je account is niet (meer) goedgekeurd of opgeschort, of de sleutel heeft niet de juiste scope. | Controleer je account in het dashboard of neem contact met ons op. |
| 404 | Het product, de order of het endpoint bestaat niet (in jouw account). | Controleer het id, de SKU of het ordernummer. |
| 409 | Conflict, bijvoorbeeld: de SKU bestaat al, de order is al in productie en kan niet meer geannuleerd worden, het product is nog gekoppeld aan een winkel, of je hebt al het maximale aantal webhook-endpoints. | Lees de message; herhaal het verzoek niet ongewijzigd. |
| 422 | Het verzoek is goed opgebouwd maar kan niet worden uitgevoerd, bijvoorbeeld een onbekende SKU of opties die niet bij het product passen. | Controleer je SKU’s en opties. |
| 429 | Te veel verzoeken: meer dan 120 per minuut voor deze sleutel. | Wacht het aantal seconden uit Retry-After. |
| 500 | Er ging aan onze kant iets mis. | Probeer het later opnieuw, bij orders met dezelfde Idempotency-Key. Blijft het misgaan, neem dan contact met ons op. |
Gerelateerde artikelen
- Webhooks: orderupdates automatisch ontvangenOntvang orderupdates op je eigen url, controleer de handtekening, verwerk events veilig en los problemen met afleveringen op.
- Producten maken: van catalogusproduct naar eigen SKUKies een product, zet de opties vast, upload je ontwerp, kies een goede SKU, reken je marge uit en test je product met een order.
- Orders volgen, wijzigen en problemen oplossenVolg je orders, begrijp elke status, plaats handmatig een order, annuleer op tijd en weet wat je doet bij betaalproblemen, adresfouten of schade.
Kom je er niet uit?
We helpen je graag verder, op werkdagen persoonlijk en meestal dezelfde dag.