L’API : commander depuis votre propre système
20 min de lectureMis à jour
La Reseller API relie directement votre boutique en ligne, votre ERP ou votre script à Printen.eu. Dans cet article, vous créez une clé, récupérez le catalogue, demandez un devis et passez votre première commande, d’abord dans le bac à sable puis en production. La référence complète se trouve sur la [page développeurs](page:developers).
Dans cet article
Comment créer et gérer une clé API ?
Chaque appel à l’API utilise une clé. Il en existe deux sortes : une clé live (commence par prk_live_) passe de vraies commandes, facturées et produites ; une clé de test (commence par prk_test_) fonctionne dans le bac à sable : les commandes sont créées, mais rien n’est facturé ni produit.
Ouvrez l’onglet
Dans votre tableau de bord, allez dans Clés API.
Nommez la clé
Saisissez un nom reconnaissable dans Nom de la clé, par exemple le nom de votre boutique ou de votre serveur. Vous saurez ainsi plus tard quelle clé est utilisée où.
Choisissez test ou live
Cochez Clé de test pour une clé de bac à sable (
prk_test_). Laissez la case vide pour une clé live (prk_live_). Choisissez ensuite sous Droits (scopes) ce que la clé peut faire ; si vous laissez tout coché, elle a tous les droits.Créez la clé
Cliquez sur Créer une clé. La clé complète s’affiche une seule fois, avec le message Copiez cette clé maintenant. Elle ne s’affichera qu’une fois.
Copiez-la et conservez-la
Cliquez sur Copier et placez aussitôt la clé en lieu sûr, par exemple dans une variable d’environnement sur votre serveur ou dans un gestionnaire de mots de passe. Ensuite, la liste n’affiche plus que le début de la clé et sa Dernière utilisation.
L’API gère des droits (scopes) par clé. Une clé sans scopes a tous les droits. Dans le tableau de bord, vous les choisissez sous Droits (scopes) en créant la clé. Si vous laissez tout coché, la clé obtient tous les droits, y compris ceux ajoutés plus tard. La liste indique les droits de chaque clé. Pour modifier les droits d’une clé, créez-en une nouvelle et révoquez l’ancienne.
| Scope | Ce que la clé peut faire |
|---|---|
catalog:read | Consulter le catalogue et les options produit (GET /products). |
quotes:write | Calculer des prix (POST /quotes). |
orders:read | Consulter les commandes et leur statut (GET /orders). |
orders:write | Passer et annuler des commandes (POST /orders, POST /orders/{id}/cancel). |
reseller-products:read | Consulter vos propres produits. |
reseller-products:write | Créer, modifier et supprimer vos propres produits. |
wallet:read | Consulter votre solde et vos mouvements (GET /wallet). |
webhooks:read | Consulter vos endpoints webhook. |
webhooks:write | Ajouter et supprimer des endpoints webhook. |
| Aucun scope | Tout ce qui précède. |
Base URL, authentification et limites
- Base URL :
https://www.printen.eu/api/reseller/v1. Tous les chemins de cet article sont relatifs à cette adresse. - Authentification : envoyez l’en-tête
Authorization: Bearer prk_live_...ouAuthorization: Bearer prk_test_...avec chaque requête. - Format : requêtes et réponses sont en JSON. Une réponse réussie est toujours placée dans un champ
data; les listes contiennent en plusnextCursorpour récupérer la page suivante. - Montants : toujours en centimes d’euro.
2873signifie donc 28,73 €. - Limite : au maximum 120 requêtes par minute et par clé. Les devis (
POST /quotes) et les nouvelles commandes ont en plus leur propre limite par compte, plus basse pour les nouveaux comptes. Chaque réponse contientRateLimit-Limit,RateLimit-RemainingetRateLimit-Reset(secondes) pour la limite atteinte en premier. Au-delà, vous recevez le statut 429 avec un en-têteRetry-After. - Spécification : la spécification OpenAPI complète se trouve sur https://www.printen.eu/reseller-api/openapi.json. Vous pouvez l’importer dans Postman, Insomnia ou un générateur de code.
Testez votre clé avec un appel simple, par exemple la consultation de votre solde. Si vous recevez du JSON avec data, votre clé fonctionne.
curl https://www.printen.eu/api/reseller/v1/wallet \
-H "Authorization: Bearer prk_test_..."Comment consulter le catalogue et les options ?
Avec GET /products, vous parcourez le catalogue. Utilisez q comme terme de recherche, category pour une catégorie, lang pour la langue des noms et des options (nl, en, de ou fr), et limit (100 au maximum) et cursor pour passer d’une page à l’autre.
curl "https://www.printen.eu/api/reseller/v1/products?q=poster&lang=nl&limit=5" \
-H "Authorization: Bearer prk_test_..."Avec l’id de cette liste, vous récupérez un produit avec toutes ses options et ses exigences de fichier.
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
}
}
}| Champ | Signification |
|---|---|
options | Les choix du produit. Utilisez key comme nom et une value de values comme valeur dans votre devis, votre commande ou votre propre produit. |
quantities | Les quantités commandables, si le produit a des quantités fixes. |
fileRequirements | Exigences de fichier : formats acceptés, résolution minimale (minDpi), profil colorimétrique, fond perdu en mm (bleedMm) et obligation ou non d’une URL de fichier en https. |
Votre premier devis : combien coûte une commande ?
Avec POST /quotes, vous calculez le prix d’une ou plusieurs lignes pour un pays de destination, remise, livraison et TVA comprises. Rien n’est commandé ni facturé. Une ligne contient un resellerSku (votre propre produit) ou un productId avec des options, plus une 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"
}
}| Champ | Signification |
|---|---|
lines[].retailNetCents | Le prix public normal de la ligne, hors TVA. |
lines[].netCents | Votre prix pour la ligne après remise, hors TVA. |
discountPercent | Votre pourcentage de remise actuel. |
subtotalNetCents | Toutes les lignes ensemble, hors TVA. |
shippingNetCents | Frais de livraison vers le pays indiqué, hors TVA. |
vatRate | Le taux de TVA qui vous est appliqué, par exemple 21 ou 0. |
vatTreatment | La façon dont la TVA a été déterminée, par exemple domestic-business (TVA néerlandaise) ou reverse-charge-eu-b2b (autoliquidation). |
vatCents | Le montant de TVA. |
totalCents | Le total débité de votre solde ou de votre carte lors d’une commande. |
Passer votre première commande (avec une Idempotency-Key)
Choisissez une clé unique
Choisissez une
Idempotency-Keyunique par commande, de préférence votre propre numéro de commande (par exempleshop-order-1001). Cet en-tête est obligatoire.Composez les lignes
Utilisez un
resellerSkuet unequantitypar ligne. Si votre produit n’a pas encore de visuel, envoyez aussi unefileUrl(https).Renseignez le destinataire
Obligatoires :
name,address1,postalCode,cityetcountry(ISO-2, par exemple FR). Facultatifs :company,email,phone,address2etstate.Ajoutez vos propres références
Avec
externalOrderIdetexternalOrderNumber, vous reliez la commande à votre système ; ils reviennent dans chaque webhook.referenceest votre propre référence.Envoyez la requête
Une nouvelle commande renvoie le statut 201. Vérifiez
statedans la réponse :SUBMITTEDsignifie payée et en route vers la production.
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
}
}Pourquoi une Idempotency-Key ? Les réseaux ne sont pas fiables : un délai dépassé ne veut pas dire que votre commande n’est pas arrivée. Une Idempotency-Key vous permet de répéter une requête sans risque. Si vous renvoyez la même clé, vous récupérez la commande existante avec "duplicate": true et le statut 200. Une deuxième commande n’est jamais créée.
{
"data": {
"id": "ORDER_ID",
"resellerOrderId": "RESELLER_ORDER_ID",
"orderNumber": "RS-3F9A1C7B2E",
"state": "SUBMITTED",
"totalCents": 2873,
"chargedCents": 0,
"duplicate": true,
"test": true
}
}- Utilisez une clé par commande, et toujours la même lorsque vous renvoyez cette commande.
- Une clé existante renvoie toujours la commande d’origine, même si le contenu de votre requête diffère. Si vous voulez vraiment une nouvelle commande, utilisez une nouvelle clé.
- Une clé compte au maximum 200 caractères (caractères ASCII visibles).
- Les clés live et les clés de test ont chacune leur propre espace. Une commande de test avec
shop-order-1001ne bloque donc pas une commande live avec la même clé.
Gérer vos propres produits via l’API
Un produit propre est un produit du catalogue avec des options fixes, votre SKU, votre fichier de visuel, un titre et, en option, votre prix de vente. Créez-en un avec POST /reseller-products ; ensuite, vous le commandez avec 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}'Avec PATCH /reseller-products/{id}, vous modifiez un produit existant. Vous pouvez utiliser le SKU à la place de l’id. N’envoyez que les champs à modifier, par exemple un nouveau fichier, un autre prix ou des images de mockup dans 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,skuettitlesont obligatoires à la création. Les montants commeretailPriceCentssont en centimes d’euro.- Un SKU doit être unique dans votre compte. S’il existe déjà, vous recevez 409.
- Si les options ne conviennent pas à ce produit, vous recevez 422.
- Avec
"active": false, vous rendez un produit inactif. Les commandes avec ce SKU sont alors refusées. - Avec
DELETE /reseller-products/{id}, vous supprimez un produit. S’il est encore lié à une boutique connectée, vous recevez 409.
Quels sont les statuts de commande, et que faire ?
Chaque commande a un state : le statut de votre côté (paiement et fichier). Dès que la commande est SUBMITTED, un statut de production suit dans status.
| state | Signification | Que faire |
|---|---|---|
AWAITING_FUNDS | Votre solde est insuffisant. Rien n’a été débité. | Rechargez. Si la recharge automatique est active, nous l’essayons d’abord. Après une recharge, la commande repart d’elle-même ; nous retentons aussi les commandes en attente toutes les 15 minutes. |
AWAITING_FILE | Une ligne n’a pas de fichier de visuel. Rien n’a été débité. | Annulez la commande et repassez-la avec une nouvelle Idempotency-Key, avec une fileUrl ou avec un produit qui a un fichier. |
PAYMENT_FAILED | Le paiement avec votre carte enregistrée a échoué. | Vérifiez votre carte ou enregistrez-en une autre dans Solde et paiement, puis cliquez sur Réessayer pour la commande. |
SUBMITTED | Payée et en route vers la production. | Rien. Suivez le statut de production et le suivi via les webhooks ou GET /orders/{id}. |
CANCELLED | La commande a été annulée et, le cas échéant, remboursée. | Rien. |
Le statut de production dans status va de PAID à SHIPPED puis DELIVERED, en passant par PROCESSING et PRINTING. À SHIPPED, vous trouvez le numéro et le lien de suivi dans tracking. Une commande annulée passe à CANCELLED ou 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_..."Comment annuler une commande ?
Avec POST /orders/{id}/cancel, vous annulez une commande tant qu’elle n’est pas partie en production. Pour {id}, vous pouvez utiliser l’id de la commande, le resellerOrderId ou le numéro de commande.
curl -X POST https://www.printen.eu/api/reseller/v1/orders/RS-3F9A1C7B2E/cancel \
-H "Authorization: Bearer prk_test_..."- Si cela fonctionne, vous récupérez la commande avec
stateCANCELLED. - Si la commande est déjà en production, vous recevez 409 : l’annulation n’est plus possible.
- Payée avec le solde : le montant revient sur votre solde et apparaît comme Remboursement dans Mouvements.
- Payée par carte : le montant est remboursé sur cette carte.
- Si rien n’a encore été débité (par exemple en
AWAITING_FUNDS), rien n’est remboursé non plus.
Comment tester en toute sécurité dans le bac à sable ?
Avec une clé de test (prk_test_), vous construisez et testez votre intégration sans risque. Vous utilisez la même base URL et les mêmes appels qu’en production.
| Dans le bac à sable | Ce qui se passe |
|---|---|
| Passer des commandes | Les commandes sont créées et passent aussitôt à SUBMITTED, avec "test": true. |
| Facturation | Rien n’est débité de votre solde ou de votre carte. |
| Production | Rien n’est imprimé ni expédié. |
| Webhooks | Vous recevez order.created et order.submitted, ainsi que order.cancelled si vous annulez la commande de test. Les événements de production comme order.shipped n’arrivent pas. |
| Idempotency-Key | Les clés de test ont leur propre espace de clés, séparé de la production. |
Testez tout avec prk_test_
Vérifiez les devis, les commandes, les requêtes répétées avec la même Idempotency-Key, les annulations et le traitement de vos webhooks.
Créez une clé live
Dans Clés API, créez une clé sans cocher Clé de test.
Remplacez la clé
Remplacez la clé
prk_test_par la cléprk_live_dans votre configuration. Rien d’autre ne change.Vérifiez votre mode de paiement
Assurez-vous d’avoir assez de solde ou une carte enregistrée dans Solde et paiement, sinon les commandes live restent en
AWAITING_FUNDSouPAYMENT_FAILED.
Que signifie un message d’erreur ?
Chaque erreur a la même forme : un objet error avec un code court et un message lisible. Regardez d’abord le statut HTTP ; le message vous dit généralement exactement ce qui ne va pas.
{
"error": {
"code": "...",
"message": "..."
}
}| Statut | Signification | Que faire |
|---|---|---|
| 400 | Requête invalide, par exemple un champ obligatoire manquant ou une Idempotency-Key absente lors d’une commande. | Lisez le message et corrigez votre requête. |
| 401 | La clé est absente, invalide ou révoquée. | Vérifiez l’en-tête Authorization et créez une nouvelle clé si nécessaire. |
| 403 | Votre compte n’est pas (ou plus) validé ou est suspendu, ou la clé n’a pas le bon scope. | Vérifiez votre compte dans le tableau de bord ou contactez-nous. |
| 404 | Le produit, la commande ou l’endpoint n’existe pas (dans votre compte). | Vérifiez l’id, le SKU ou le numéro de commande. |
| 409 | Conflit, par exemple : le SKU existe déjà, la commande est déjà en production et ne peut plus être annulée, le produit est encore lié à une boutique, ou vous avez déjà le nombre maximal d’endpoints webhook. | Lisez le message ; ne répétez pas la requête à l’identique. |
| 422 | La requête est bien formée mais ne peut pas être exécutée, par exemple un SKU inconnu ou des options qui ne correspondent pas au produit. | Vérifiez vos SKU et vos options. |
| 429 | Trop de requêtes : plus de 120 par minute pour cette clé. | Attendez le nombre de secondes indiqué dans Retry-After. |
| 500 | Un problème est survenu de notre côté. | Réessayez plus tard, avec la même Idempotency-Key pour les commandes. Si cela persiste, contactez-nous. |
Articles associés
- Webhooks : recevoir automatiquement les mises à jour de commandeRecevez les mises à jour de commande sur votre propre URL, vérifiez la signature, traitez les événements en sécurité et résolvez les problèmes de livraison.
- Créer des produits : du produit catalogue à votre propre SKUChoisissez un produit, fixez les options, téléversez votre visuel, choisissez un bon SKU, calculez votre marge et testez votre produit avec une commande.
- Suivre les commandes, les modifier et résoudre les problèmesSuivez vos commandes, comprenez chaque statut, passez une commande manuellement, annulez à temps et sachez réagir aux problèmes de paiement, d’adresse ou de dommages.
Besoin d’aide ?
Nous vous aidons volontiers, en personne les jours ouvrés et généralement le jour même.