Die API: aus Ihrem eigenen System bestellen
18 Min. LesezeitAktualisiert
Mit der Reseller API verbinden Sie Ihren eigenen Webshop, Ihr ERP oder ein Skript direkt mit Printen.eu. In diesem Artikel erstellen Sie einen Schlüssel, rufen den Katalog ab, fordern ein Angebot an und geben Ihre erste Bestellung auf, zuerst in der Sandbox und dann live. Die vollständige Referenz finden Sie auf der [Entwicklerseite](page:developers).
In diesem Artikel
Wie erstellen und verwalten Sie einen API-Schlüssel?
Jeder API-Aufruf nutzt einen Schlüssel. Es gibt zwei Arten: Ein Live-Schlüssel (beginnt mit prk_live_) erzeugt echte Bestellungen, die abgerechnet und produziert werden. Ein Testschlüssel (beginnt mit prk_test_) arbeitet in der Sandbox: Bestellungen werden angelegt, aber nichts wird abgerechnet oder produziert.
Registerkarte öffnen
Öffnen Sie in Ihrem Dashboard API-Schlüssel.
Schlüssel benennen
Geben Sie unter Name des Schlüssels einen erkennbaren Namen ein, zum Beispiel den Namen Ihres Shops oder Servers. So wissen Sie später, welcher Schlüssel wo verwendet wird.
Test oder live wählen
Setzen Sie das Häkchen bei Testschlüssel für einen Sandbox-Schlüssel (
prk_test_). Ohne Häkchen erhalten Sie einen Live-Schlüssel (prk_live_). Wählen Sie danach unter Berechtigungen (Scopes), was der Schlüssel darf; lassen Sie alles angehakt, hat er alle Rechte.Schlüssel erstellen
Klicken Sie auf Schlüssel erstellen. Der vollständige Schlüssel erscheint einmalig mit dem Hinweis Kopieren Sie diesen Schlüssel jetzt. Sie sehen ihn nur einmal.
Kopieren und aufbewahren
Klicken Sie auf Kopieren und legen Sie den Schlüssel sofort sicher ab, etwa als Umgebungsvariable auf Ihrem Server oder in einem Passwortmanager. Danach zeigt die Liste nur noch den Anfang des Schlüssels und wann er Zuletzt verwendet wurde.
Die API kennt Berechtigungen (Scopes) pro Schlüssel. Ein Schlüssel ohne Scopes hat alle Rechte. Im Dashboard wählen Sie sie beim Erstellen unter Berechtigungen (Scopes). Lassen Sie alles angehakt, erhält der Schlüssel alle Rechte, auch später hinzukommende. In der Liste sehen Sie die Berechtigungen jedes Schlüssels. Möchten Sie die Berechtigungen ändern, erstellen Sie einen neuen Schlüssel und widerrufen den alten.
| Scope | Was der Schlüssel darf |
|---|---|
catalog:read | Katalog und Produktoptionen abrufen (GET /products). |
quotes:write | Preise berechnen (POST /quotes). |
orders:read | Bestellungen und ihren Status abrufen (GET /orders). |
orders:write | Bestellungen aufgeben und stornieren (POST /orders, POST /orders/{id}/cancel). |
reseller-products:read | Ihre eigenen Produkte abrufen. |
reseller-products:write | Ihre eigenen Produkte anlegen, ändern und löschen. |
wallet:read | Guthaben und Buchungen abrufen (GET /wallet). |
webhooks:read | Ihre Webhook-Endpunkte abrufen. |
webhooks:write | Webhook-Endpunkte hinzufügen und löschen. |
| Keine Scopes | Alles oben Genannte. |
Base URL, Authentifizierung und Limits
- Base URL:
https://www.printen.eu/api/reseller/v1. Alle Pfade in diesem Artikel sind relativ dazu. - Authentifizierung: Senden Sie bei jeder Anfrage den Header
Authorization: Bearer prk_live_...oderAuthorization: Bearer prk_test_.... - Format: Anfragen und Antworten sind JSON. Eine erfolgreiche Antwort steht immer in einem Feld
data; Listen enthalten zusätzlichnextCursorfür die nächste Seite. - Beträge: immer in Eurocent.
2873bedeutet also 28,73 €. - Limit: höchstens 120 Anfragen pro Minute und Schlüssel. Angebote (
POST /quotes) und neue Bestellungen haben zusätzlich ein eigenes Limit pro Konto, das für neue Konten niedriger ist. Jede Antwort enthältRateLimit-Limit,RateLimit-RemainingundRateLimit-Reset(Sekunden) für das Limit, das zuerst erreicht wird. Darüber erhalten Sie Status 429 mit einemRetry-After-Header. - Spezifikation: Die vollständige OpenAPI-Spezifikation liegt unter https://www.printen.eu/reseller-api/openapi.json. Sie können sie in Postman, Insomnia oder einen Codegenerator importieren.
Testen Sie Ihren Schlüssel mit einem einfachen Aufruf, zum Beispiel der Guthabenabfrage. Erhalten Sie JSON mit data zurück, funktioniert Ihr Schlüssel.
curl https://www.printen.eu/api/reseller/v1/wallet \
-H "Authorization: Bearer prk_test_..."Wie rufen Sie Katalog und Optionen ab?
Mit GET /products durchsuchen Sie den Katalog. Nutzen Sie q als Suchbegriff, category für eine Kategorie, lang für die Sprache von Namen und Optionen (nl, en, de oder fr) sowie limit (höchstens 100) und cursor zum Blättern.
curl "https://www.printen.eu/api/reseller/v1/products?q=poster&lang=nl&limit=5" \
-H "Authorization: Bearer prk_test_..."Mit der id aus dieser Liste rufen Sie ein einzelnes Produkt mit allen Optionen und Dateianforderungen ab.
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
}
}
}| Feld | Bedeutung |
|---|---|
options | Die Auswahlmöglichkeiten des Produkts. Verwenden Sie key als Namen und einen value aus values als Wert in Ihrem Angebot, Ihrer Bestellung oder Ihrem eigenen Produkt. |
quantities | Die bestellbaren Mengen, falls das Produkt feste Mengen hat. |
fileRequirements | Dateianforderungen: erlaubte Formate, Mindestauflösung (minDpi), Farbprofil, Beschnitt in mm (bleedMm) und ob die Datei-URL https sein muss. |
Ihr erstes Angebot: was kostet eine Bestellung?
Mit POST /quotes berechnen Sie den Preis einer oder mehrerer Positionen für ein Zielland, inklusive Rabatt, Versand und Umsatzsteuer. Es wird nichts bestellt oder abgerechnet. Eine Position enthält eine resellerSku (Ihr eigenes Produkt) oder eine productId mit options, dazu eine 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"
}
}| Feld | Bedeutung |
|---|---|
lines[].retailNetCents | Der normale Verbraucherpreis der Position, ohne Umsatzsteuer. |
lines[].netCents | Ihr Preis für die Position nach Rabatt, ohne Umsatzsteuer. |
discountPercent | Ihr aktueller Rabatt in Prozent. |
subtotalNetCents | Alle Positionen zusammen, ohne Umsatzsteuer. |
shippingNetCents | Versandkosten in das angegebene Land, ohne Umsatzsteuer. |
vatRate | Der für Sie geltende Steuersatz, zum Beispiel 21 oder 0. |
vatTreatment | Wie die Umsatzsteuer bestimmt wurde, zum Beispiel domestic-business (niederländische Umsatzsteuer) oder reverse-charge-eu-b2b (Reverse-Charge). |
vatCents | Der Steuerbetrag. |
totalCents | Der Gesamtbetrag, der bei einer Bestellung von Guthaben oder Karte abgebucht wird. |
Ihre erste Bestellung aufgeben (mit Idempotency-Key)
Eindeutigen Schlüssel wählen
Wählen Sie pro Bestellung einen eindeutigen
Idempotency-Key, am besten Ihre eigene Bestellnummer (zum Beispielshop-order-1001). Dieser Header ist Pflicht.Positionen zusammenstellen
Verwenden Sie pro Position eine
resellerSkuund einequantity. Hat Ihr Produkt noch kein Design, senden Sie zusätzlich einefileUrl(https).Empfänger angeben
Pflicht sind
name,address1,postalCode,cityundcountry(ISO-2, zum Beispiel DE). Optional:company,email,phone,address2undstate.Eigene Referenzen ergänzen
Mit
externalOrderIdundexternalOrderNumberverknüpfen Sie die Bestellung mit Ihrem System; beide kommen in jedem Webhook zurück.referenceist Ihre eigene Referenz.Anfrage senden
Eine neue Bestellung liefert Status 201. Prüfen Sie
statein der Antwort:SUBMITTEDbedeutet bezahlt und auf dem Weg in die Produktion.
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
}
}Warum ein Idempotency-Key? Netzwerke sind unzuverlässig: Ein Timeout heißt nicht, dass Ihre Bestellung nicht angekommen ist. Mit einem Idempotency-Key können Sie eine Anfrage gefahrlos wiederholen. Senden Sie denselben Schlüssel erneut, erhalten Sie die bestehende Bestellung mit "duplicate": true und Status 200 zurück. Eine zweite Bestellung entsteht nie.
{
"data": {
"id": "ORDER_ID",
"resellerOrderId": "RESELLER_ORDER_ID",
"orderNumber": "RS-3F9A1C7B2E",
"state": "SUBMITTED",
"totalCents": 2873,
"chargedCents": 0,
"duplicate": true,
"test": true
}
}- Verwenden Sie einen Schlüssel pro Bestellung und immer denselben, wenn Sie diese Bestellung erneut senden.
- Ein bestehender Schlüssel liefert immer die ursprüngliche Bestellung zurück, auch wenn der Inhalt Ihrer Anfrage abweicht. Möchten Sie wirklich eine neue Bestellung, verwenden Sie einen neuen Schlüssel.
- Ein Schlüssel hat höchstens 200 Zeichen (sichtbare ASCII-Zeichen).
- Live- und Testschlüssel haben jeweils einen eigenen Bereich. Eine Testbestellung mit
shop-order-1001blockiert also keine Live-Bestellung mit demselben Schlüssel.
Eigene Produkte über die API verwalten
Ein eigenes Produkt ist ein Katalogprodukt mit festen Optionen, Ihrer SKU, Ihrer Designdatei, einem Titel und optional Ihrem Verkaufspreis. Mit POST /reseller-products legen Sie eines an; danach bestellen Sie es mit 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}'Mit PATCH /reseller-products/{id} ändern Sie ein bestehendes Produkt. Statt der id können Sie auch die SKU verwenden. Senden Sie nur die Felder, die Sie ändern möchten, zum Beispiel eine neue Datei, einen anderen Preis oder Mockup-Bilder 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,skuundtitlesind beim Anlegen Pflicht. Beträge wieretailPriceCentssind in Eurocent.- Eine SKU muss in Ihrem Konto eindeutig sein. Existiert sie bereits, erhalten Sie 409.
- Passen die Optionen nicht zu diesem Produkt, erhalten Sie 422.
- Mit
"active": falsesetzen Sie ein Produkt auf inaktiv. Bestellungen mit dieser SKU werden dann abgelehnt. - Mit
DELETE /reseller-products/{id}löschen Sie ein Produkt. Ist es noch mit einem verbundenen Shop verknüpft, erhalten Sie 409.
Welche Bestellstatus gibt es, und was ist zu tun?
Jede Bestellung hat einen state: den Status auf Ihrer Seite (Zahlung und Datei). Sobald die Bestellung SUBMITTED ist, folgt zusätzlich ein Produktionsstatus in status.
| state | Bedeutung | Was zu tun ist |
|---|---|---|
AWAITING_FUNDS | Ihr Guthaben reicht nicht. Es wurde nichts abgebucht. | Laden Sie auf. Ist die automatische Aufladung aktiv, versuchen wir das zuerst. Nach einer Aufladung läuft die Bestellung von selbst weiter; wartende Bestellungen versuchen wir außerdem alle 15 Minuten erneut. |
AWAITING_FILE | Eine Position hat keine Designdatei. Es wurde nichts abgebucht. | Stornieren Sie die Bestellung und geben Sie sie mit einem neuen Idempotency-Key erneut auf, mit einer fileUrl oder mit einem Produkt, das eine Datei hat. |
PAYMENT_FAILED | Die Zahlung mit Ihrer hinterlegten Karte ist fehlgeschlagen. | Prüfen Sie Ihre Karte oder hinterlegen Sie unter Guthaben & Zahlung eine andere und klicken Sie bei der Bestellung auf Erneut versuchen. |
SUBMITTED | Bezahlt und auf dem Weg in die Produktion. | Nichts. Verfolgen Sie Produktionsstatus und Sendungsverfolgung über Webhooks oder GET /orders/{id}. |
CANCELLED | Die Bestellung wurde storniert und gegebenenfalls erstattet. | Nichts. |
Der Produktionsstatus in status läuft von PAID über PROCESSING und PRINTING bis SHIPPED und DELIVERED. Bei SHIPPED finden Sie Sendungsnummer und Tracking-Link in tracking. Eine stornierte Bestellung erhält CANCELLED oder 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_..."Wie stornieren Sie eine Bestellung?
Mit POST /orders/{id}/cancel stornieren Sie eine Bestellung, solange sie noch nicht in die Produktion gegangen ist. Für {id} können Sie die Bestell-id, die resellerOrderId oder die Bestellnummer verwenden.
curl -X POST https://www.printen.eu/api/reseller/v1/orders/RS-3F9A1C7B2E/cancel \
-H "Authorization: Bearer prk_test_..."- Klappt es, erhalten Sie die Bestellung mit
stateCANCELLEDzurück. - Ist die Bestellung bereits in Produktion, erhalten Sie 409: Eine Stornierung ist dann nicht mehr möglich.
- Mit Guthaben bezahlt: Der Betrag geht zurück auf Ihr Guthaben und erscheint als Erstattung unter Buchungen.
- Mit Karte bezahlt: Der Betrag geht zurück auf diese Karte.
- Wurde noch nichts abgebucht (zum Beispiel bei
AWAITING_FUNDS), wird auch nichts erstattet.
Wie testen Sie sicher in der Sandbox?
Mit einem Testschlüssel (prk_test_) bauen und testen Sie Ihre Anbindung ohne Risiko. Sie verwenden dieselbe Base URL und dieselben Aufrufe wie live.
| In der Sandbox | Was passiert |
|---|---|
| Bestellungen aufgeben | Bestellungen werden angelegt und sofort SUBMITTED, mit "test": true. |
| Abrechnung | Es wird nichts von Ihrem Guthaben oder Ihrer Karte abgebucht. |
| Produktion | Es wird nichts gedruckt oder versandt. |
| Webhooks | Sie erhalten order.created und order.submitted, sowie order.cancelled, wenn Sie die Testbestellung stornieren. Produktions-Events wie order.shipped kommen nicht. |
| Idempotency-Key | Testschlüssel haben einen eigenen Schlüsselbereich, getrennt von live. |
Alles mit prk_test_ testen
Prüfen Sie Angebote, Bestellungen, wiederholte Anfragen mit demselben Idempotency-Key, Stornierungen und Ihre Webhook-Verarbeitung.
Live-Schlüssel erstellen
Erstellen Sie unter API-Schlüssel einen Schlüssel, ohne Testschlüssel anzuhaken.
Schlüssel austauschen
Ersetzen Sie in Ihrer Konfiguration den
prk_test_-Schlüssel durch denprk_live_-Schlüssel. Sonst ändert sich nichts.Zahlungsart prüfen
Sorgen Sie unter Guthaben & Zahlung für genug Guthaben oder eine hinterlegte Karte, sonst bleiben Live-Bestellungen auf
AWAITING_FUNDSoderPAYMENT_FAILEDstehen.
Was bedeutet eine Fehlermeldung?
Jeder Fehler hat dieselbe Form: ein error-Objekt mit einem kurzen code und einer lesbaren message. Achten Sie zuerst auf den HTTP-Status; die message sagt Ihnen meist genau, was nicht stimmt.
{
"error": {
"code": "...",
"message": "..."
}
}| Status | Bedeutung | Was zu tun ist |
|---|---|---|
| 400 | Ungültige Anfrage, zum Beispiel ein fehlendes Pflichtfeld oder ein fehlender Idempotency-Key bei einer Bestellung. | Lesen Sie die message und korrigieren Sie Ihre Anfrage. |
| 401 | Schlüssel fehlt, ist ungültig oder widerrufen. | Prüfen Sie den Authorization-Header und erstellen Sie bei Bedarf einen neuen Schlüssel. |
| 403 | Ihr Konto ist nicht (mehr) freigeschaltet oder gesperrt, oder dem Schlüssel fehlt der passende Scope. | Prüfen Sie Ihr Konto im Dashboard oder kontaktieren Sie uns. |
| 404 | Produkt, Bestellung oder Endpunkt existiert nicht (in Ihrem Konto). | Prüfen Sie id, SKU oder Bestellnummer. |
| 409 | Konflikt, zum Beispiel: Die SKU existiert bereits, die Bestellung ist schon in Produktion und kann nicht mehr storniert werden, das Produkt ist noch mit einem Shop verknüpft, oder Sie haben bereits die maximale Anzahl an Webhook-Endpunkten. | Lesen Sie die message; wiederholen Sie die Anfrage nicht unverändert. |
| 422 | Die Anfrage ist korrekt aufgebaut, kann aber nicht ausgeführt werden, zum Beispiel eine unbekannte SKU oder Optionen, die nicht zum Produkt passen. | Prüfen Sie Ihre SKUs und Optionen. |
| 429 | Zu viele Anfragen: mehr als 120 pro Minute für diesen Schlüssel. | Warten Sie die Sekunden aus Retry-After ab. |
| 500 | Bei uns ist etwas schiefgelaufen. | Versuchen Sie es später erneut, bei Bestellungen mit demselben Idempotency-Key. Tritt der Fehler weiter auf, kontaktieren Sie uns. |
Verwandte Artikel
- Webhooks: Bestellupdates automatisch empfangenEmpfangen Sie Bestellupdates auf Ihrer eigenen URL, prüfen Sie die Signatur, verarbeiten Sie Events sicher und beheben Sie Zustellprobleme.
- Produkte anlegen: vom Katalogprodukt zur eigenen SKUWählen Sie ein Produkt, legen Sie die Optionen fest, laden Sie Ihr Design hoch, wählen Sie eine gute SKU, berechnen Sie Ihre Marge und testen Sie mit einer Bestellung.
- Bestellungen verfolgen, ändern und Probleme lösenVerfolgen Sie Ihre Bestellungen, verstehen Sie jeden Status, bestellen Sie manuell, stornieren Sie rechtzeitig und lösen Sie Zahlungs-, Adress- oder Schadensfälle.
Kommen Sie nicht weiter?
Wir helfen Ihnen gern, an Werktagen persönlich und meist noch am selben Tag.