Ga naar de hoofdinhoud
Printproducten vanaf 1 stuk

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.

Het tabblad API-sleutels in je dashboard.
  1. Open het tabblad

    Ga in je dashboard naar API-sleutels.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

ScopeWat de sleutel ermee mag
catalog:readDe catalogus en productopties opvragen (GET /products).
quotes:writePrijzen berekenen (POST /quotes).
orders:readOrders en hun status opvragen (GET /orders).
orders:writeOrders plaatsen en annuleren (POST /orders, POST /orders/{id}/cancel).
reseller-products:readJe eigen producten opvragen.
reseller-products:writeJe eigen producten maken, wijzigen en verwijderen.
wallet:readJe saldo en mutaties opvragen (GET /wallet).
webhooks:readJe webhook-endpoints opvragen.
webhooks:writeWebhook-endpoints toevoegen en verwijderen.
Geen scopesAlles 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_... of Authorization: Bearer prk_test_....
  • Formaat: verzoeken en antwoorden zijn JSON. Een geslaagd antwoord staat altijd in een data-veld; lijsten hebben daarnaast nextCursor om de volgende pagina op te halen.
  • Bedragen: altijd in eurocenten. 2873 betekent 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 bevat RateLimit-Limit, RateLimit-Remaining en RateLimit-Reset (seconden) voor de limiet die het eerst op is. Daarboven krijg je status 429 met een Retry-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.

Sleutel testen
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.

Producten zoeken
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.

Eén product met opties
curl "https://www.printen.eu/api/reseller/v1/products/PRODUCT_ID?lang=nl" \
  -H "Authorization: Bearer prk_test_..."
Antwoord (verkort voorbeeld)
{
  "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
    }
  }
}
VeldBetekenis
optionsDe keuzes van het product. Gebruik key als naam en een value uit values als waarde in je offerte, order of eigen product.
quantitiesDe aantallen die je kunt bestellen, als het product vaste aantallen heeft.
fileRequirementsBestandseisen: 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.

Offerte opvragen
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}]}'
Antwoord
{
  "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"
  }
}
VeldBetekenis
lines[].retailNetCentsDe gewone consumentenprijs van de regel, exclusief btw.
lines[].netCentsJouw prijs voor de regel na korting, exclusief btw.
discountPercentJe huidige kortingspercentage.
subtotalNetCentsAlle regels samen, exclusief btw.
shippingNetCentsVerzendkosten naar het opgegeven land, exclusief btw.
vatRateHet btw-percentage dat op jou van toepassing is, bijvoorbeeld 21 of 0.
vatTreatmentHoe de btw is bepaald, bijvoorbeeld domestic-business (Nederlandse btw) of reverse-charge-eu-b2b (btw verlegd).
vatCentsHet btw-bedrag.
totalCentsHet totaal dat bij een order van je saldo of kaart wordt afgerekend.

Je eerste order plaatsen (met Idempotency-Key)

Van verzoek tot productie.
  1. Kies een unieke sleutel

    Bedenk per order een unieke Idempotency-Key, bij voorkeur je eigen ordernummer (bijvoorbeeld shop-order-1001). Deze header is verplicht.

  2. Stel de regels samen

    Gebruik per regel een resellerSku en een quantity. Heeft je product nog geen ontwerp, stuur dan een fileUrl (https) mee.

  3. Vul de ontvanger in

    Verplicht zijn name, address1, postalCode, city en country (ISO-2, bijvoorbeeld NL). Optioneel: company, email, phone, address2 en state.

  4. Voeg je eigen kenmerken toe

    Met externalOrderId en externalOrderNumber koppel je de order aan je eigen systeem; die komen terug in elke webhook. reference is je eigen kenmerk.

  5. Verstuur het verzoek

    Een nieuwe order geeft status 201. Controleer state in het antwoord: SUBMITTED betekent betaald en onderweg naar productie.

Order plaatsen
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"}}'
Antwoord (sandbox)
{
  "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.

Herhaald verzoek met dezelfde sleutel
{
  "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-1001 blokkeert 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.

Product maken
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.

Mockups en prijs bijwerken
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, sku en title zijn verplicht bij het maken. Bedragen zoals retailPriceCents zijn 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": false zet 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.

stateBetekenisWat te doen
AWAITING_FUNDSJe 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_FILEEen 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_FAILEDDe 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.
SUBMITTEDBetaald en onderweg naar productie.Niets. Volg de productiestatus en de tracking via webhooks of GET /orders/{id}.
CANCELLEDDe 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 opvragen
# 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.

Order annuleren
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 state CANCELLED.
  • 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 sandboxWat er gebeurt
Orders plaatsenOrders worden aangemaakt en krijgen meteen SUBMITTED, met "test": true.
AfrekenenEr wordt niets van je saldo of kaart afgeschreven.
ProductieEr wordt niets gedrukt of verzonden.
WebhooksJe ontvangt order.created en order.submitted, en order.cancelled als je de testorder annuleert. Productie-events zoals order.shipped komen niet.
Idempotency-KeyTestsleutels hebben een eigen verzameling sleutels, los van live.
  1. Test alles met prk_test_

    Controleer offertes, orders, herhaalde verzoeken met dezelfde Idempotency-Key, annuleren en je webhook-verwerking.

  2. Maak een live sleutel

    Maak bij API-sleutels een sleutel zonder Testsleutel aan te vinken.

  3. Wissel de sleutel

    Vervang in je configuratie de prk_test_-sleutel door de prk_live_-sleutel. Verder verandert er niets.

  4. Controleer je betaalwijze

    Zorg voor genoeg saldo of een opgeslagen kaart bij Saldo & betalen, anders blijven live orders op AWAITING_FUNDS of PAYMENT_FAILED staan.

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.

Vorm van een fout
{
  "error": {
    "code": "...",
    "message": "..."
  }
}
StatusBetekenisWat te doen
400Ongeldig verzoek, bijvoorbeeld een ontbrekend verplicht veld of een ontbrekende Idempotency-Key bij een order.Lees de message en verbeter je verzoek.
401Sleutel ontbreekt, is ongeldig of is ingetrokken.Controleer de Authorization-header en maak zo nodig een nieuwe sleutel.
403Je 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.
404Het product, de order of het endpoint bestaat niet (in jouw account).Controleer het id, de SKU of het ordernummer.
409Conflict, 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.
422Het 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.
429Te veel verzoeken: meer dan 120 per minuut voor deze sleutel.Wacht het aantal seconden uit Retry-After.
500Er 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.

Kom je er niet uit?

We helpen je graag verder, op werkdagen persoonlijk en meestal dezelfde dag.

Alle artikelen