DÉVELOPPEURS · Référence de l'API d'intégration

Référence de l’API Fabrixa Integration

38 min de lecture Dernière mise à jour : 06-11-2026 119 vues

L’API Integration vous aide à créer et gérer des commandes Fabrixa, lancer Fabrixa Studio et rester synchronisé avec la production et le fulfilment via des webhooks. L’API suit les conventions REST et utilise JSON pour tous les corps de requête et de réponse.

URL DE BASE

https://api.fabrixa.com/v2/integration

Envoyez toutes les requêtes vers cette URL de base, suivie du chemin endpoint spécifique. Cette URL sert de base pour interagir avec l’API Fabrixa : récupérer, créer, mettre à jour ou supprimer des ressources.

AVANT VOTRE PREMIÈRE DEMANDE

Authentification

Pour accéder à l’API Integration, authentifiez vos requêtes avec un Application Access Token et une Application Key :

En-tête d'autorisation
Authorization: Bearer APPLICATION_ACCESS_TOKEN
En-tête de clé d'application
X-Application-Key: APPLICATION_KEY
Exemple de commande cURL
curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/ping' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Remplacez APPLICATION_ACCESS_TOKEN par votre jeton d'accès réel et APPLICATION_KEY par votre clé d'application réelle.

COMMENT LES RÉPONSES SONT STRUCTURÉES

Points de terminaison et requêtes

Les endpoints de l’API Integration sont organisés par type de ressource et suivent l’architecture REST. Chaque endpoint représente une ressource, et les actions sont effectuées avec des méthodes HTTP standard.

Toutes les requêtes et réponses de l’API Integration utilisent JSON, ce qui fournit une interface cohérente et simple.

Pour plus de détails sur chaque point de terminaison, y compris des exemples de requêtes et de réponses, consultez notre Swagger documentation.

Format de réponse

Tous les points de terminaison renvoient des données dans un format standardisé avec ces objets :

{
  "links": {
    "self": "https://api.fabrixa.com/v2/integration/products",
    "first_page": "https://api.fabrixa.com/v2/integration/products?page=1",
    "last_page": "https://api.fabrixa.com/v2/integration/products?page=2",
    "next_page": "https://api.fabrixa.com/v2/integration/products?page=2",
    "prev_page": null
  },
  "meta": {
    "total": 2,
    "current_page": 1,
    "per_page": 10
  },
  "data": [
    {
      "id": 1,
      "name": "Product 1",
      "description": "Description of Product 1"
    },
    {
      "id": 2,
      "name": "Product 2",
      "description": "Description of Product 2"
    }
  ]
}

Description des objets de réponse

links

Contient des liens de pagination pour naviguer dans les résultats.

  • self — l'URL de la page actuelle.
  • first_page — l'URL de la première page de résultats.
  • last_page — l'URL de la dernière page de résultats.
  • next_page — l'URL de la page suivante. null s’il n’y a pas de page suivante.
  • prev_page — l'URL de la page précédente. null s’il n’y a pas de page précédente.

meta

Contient des métadonnées sur la réponse, telles que des informations de pagination.

  • total — le nombre total d’éléments disponibles sur toutes les pages.
  • current_page — le numéro de page actuel des résultats.
  • per_page — le nombre d'éléments par page.

data

Le contenu principal de la réponse. data varie selon le point de terminaison : il peut s'agir d'un objet unique, par exemple un produit, ou d'un tableau d'objets, par exemple une liste de produits.

QUAND QUELQUE CHOSE NE VA PAS

Erreurs et codes de statut

Toutes les requêtes API renvoient des codes d'état HTTP qui fournissent un aperçu de la réponse.

400 Bad Request

Le serveur ne peut pas traiter la demande en raison d'erreurs de validation - paramètres manquants ou invalides.

401 Unauthorized

Le client n'a pas fourni d'informations d'authentification valides. Également renvoyé lorsque le jeton d'accès a été révoqué.

403 Forbidden

Le serveur a refusé la demande en raison de droits d'accès insuffisants, généralement causés par des autorisations d'accès incorrectes ou manquantes.

404 Not Found

La ressource demandée est introuvable sur le serveur.

412 Precondition Failed

La requête ne peut pas être appliquée dans l’état actuel de la ressource, par exemple une commande qui ne peut plus être annulée.

429 Too Many Requests

Le client a dépassé le nombre autorisé de demandes dans un délai donné. Voir Rate Limits.

5xx Errors

Une erreur de serveur interne s'est produite. Veuillez contacter le support Fabrixa avec les détails de la demande ayant échoué.

Corps de la réponse d'erreur

Un exemple de corps de réponse d'erreur :

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/ping"
    },
    "meta": [],
    "errors": {
        "messages": [
            "Application Key is not specified."
        ]
    }
}

errors contient des détails sur ce qui a échoué. Le tableau messages répertorie les descriptions d'erreurs. Pour une mauvaise demande, vous recevrez les noms des champs dont la validation a échoué.

CONNAISSEZ LES LIMITES DE VOS DEMANDES

Limites de débit

L'API d'intégration prend en charge une limite de 30 requêtes par application et par minute.

Si vous dépassez cette limite, vous recevrez une réponse 429 Too Many Requests.

Toutes les réponses de l'API d'intégration incluent l'en-tête X-RateLimit-Remaining, le nombre de requêtes que le client peut encore effectuer, et l'en-tête X-RateLimit-Limit, le total autorisé par minute.

TESTEZ AVANT DE PASSER EN LIGNE

Mode bac à sable

Le mode bac à sable vous permet de tester votre intégration de bout en bout avant qu’une commande réelle ne soit produite ou facturée. Il s’applique à l’ensemble de votre compte : les commandes de tous les canaux de vente, y compris l’Integration API et les boutiques Shopify et WooCommerce connectées, ne sont ni produites ni débitées de votre solde. Votre compte est en mode bac à sable tant que son statut est en attente d’activation.

En mode bac à sable, vous pouvez :

Pour tester des commandes, ajoutez des produits du catalogue Fabrixa : ouvrez un produit, cliquez sur Vendre ce produit et choisissez des variantes et des designs. Ils apparaissent ensuite sous Mes produits.

Pour passer votre compte en mode bac à sable, ouvrez Platform, allez dans Paramètres → Entreprise → Mode bac à sable et cliquez sur Passer en mode bac à sable. Vous pouvez aussi l’activer lors de l’ajout d’un nouveau canal de vente, y compris un canal Integration API, ou écrire à support@fabrixa.com et nous passerons votre compte en mode bac à sable pour vous. Le mode bac à sable est réservé aux comptes actifs.

Lorsque vous êtes prêt, activez vous-même votre compte dans Platform sous Paramètres → Entreprise → Mode bac à sable. Vous pouvez aussi écrire à support@fabrixa.com et nous l’activerons pour vous. Vos boutiques connectées et vos identifiants API continuent de fonctionner : rien n’est à reconfigurer.

Une fois le compte activé, toutes les nouvelles commandes partent en production et sont débitées de votre solde. Les commandes créées avant l’activation restent des commandes de test : elles ne sont jamais produites ni facturées, même après l’activation.

TROUVEZ QUOI VENDRE

Produits

Le catalogue est tout ce que Fabrixa produit. Vos produits sont les produits du catalogue que vous avez ajoutés à votre compte Fabrixa, avec vos propres noms, descriptions, images et SKU. Une ligne de commande nomme une variante de produit - une taille ou une version d'un produit - par son sku ou son variant_id : une variante de l'un de vos produits, ou une variante du catalogue commandée directement.

CE QUE FABRIXA PRODUIT

Parcourir le catalogue

Pour lister les produits que Fabrixa produit, envoyez une requête GET à https://api.fabrixa.com/v2/integration/catalog/products avec vos identifiants. Il liste les produits actifs qui ont une variante qu'un partenaire d'impression produit actuellement, et seulement ces variantes, chacune avec son SKU, son prix de vente, ses dimensions et ses valeurs d'option.

Paramètres de requête

  • page et limit (jusqu'à 100) - paginent la liste. Sans eux, tout le catalogue est renvoyé en une seule réponse.
  • search - les produits dont le nom contient le texte, ou dont le slug ou le SKU d'une variante commence par lui.
  • category_id - les produits d'une catégorie ; parent_category_id - les produits de toutes les sous-catégories d'une catégorie de premier niveau. Voir Catégories du catalogue.
  • group_id - les produits d'un groupe du catalogue.
  • sort_by - name, created, updated, type, popular ou sold, dans l'ordre sort_order asc ou desc. Par défaut, les produits les plus récents viennent en premier.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/catalog/products?category_id=19&limit=10' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/catalog/products",
        "first_page": "https://api.fabrixa.com/v2/integration/catalog/products?page=1",
        "last_page": "https://api.fabrixa.com/v2/integration/catalog/products?page=1",
        "next_page": null,
        "prev_page": null
    },
    "meta": {
        "total": 1,
        "current_page": 1,
        "per_page": 10
    },
    "data": [
        {
            "id": 1305,
            "name": "Duvet Cover",
            "subtitle": "Duvet Cover with a pillow",
            "description": "

Soft personalized duvet cover.

", "slug": "duvet-cover", "code": "DUVET-001", "HS_code": "63023100", "created_at": "2024-08-16T09:32:07.000000Z", "updated_at": "2024-08-16T09:38:50.000000Z", "is_sellable": true, "variants_min_selling_price": "29.95", "variants_max_selling_price": "49.95", "type": { "id": 5, "name": "Duvet cover" }, "status": { "id": 2, "name": "Active" }, "categories": [ { "id": 19, "name": "Duvet covers", "description": "Personalized duvet covers", "parent_category": { "id": 8, "name": "Bedroom", "description": "Bedroom products" } } ], "images": [ { "id": 5566, "url": "https://storage.googleapis.com/example/catalog/duvet-cover.jpg", "is_main": true, "created_at": "2024-08-16T09:32:07.000000Z", "screen_type_size": "large", "sort_number": 1 } ], "variants": [ { "id": 2705, "name": "Duvet Cover", "subtitle": "140x200", "description": null, "SKU": "COT864311", "selling_price": "29.95", "width": "140.00", "height": "200.00", "length": "2.00", "weight": "1.20", "created_at": "2024-08-06T11:23:44.000000Z", "updated_at": "2024-08-16T09:36:37.000000Z", "options": [ { "id": 151, "name": "Duvet Size", "values": [ { "id": 471, "value": "140x200" } ] } ] }, { "id": 2708, "name": "Duvet Cover", "subtitle": "200x220", "description": null, "SKU": "COT864314", "selling_price": "49.95", "width": "200.00", "height": "220.00", "length": "2.00", "weight": "1.80", "created_at": "2024-08-06T11:23:44.000000Z", "updated_at": "2024-08-16T09:37:11.000000Z", "options": [ { "id": 151, "name": "Duvet Size", "values": [ { "id": 474, "value": "200x220" } ] } ] } ] } ] }

Champs de la réponse

  • id, name, subtitle, description (HTML), slug, code et HS_code, le code tarifaire douanier.
  • is_sellable - si le produit est ouvert à la vente. Un produit fermé reste listé, mais une commande pour l'une de ses variantes est refusée.
  • variants_min_selling_price et variants_max_selling_price - la fourchette de prix des variantes listées.
  • type - le type de produit, qui fixe les couches d'impression et l'ordre des pages du PDF ; status - toujours Active dans le catalogue.
  • categories - les catégories dans lesquelles se trouve le produit, chacune avec sa parent_category.
  • images - les images du produit, avec url, is_main, screen_type_size et sort_number.
  • variants - les versions commandables du produit : id, name, subtitle, SKU, selling_price, les dimensions width, height, length et weight, et options, les valeurs d'option qui définissent cette variante, par exemple sa taille.
REPÉREZ-VOUS DANS LE CATALOGUE

Catégories du catalogue

Pour lister les catégories dans lesquelles le catalogue est organisé, envoyez une requête GET à https://api.fabrixa.com/v2/integration/catalog/categories avec vos identifiants. La réponse contient les catégories de premier niveau, chacune avec ses sous-catégories imbriquées dans sub_categories et le nombre de produits du catalogue qu'elle contient dans products_count. Passez l'id d'une catégorie comme category_id en parcourant le catalogue, ou l'id d'une catégorie de premier niveau comme parent_category_id pour obtenir d'un coup les produits de toutes ses sous-catégories.

Paramètres de requête

  • page et limit (jusqu'à 100) - paginent la liste. Sans eux, toutes les catégories sont renvoyées.
  • search - les catégories dont le nom contient le texte.
  • with_products_only - true écarte les catégories qui ne contiennent aucun produit du catalogue, ni directement ni dans une sous-catégorie.
  • sort_by - category_name ou category_created, dans l'ordre sort_order asc ou desc. Par défaut, les catégories viennent dans leur ordre du catalogue.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/catalog/categories?with_products_only=true' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/catalog/categories"
    },
    "meta": {
        "total": 1
    },
    "data": [
        {
            "id": 8,
            "name": "Bedroom",
            "description": "Bedroom products",
            "sort_number": 1,
            "slug": "bedroom",
            "products_count": 12,
            "sub_categories": [
                {
                    "id": 19,
                    "name": "Duvet covers",
                    "description": "Personalized duvet covers",
                    "sort_number": 1,
                    "slug": "duvet-covers",
                    "products_count": 7,
                    "images": [],
                    "sub_categories": []
                },
                {
                    "id": 20,
                    "name": "Pillows",
                    "description": "Personalized pillows and pillowcases",
                    "sort_number": 2,
                    "slug": "pillows",
                    "products_count": 4,
                    "images": [],
                    "sub_categories": []
                }
            ],
            "parent_category": null,
            "images": [
                {
                    "id": 781,
                    "url": "https://storage.googleapis.com/example/catalog/bedroom.jpg",
                    "is_main": true,
                    "created_at": "2024-08-16T09:32:07.000000Z",
                    "screen_type_size": "large",
                    "sort_number": 1
                }
            ]
        }
    ]
}
VOTRE COMPTE

Vos produits

Pour lister les produits de votre compte, envoyez une requête GET à https://api.fabrixa.com/v2/integration/products avec vos identifiants. Vos produits sont les produits du catalogue que vous avez ajoutés à votre compte Fabrixa : ils portent les noms, descriptions et images que vous leur avez donnés là-bas, et leurs variantes les valeurs de SKU que vous avez choisies. Seuls les produits actifs sont listés, dix par page sauf si vous passez limit.

Paramètres de requête

  • page et limit (jusqu'à 100) - la page à renvoyer et sa taille ; par défaut la première page de dix.
  • search - les produits dont le nom contient le texte, ou dont le slug ou le SKU d'une variante commence par lui.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/products?search=duvet' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/products",
        "first_page": "https://api.fabrixa.com/v2/integration/products?page=1",
        "last_page": "https://api.fabrixa.com/v2/integration/products?page=1",
        "next_page": null,
        "prev_page": null
    },
    "meta": {
        "total": 1,
        "current_page": 1,
        "per_page": 10
    },
    "data": [
        {
            "id": 5321,
            "name": "Dreamy Duvet Cover",
            "subtitle": "Duvet cover with a matching pillowcase",
            "description": "

Our personalized duvet cover, printed on soft cotton sateen.

", "slug": "dreamy-duvet-cover", "width": "50.00", "height": "50.00", "length": "20.00", "weight": "100.00", "created_at": "2025-03-04T10:12:40.000000Z", "updated_at": "2025-03-04T10:15:02.000000Z", "type": { "id": 5, "name": "Duvet cover", "description": "Duvet cover with pillow" }, "available_options": [ { "id": 151, "name": "Duvet Size", "values": [ { "id": 471, "value": "140x200" }, { "id": 474, "value": "200x220" } ] } ], "categories": [ { "id": 912, "name": "Bedding" } ], "collections": [ { "id": 77, "name": "Spring 2025" } ], "images": [ { "id": 48120, "is_main": true, "image_size": "1200x1200", "url": "https://storage.googleapis.com/example/shop/dreamy-duvet-cover.jpg", "screen_type_size": "large", "sort_number": 1 } ], "variants": [ { "id": 32323, "name": "Dreamy Duvet Cover", "subtitle": "140x200", "description": null, "SKU": "DDC-140200", "created_at": "2025-03-04T10:12:41.000000Z", "updated_at": "2025-03-04T10:12:41.000000Z", "options": [ { "id": 151, "name": "Duvet Size", "values": [ { "id": 471, "value": "140x200" } ] } ], "images": [], "available_source_types": ["duvet", "pillow", "pillow-back"], "required_source_types": ["duvet", "pillow"] }, { "id": 32326, "name": "Dreamy Duvet Cover", "subtitle": "200x220", "description": null, "SKU": "DDC-200220", "created_at": "2025-03-04T10:12:41.000000Z", "updated_at": "2025-03-04T10:12:41.000000Z", "options": [ { "id": 151, "name": "Duvet Size", "values": [ { "id": 474, "value": "200x220" } ] } ], "images": [], "available_source_types": ["duvet", "pillow", "pillow-back"], "required_source_types": ["duvet", "pillow"] } ] } ] }

Pour lire un seul produit, envoyez une requête GET à https://api.fabrixa.com/v2/integration/products/{product_id}, où {product_id} est son id. La réponse contient les mêmes champs que la liste. Un produit qui n'est pas dans votre compte, même un produit du catalogue, répond 404 Not Found avec le message Product not found.

Champs de la réponse

  • id, name, subtitle, description (HTML), slug, width, height, length et weight.
  • type - le type de produit, qui fixe les couches d'impression et l'ordre des pages du PDF.
  • available_options - chaque option du produit avec toutes ses valeurs, par exemple chaque taille dans laquelle il existe ; chaque variante prend une valeur par option.
  • categories et collections - les catégories et collections dans lesquelles vous avez classé le produit dans votre compte.
  • images - les images du produit, avec url, is_main, image_size, screen_type_size et sort_number.
  • variants - les versions commandables du produit, voir Variantes de produit : id, name, subtitle, SKU, options, images, et les couches d'impression dans available_source_types et required_source_types.
CE QUE NOMME UNE LIGNE DE COMMANDE

Variantes de produit

Une variante est une version commandable d'un produit - une taille, une couleur - et ce que nomme une ligne de commande, par sku ou par variant_id. Pour lire une variante de l'un de vos produits, envoyez une requête GET à https://api.fabrixa.com/v2/integration/variants/{variant_id}, où {variant_id} est son id. Une variante d'un produit qui n'est pas dans votre compte répond 404 Not Found avec le message Variant not found.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/variants/32323' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/variants/32323"
    },
    "meta": [],
    "data": {
        "id": 32323,
        "name": "Dreamy Duvet Cover",
        "subtitle": "140x200",
        "description": null,
        "SKU": "DDC-140200",
        "created_at": "2025-03-04T10:12:41.000000Z",
        "updated_at": "2025-03-04T10:12:41.000000Z",
        "width": "140.00",
        "height": "200.00",
        "length": "2.00",
        "weight": "1.20",
        "options": [
            {
                "id": 151,
                "name": "Duvet Size",
                "values": [
                    {
                        "id": 471,
                        "value": "140x200"
                    }
                ]
            }
        ],
        "images": [],
        "product": {
            "id": 5321,
            "name": "Dreamy Duvet Cover",
            "subtitle": "Duvet cover with a matching pillowcase",
            "description": "

Our personalized duvet cover, printed on soft cotton sateen.

", "description2": null, "slug": "dreamy-duvet-cover", "created_at": "2025-03-04T10:12:40.000000Z", "updated_at": "2025-03-04T10:15:02.000000Z" }, "available_source_types": ["duvet", "pillow", "pillow-back"], "required_source_types": ["duvet", "pillow"] } }

Champs de la réponse

  • id, name, subtitle, description, SKU, width, height, length, weight, options, images, et le product auquel la variante appartient.
  • available_source_types - les couches d'impression de la variante, nommées comme son processus de production les connaît. En plus de "file", que toute variante accepte pour un PDF, ce sont les valeurs que peut prendre le type d'un fichier source ; un produit à une seule couche d'impression liste "print".
  • required_source_types - les couches qu'un fichier d'impression doit couvrir. Un PDF envoyé comme "file" les couvre avec ses pages, dans l'ordre des pages du type de produit. Sinon, la ligne a besoin d'un fichier JPEG, PNG ou TIFF pour chacune d'elles, avec le nom de la couche comme type ; une ligne où il en manque une est refusée avec 400 Bad Request et les noms des couches manquantes.

Une ligne de commande pour cette variante, avec un PDF dont les pages sont ses couches :

"rows": [
    {
        "sku": "DDC-140200",
        "quantity": 1,
        "sources": [
            {
                "type": "file",
                "url": "https://samples-files.com/samples/duvet-cover.pdf"
            }
        ]
    }
]

Quelles variantes peuvent être commandées

  • Une ligne de commande peut nommer une variante d'un produit de votre compte, ou directement une variante du catalogue, jamais un produit d'un autre client. La variante est retrouvée par son variant_id, ou par son sku quelle que soit la casse des lettres.
  • La variante doit être active, et son produit actif et ouvert à la vente. Pour votre copie d'un produit du catalogue, le produit du catalogue doit aussi être actif et la variante du catalogue activée.
  • Sinon, la commande est refusée avec 400 Bad Request et la raison, pour la ligne concernée : The variant not found., The product is not active., The catalog product is not active., The product is not open for sales., The variant is not active. ou The catalog variant is not active.
CRÉER ET SUIVRE LES COMMANDES

Ordres

Créez des commandes dans Fabrixa depuis votre boutique ou plateforme, joignez les fichiers d’impression requis et suivez chaque article pendant le fulfilment.

PRÉPAREZ VOS DONNÉES DE COMMANDE

Créer une commande

Pour créer une commande via l’API Fabrixa Integration, envoyez une requête POST vers https://api.fabrixa.com/v2/integration/orders. Le body de la requête doit contenir :

Structure du corps de la demande

  • number (facultatif) - le numéro de commande. S'il n'est pas fourni, un numéro unique est généré.
  • comments (facultatif) - tout commentaire ou note supplémentaire lié à la commande.
  • purchased_at - date et heure d'achat de la commande, au format YYYY-MM-DD HH:MM:SS.
  • client_ip (facultatif) - l'adresse IP du client.
  • client_user_agent (facultatif) - le chaîne d'agent utilisateur du client.
  • rows - tableau d'articles de commande, chacun contenant :
    • sku - le SKU de la variante du produit. Voir Swagger pour plus de détails.
    • quantity - quantité de la variante de produit commandée.
    • client_barcode (facultatif) - identifiant unique côté client par ligne de commande, au format Code 128.
    • cart_item_key (obligatoire sans sources) - identifiant unique de l'intégration de la plateforme Fabrixa Studio, utilisé pour associer les personnalisations enregistrées à la commande.
    • sources (obligatoire sans cart_item_key) - tableau de fichiers sources associés au produit, chacun contenant :
      • type - "file" pour un PDF, ou "print" pour un fichier JPEG, PNG ou TIFF.
      • url - URL de la source fichier.
  • customer - détails du client :
    • first_name, last_name, email, phone.
  • shipping_address - détails d'expédition :
    • address, address2 (en option), address3 (en option).
    • city, country_code (ISO 3166-2), country, postal_code, state (en option).
    • first_name, last_name, phone (facultatif), company (facultatif).
  • shipping_label (facultatif) - détails de l'étiquette :
    • method_name - par ex. "Post NL".
    • tracking_number, tracking_url, label_pdf_url.
    • date_created - formaté en YYYY-MM-DD HH:MM:SS.

Demande d'échantillon

{
  "number": "NL2024010201",
  "comments": "Customer agrees with a low resolution file.",
  "purchased_at": "2024-06-26 21:12:22",
  "client_ip": "127.0.0.1",
  "client_user_agent": "Mozilla",
  "rows": [
    {
      "variant_id": 2705,
      "quantity": 1,
      "client_barcode": "1234567890",
      "sources": [
        {
          "type": "file",
          "url": "https://samples-files.com/samples/sample.pdf"
        }
      ]
    }
  ],
  "customer": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "3VJtP@example.com",
    "phone": "0612345678"
  },
  "shipping_address": {
    "address": "Voorbeeldstraat",
    "address2": "17",
    "city": "Amsterdam",
    "country_code": "NL",
    "country": "Netherlands",
    "postal_code": "1012 AB",
    "state": "North Holland",
    "first_name": "John",
    "last_name": "Doe",
    "phone": "0612345678"
  },
  "shipping_label": {
    "method_name": "Post NL",
    "tracking_number": "3SABCD1234567",
    "tracking_url": "https://postnl.nl/tracktrace/3SABCD1234567",
    "label_pdf_url": "https://api.fabrixa.com/storage/8966630826422f36d822f91680012141.pdf",
    "date_created": "2024-01-01 00:00:00"
  }
}

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders"
    },
    "meta": [],
    "data": {
        "id": 20338,
        "number": "NL2024010201",
        "comments": "Customer agrees with a low resolution file.",
        "is_archived": false,
        "status": "imported",
        "fulfillment_status": "unfulfilled",
        "purchased_at": "2024-06-26T21:12:22.000000Z",
        "created_at": "2024-06-26T21:15:03.000000Z",
        "updated_at": "2024-06-26T21:15:04.000000Z",
        "rows": [
            {
                "id": 41600,
                "quantity": 1,
                "client_barcode": "1234567890",
                "fulfillment_status": "unfulfilled",
                "variant": {
                    "id": 2705,
                    "name": "Duvet Cover",
                    "subtitle": "140x200",
                    "SKU": "COT864311",
                    "product": {
                        "id": 1305,
                        "name": "Duvet Cover",
                        "subtitle": "Duvet Cover with a pillow"
                    }
                },
                "sources": [
                    {
                        "type": "file",
                        "url": "https://samples-files.com/samples/sample.pdf",
                        "properties": null
                    }
                ]
            }
        ],
        "shipments": [],
        "customer": {
            "email": "3VJtP@example.com",
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678"
        },
        "shipping_address": {
            "address": "Voorbeeldstraat",
            "address2": "17",
            "address3": null,
            "city": "Amsterdam",
            "country": "Netherlands",
            "country_code": "NL",
            "company": null,
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678",
            "state": "North Holland",
            "postal_code": "1012 AB"
        }
    }
}
MODIFIEZ LES DONNÉES DE LA COMMANDE

Mettre à jour une commande

Pour mettre à jour une commande, envoyez une requête PATCH vers https://api.fabrixa.com/v2/integration/orders/{order_id}, où {order_id} est l’identifiant Fabrixa de la commande. Seuls les champs envoyés sont modifiés, et le statut de la commande reste inchangé. La réponse contient la commande mise à jour. Vous pouvez modifier :

  • number, comments, purchased_at, client_ip, client_user_agent.
  • customer - first_name, last_name, email, phone.
  • shipping_address - les mêmes champs que lors de la création d’une commande.

Demande d'échantillon

{
  "comments": "Deliver to the neighbours if nobody is home.",
  "shipping_address": {
    "address": "Voorbeeldstraat",
    "address2": "19",
    "city": "Amsterdam",
    "country_code": "NL",
    "country": "Netherlands",
    "postal_code": "1012 AB",
    "first_name": "John",
    "last_name": "Doe",
    "phone": "0612345678"
  }
}

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338"
    },
    "meta": [],
    "data": {
        "id": 20338,
        "number": "NL2024010201",
        "comments": "Deliver to the neighbours if nobody is home.",
        "is_archived": false,
        "status": "imported",
        "fulfillment_status": "unfulfilled",
        "purchased_at": "2024-06-26T21:12:22.000000Z",
        "created_at": "2024-06-26T21:15:03.000000Z",
        "updated_at": "2024-06-27T09:41:18.000000Z",
        "rows": [
            {
                "id": 41600,
                "quantity": 1,
                "client_barcode": "1234567890",
                "fulfillment_status": "unfulfilled",
                "variant": {
                    "id": 2705,
                    "name": "Duvet Cover",
                    "subtitle": "140x200",
                    "SKU": "COT864311",
                    "product": {
                        "id": 1305,
                        "name": "Duvet Cover",
                        "subtitle": "Duvet Cover with a pillow"
                    }
                },
                "sources": [
                    {
                        "type": "file",
                        "url": "https://samples-files.com/samples/sample.pdf",
                        "properties": null
                    }
                ]
            }
        ],
        "shipments": [],
        "customer": {
            "email": "3VJtP@example.com",
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678"
        },
        "shipping_address": {
            "address": "Voorbeeldstraat",
            "address2": "19",
            "address3": null,
            "city": "Amsterdam",
            "country": "Netherlands",
            "country_code": "NL",
            "company": null,
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678",
            "state": "North Holland",
            "postal_code": "1012 AB"
        }
    }
}
  • Les lignes de la commande ne peuvent pas être modifiées : une requête contenant rows est rejetée avec 400 Bad Request. Pour modifier les articles, annulez la commande et créez-en une nouvelle.
  • Une commande au statut on hold ne peut pas être mise à jour ; l’API répond 412 Precondition Failed.
{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338"
    },
    "meta": [],
    "errors": {
        "rows": [
            "Order rows cannot be changed. Cancel the order and create a new one."
        ]
    }
}
ARRÊTEZ UNE COMMANDE

Annuler une commande

Pour annuler une commande, envoyez une requête POST sans body vers https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, où {order_id} est l’identifiant Fabrixa de la commande (le champ numérique id de la commande), et non votre numéro de commande. La réponse contient la commande avec le statut canceled, et un webhook order.updated est envoyé.

  • Une commande peut être annulée tant que son statut est created, imported, accepted ou on hold et que son fulfillment_status est encore unfulfilled. Dès qu’il passe à scheduled, la production a commencé et la commande ne peut plus être annulée.
  • Les frais d’une commande annulée sont remboursés sur votre solde.
  • Annuler une commande déjà annulée la renvoie inchangée : la requête peut donc être relancée sans risque.

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338/cancel"
    },
    "meta": [],
    "data": {
        "id": 20338,
        "number": "NL2024010201",
        "comments": "Customer agrees with a low resolution file.",
        "is_archived": false,
        "status": "canceled",
        "fulfillment_status": "unfulfilled",
        "purchased_at": "2024-06-26T21:12:22.000000Z",
        "created_at": "2024-06-26T21:15:03.000000Z",
        "updated_at": "2024-06-27T10:02:45.000000Z",
        "rows": [
            {
                "id": 41600,
                "quantity": 1,
                "client_barcode": "1234567890",
                "fulfillment_status": "unfulfilled",
                "variant": {
                    "id": 2705,
                    "name": "Duvet Cover",
                    "subtitle": "140x200",
                    "SKU": "COT864311",
                    "product": {
                        "id": 1305,
                        "name": "Duvet Cover",
                        "subtitle": "Duvet Cover with a pillow"
                    }
                },
                "sources": [
                    {
                        "type": "file",
                        "url": "https://samples-files.com/samples/sample.pdf",
                        "properties": null
                    }
                ]
            }
        ],
        "shipments": [],
        "customer": {
            "email": "3VJtP@example.com",
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678"
        },
        "shipping_address": {
            "address": "Voorbeeldstraat",
            "address2": "17",
            "address3": null,
            "city": "Amsterdam",
            "country": "Netherlands",
            "country_code": "NL",
            "company": null,
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678",
            "state": "North Holland",
            "postal_code": "1012 AB"
        }
    }
}

Si la commande ne peut pas être annulée, l’API répond 412 Precondition Failed avec un message qui en donne la raison : son statut actuel ne le permet pas (le statut figure dans le message), ou la production a déjà commencé.

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338/cancel"
    },
    "meta": [],
    "errors": {
        "messages": [
            "This order cannot be canceled in its current status (ready for shipping)."
        ]
    }
}
DE L'IMPORT À LA LIVRAISON

Cycle de vie de la commande

Une commande est suivie à l'aide de trois statuts : le status de la commande, son statut de production fulfillment_status et le status de chaque expédition dans shipments. Chaque changement est envoyé dans le webhook order.updated et renvoyé par GET /orders/{order_id}.

Statuts des commandes

Le status d'une commande, dans l'ordre où il est atteint :

Statuts d'exécution

Le fulfillment_status d'une commande et de chaque ligne de commande, dans l'ordre où il est atteint. Il ne fait qu'avancer, jamais reculer :

Une commande dans son ensemble n'est jamais rejetée. Un article peut être rejeté lors du contrôle qualité en production. Il est alors réimprimé : il revient à unfulfilled et repasse en production, tandis que la commande garde son statut et se poursuit une fois l'article terminé.

Statuts d'expédition

Le status de chaque expédition dans shipments, dans l'ordre où il est atteint :

Exceptions :

SUIVEZ VOS ARTICLES DE COMMANDE

Suivre le fulfilment

Pour obtenir le statut de fulfilment d’une commande spécifique, envoyez une requête GET vers https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. La réponse fournit les fulfilments liés à la commande, avec le statut de chaque article, les détails produit et la progression des étapes de production.

Exemple de réponse

{
    "data": [
        {
            "id": 1499,
            "barcode": "1200004169200",
            "status": "unfulfilled",
            "created_at": "2024-08-19T12:38:59.000000Z",
            "updated_at": "2024-08-19T12:39:00.000000Z",
            "variant": {
                "id": 32327,
                "name": "Test iAPI blanket product",
                "subtitle": "100 x 150 cm",
                "SKU": "COF099191"
            },
            "product": {
                "id": 1306,
                "name": "Test iAPI blanket product",
                "subtitle": "Test iAPI blanket product"
            },
            "production_steps": [
                {
                    "id": 5,
                    "name": "Print duvet",
                    "description": "Printing the duvet according to the specified design and dimensions.",
                    "status": {
                        "value": "pending",
                        "notes": null,
                        "updated_at": null
                    }
                },
                {
                    "id": 6,
                    "name": "Print pillow",
                    "description": "Printing the pillow cover with the assigned design.",
                    "status": {
                        "value": "pending",
                        "notes": null,
                        "updated_at": null
                    }
                }
            ]
        }
    ]
}

La réponse comprend une liste de réponses, chacune fournissant :

  • id - identifiant unique pour l'exécution.
  • barcode - code-barres pour le suivi et l'identification internes ; peuvent également être imprimés sur le produit.
  • status - l'état d'exécution actuel : non exécuté ou exécuté.
  • created_at et updated_at - horodatages pour la création de l'exécution et la dernière mise à jour.
  • variant - des informations détaillées sur la variante du produit : nom, sous-titre, SKU.
  • product - détails du produit : nom, sous-titre.
  • production_steps - gamme d'étapes de production. La liste des étapes dépend du type de produit. Pour chaque étape :
    • id - identifiant unique de l'étape de production.
    • name - par ex. "Imprimer la couette".
    • description - ce qu'implique l'étape de production.
    • status - le statut actuel :
      • en attente - pas encore commencé.
      • en cours - actuellement en cours.
      • rejetée - l'étape a rencontré un problème et n'a pas été terminée avec succès.
      • fait - l'étape est terminée.
    • notes - toutes notes supplémentaires liées à l'étape.
    • updated_at - la dernière fois que le statut de l'étape a été mis à jour.

Chaque enregistrement d'exécution correspond à un produit ou à une variante de produit spécifique dans la commande, et chaque copie du produit dans la commande possède son propre enregistrement d'exécution - chaque article est suivi individuellement tout au long de la production.

Si aucune exécution n'est retournée pour une commande, celle-ci n'est pas encore entrée en phase de traitement.

COMMENT FOURNIR DES FICHIERS D'IMPRESSION

Exigences des fichiers source

Lorsque vous ajoutez des source files à une commande, assurez-vous qu’ils respectent les exigences suivantes :

type

Le PDF est le format source privilégié. Pour un produit avec une seule couche d’impression, comme une couverture ou une serviette, un fichier JPEG, PNG ou TIFF convient aussi. Pour un produit à plusieurs couches, fournissez un fichier PDF avec chaque couche sur une page distincte : lors du traitement, chaque page est traitée comme une couche à part, de sorte qu’un design multicouche est envoyé en un seul fichier source. Voir les exigences PDF et l’ordre des pages.

Renseignez le type selon le format du fichier. Pour un PDF, utilisez "file" : chaque page est imprimée sur une couche du produit, dans l’ordre des pages indiqué pour ce produit. Pour un fichier JPEG, PNG ou TIFF, adapté à un produit avec une seule couche d’impression, utilisez "print".

"sources": [
    {
        "type": "file",
        "url": "https://samples-files.com/samples/source.pdf"
    }
]

Pour plus de détails, voir le Swagger documentation.

url

Le champ url doit contenir un lien direct vers le fichier source. Assurez-vous que l'URL est accessible et que le fichier peut être téléchargé sans authentification. Le lien doit rester accessible tout au long du processus de production.

Comment nous téléchargeons le fichier

Nous téléchargeons le fichier depuis votre serveur deux fois : une requête avec Range: 0-0 pendant la validation de la commande, puis le fichier complet. Les deux requêtes envoient le User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch) ; si votre site filtre le trafic automatisé, autorisez-le. L’URL doit utiliser HTTPS sur le port 443 et renvoyer le fichier directement, sans redirection, avec son vrai Content-Type, par exemple application/pdf. Chaque requête expire après 60 secondes.

Format de fichier

Fournissez un fichier PDF ou, pour un produit à une seule couche, un fichier JPEG, PNG ou TIFF, servi avec son vrai Content-Type. Les zones transparentes d’un PNG sont imprimées en blanc. Veillez à ce que les images soient de haute qualité et adaptées à l’impression.

Dimensions de l'image

Les dimensions maximales sont 15,000 pixels de chaque côté. Les images dépassant cette limite peuvent être redimensionnées ou rejetées. La résolution de l'image doit correspondre aux dimensions du produit ; sinon, les images peuvent être redimensionnées ou recadrées pour s'adapter.

Résolution

Aucune exigence de résolution spécifique : assurez-vous simplement que la qualité de l'image est suffisante pour l'impression.

Espace colorimétrique

Les images doivent être dans l’espace colorimétrique RGB pour une représentation précise des couleurs. D'autres espaces colorimétriques seront convertis lors du traitement, ce qui peut entraîner des couleurs incorrectes.

Taille du fichier

Chaque fichier source peut faire jusqu’à 200 MB. Un fichier plus volumineux est refusé : à la création de la commande si votre serveur envoie un Content-Length, sinon lors du téléchargement du fichier.

Exigences PDF et ordre des pages

L’ordre des pages dans le PDF est important. Les pages sont associées aux couches de produits par position et l'ordre des pages attendu dépend du type de produit. Assurez-vous que les pages de votre PDF suivent la séquence de couches correcte pour le produit que vous soumettez.

ProduitOrdre des pages PDF
Duvet Cover
  1. Duvet cover
  2. Pillow front
  3. Pillow back
Curtains
  1. Left curtain
  2. Right curtain
T-shirt
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Collar
Tanktop
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Collar
Sweater
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Left cuff
  6. Right cuff
  7. Collar
  8. Waistband
Hoodie
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Left cuff
  6. Right cuff
  7. Hood inside left
  8. Hood inside right
  9. Hood outside left
  10. Hood outside right
  11. Waistband
  12. Pocket lower left
  13. Pocket lower right
  14. Pocket upper right
  15. Pocket upper left
Sweatpants
  1. Front right
  2. Front left
  3. Back left
  4. Back right
  5. Left cuff
  6. Right cuff
  7. Waistband
  8. Right pocket
  9. Left pocket
  10. Back pocket
  11. Back pocket interfacing
Sweatshorts
  1. Front right
  2. Front left
  3. Back left
  4. Back right
  5. Waistband
  6. Right pocket
  7. Left pocket

Important : chaque page PDF doit correspondre aux dimensions requises pour sa couche de produit et être orientée correctement. Placez l'illustration de manière à ce que le haut du motif soit aligné avec le haut de la page. Une taille ou une orientation de page incorrecte peut entraîner des problèmes de mise à l'échelle, de rotation ou d'alignement en production.

PLANIFIEZ LA LIVRAISON

Expédition

Sachez ce que coûtera l'expédition d'une commande et combien de temps elle sera en route avant de la passer, selon les mêmes règles que celles appliquées par Fabrixa à la commande elle-même.

OÙ EXPÉDIER

Pays de livraison

Pour savoir vers quels pays une variante de produit peut être expédiée, envoyez une requête GET à https://api.fabrixa.com/v2/integration/shipping/countries avec vos identifiants. La liste, triée par nom, contient les pays vers lesquels le site qui produit la variante dispose d'un tarif d'expédition pour un colis d'expédition dans lequel la variante peut être emballée. Un pays absent de la liste n'a pas de tarif d'expédition pour la variante.

Paramètres de requête

  • variant_id ou sku - la variante, nommée comme dans une ligne de commande, de la même manière que pour une estimation.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/shipping/countries?sku=DDC-140200' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/shipping/countries"
    },
    "meta": {
        "total": 2
    },
    "data": [
        {
            "code": "BE",
            "name": "Belgium",
            "min_shipping_price": "7.75",
            "max_shipping_price": "9.85",
            "currency": "EUR",
            "min_eta_days": 1,
            "max_eta_days": 2
        },
        {
            "code": "NL",
            "name": "Netherlands",
            "min_shipping_price": "6.70",
            "max_shipping_price": "8.40",
            "currency": "EUR",
            "min_eta_days": 1,
            "max_eta_days": 1
        }
    ]
}

Champs de la réponse

  • code et name - le pays, avec le code ISO 3166-1 alpha-2 à transmettre comme country_code lors d'une estimation.
  • min_shipping_price et max_shipping_price - la fourchette du prix d'expédition d'un seul colis vers ce pays, hors TVA, dans la devise indiquée par currency, pour l'ensemble des colis d'expédition dans lesquels la variante peut être emballée. Une commande de plusieurs unités peut nécessiter plusieurs colis : demandez donc une estimation pour connaître le prix d'une quantité donnée.
  • min_eta_days et max_eta_days - la fourchette du nombre de jours pendant lesquels un colis est en route une fois remis au transporteur, délai de production non compris ; null lorsque les tarifs ne comportent pas d'estimation de livraison.
AVANT DE COMMANDER

Estimer l'expédition

Pour savoir combien coûterait l'expédition d'une variante de produit et combien de temps elle serait en route, envoyez une requête GET à https://api.fabrixa.com/v2/integration/shipping/estimate avec vos identifiants. L'estimation suit les règles selon lesquelles une commande est tarifée : les unités sont réparties dans les colis d'expédition du site qui produit la variante, et chaque colis est tarifé selon le trajet de ce site jusqu'au pays de destination. Rien n'est commandé ni réservé, et une commande est tarifée au moment où elle est passée : ses frais d'expédition peuvent donc différer si les tarifs changent entre-temps.

Paramètres de requête

  • variant_id ou sku - la variante, nommée comme dans une ligne de commande : une variante de l'un de vos produits, ou une variante du catalogue. Ce doit être une variante que vous pouvez commander.
  • country_code - le code ISO 3166-1 alpha-2 du pays vers lequel la commande est expédiée, par exemple NL.
  • quantity - le nombre d'unités, de 1 à 1000.

Demande d'échantillon

curl -X 'GET' \
  'https://api.fabrixa.com/v2/integration/shipping/estimate?sku=DDC-140200&country_code=NL&quantity=2' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer APPLICATION_ACCESS_TOKEN' \
  -H 'X-Application-Key: APPLICATION_KEY'

Exemple de réponse

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/shipping/estimate"
    },
    "meta": [],
    "data": {
        "variant_id": 32323,
        "sku": "DDC-140200",
        "quantity": 2,
        "country_code": "NL",
        "origin_country": {
            "code": "PT",
            "name": "Portugal"
        },
        "packages_count": 1,
        "packages": [
            {
                "package_type": "Small Box",
                "length": 30,
                "width": 20,
                "height": 10,
                "quantity": 1,
                "price": "7.45",
                "eta_days": 3
            }
        ],
        "shipping_price": "7.45",
        "currency": "EUR",
        "eta_days": 3
    }
}

Champs de la réponse

  • variant_id, sku, quantity et country_code - la variante, la quantité et la destination sur lesquelles porte l'estimation.
  • origin_country - le pays d'où la variante est expédiée, avec son code et son name.
  • packages_count - le nombre de colis d'expédition dans lesquels les unités sont réparties.
  • packages - les colis eux-mêmes, une entrée par type de colis, avec le package_type, ses length, width et height en cm, la quantity de ces colis, le price d'expédition de l'un d'eux et ses eta_days. Les prix multipliés par les quantités totalisent shipping_price.
  • shipping_price - le prix d'expédition de l'ensemble des colis, hors TVA, dans la devise indiquée par currency. Sur un trajet sans tarif d'expédition, l'expédition est gratuite, comme elle le serait pour une commande, et son prix est 0.00.
  • eta_days - le nombre de jours pendant lesquels le colis le plus lent est en route une fois remis au transporteur, délai de production non compris ; null lorsque le trajet n'a pas d'estimation de livraison.

Une requête qui ne passe pas la validation reçoit une réponse 400 Bad Request indiquant la raison pour chaque champ, avec les mêmes messages que pour une ligne de commande, par exemple The variant not found. Lorsqu'aucun colis d'expédition ne peut contenir les unités, la réponse est 400 Bad Request avec le message No shipping package can carry the variant.

PERSONNALISATION DU PRODUIT

Fabrixa Studio

Fabrixa Studio est un outil qui permet aux utilisateurs de personnaliser et de personnaliser de manière transparente les produits en temps réel avec une interface intuitive où les utilisateurs peuvent créer ou télécharger leurs propres créations.

Fabrixa Studio est idéal pour les entreprises proposant des produits personnalisés, permettant aux clients de visualiser leurs créations avant de finaliser les commandes.

AJOUTEZ UN STUDIO À VOTRE BOUTIQUE

Intégrer Fabrixa Studio

Vous pouvez intégrer Fabrixa Studio dans votre site web avec un iframe. Vos clients peuvent ainsi personnaliser les produits directement sur votre site pendant le checkout.

Exemple d'iframe pour l'intégration de Fabrixa Studio :

<iframe id="fabrixa-studio"
    src="https://studio.fabrixa.com?application_key={application_key}&sku={product_sku}&cart_item_key={cart_item_key}"
    name="FabrixaStudio"
    scrolling="no"
    frameborder="1"
    width="100%"
    height="100%"
    allowfullscreen="">
</iframe>

Remplacez les valeurs de product_sku, cart_item_key et application_key par vos valeurs dynamiques.

L'en-tête de Studio affiche le nom du produit tel qu'il figure dans votre boutique - le même titre que voient vos clients -, avec en dessous les options de la variante choisie. C'est la copie du produit propre à votre boutique : un nom que vous modifiez dans Fabrixa s'affiche aussi dans Studio ; locale ne le traduit pas.

Demande de création d'une commande avec cart_item_key

{
  "number": "NL2024010201",
  "purchased_at": "2024-06-26 21:12:22",
  "client_ip": "127.0.0.1",
  "client_user_agent": "Mozilla",
  "rows": [
    {
      "sku": "SB796162",
      "quantity": 1,
      "cart_item_key": "0cb76770-de2d-4524-aa48-47b6e5f0d8a5"
    }
  ],
  "customer": {
    "...": "..."
  },
  "shipping_address": {
    "...": "..."
  },
  "shipping_label": {
    "...": "..."
  }
}
ÉCOUTEZ LES ACTIONS DES CLIENTS

Gérer les événements du studio

Lorsque vous cliquez sur le bouton Ajouter au panier à l'intérieur de l'iframe, la commande suivante est exécutée :

window.parent.postMessage('customizationFinished', '*');

De même, lorsque l'on clique sur le bouton Retour :

window.parent.postMessage('closeButtonClicked', '*');

La méthode postMessage facilite la communication d'origine croisée entre l'iframe et sa fenêtre parent, lui permettant d'informer le parent des actions spécifiques de l'utilisateur.

Le premier argument de postMessage correspond aux données que vous souhaitez envoyer. La chaîne 'customizationFinished' indique que l'utilisateur a finalisé la personnalisation et ajoute le produit au panier. 'closeButtonClicked' indique que l'utilisateur a choisi de revenir en arrière.

Dans la fenêtre parent, écoutez ces messages à l'aide de l'écouteur d'événements message :

window.addEventListener('message', function(event) {
    if (event.origin === 'https://studio.fabrixa.com') {
        if (event.data === 'customizationFinished') {
            // Handle the Add to Cart event
            console.log('Customization finished and item can be added to cart.');
        } else if (event.data === 'closeButtonClicked') {
            // Handle the Back button event
            console.log('Back button clicked.');
        }
    }
});

Vérifiez toujours le origin des messages entrants pour vous assurer qu’ils proviennent d’une source fiable. En fonction du message reçu, effectuez les actions nécessaires - mettre à jour l'interface utilisateur, traiter le panier, etc. La validation de origin est cruciale pour la sécurité - elle empêche les scripts non autorisés d'interagir avec votre application.

MONTRER LE DESIGN FINI

Aperçu de la personnalisation

Une fois la personnalisation terminée, affichez la conception finale à l'aide de l'URL d'aperçu ci-dessous. Cette URL renvoie une image du produit personnalisé, adaptée à la valeur src dans une balise <img>. Idéal pour afficher le produit personnalisé dans votre panier, le récapitulatif de votre commande ou n'importe où dans l'interface de votre boutique.

https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}

Remplacez {CART_ITEM_KEY} par la clé réelle de l'article du panier et {APPLICATION_KEY} par votre clé d'application valide.

Exemple d'utilisation dans une balise d'image :

<img
    src="https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}"
    alt="Customized Product Preview"
    style="max-width: 100%; height: auto;" />
ESSAYEZ-LE AVEC VOS VALEURS

Démo en direct

L’aperçu de la personnalisation apparaîtra ici une fois le design terminé.

Customization preview
RECEVOIR DES MISES À JOUR SUR LES ÉVÉNEMENTS

Webhooks Fabrixa

Les webhooks sont utilisés par Fabrixa pour informer votre système des événements en temps réel : commandes de mises à jour ou de créations. Lorsqu'un événement se produit, Fabrixa envoie un webhook à votre serveur contenant les informations pertinentes. Votre serveur doit exposer un point de terminaison POST public pour gérer les webhooks entrants.

EXAMINEZ VOS EN-TÊTES ENTRANTS

En-têtes de requête de webhook

La requête webhook inclut les headers suivants pour vous aider à identifier et valider la requête entrante :

{
  "content-type": "application/json",
  "user-agent": "Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook)",
  "x-webhook-signature": "YmEwNjBhMGMyMzE3ZWQ5NGQ5NDYwOGVhNzNhMjQ4M2MyODZkZmI3NTQ1YzYxYjdkMzNhZjgzYzBmMTkxYTAxMw==",
  "x-webhook-topic": "order.updated"
}
Répartition de l'en-tête

Les webhooks sont envoyés avec le User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook) ; si votre endpoint filtre le trafic automatisé, autorisez-le. Pour être sûr qu’une requête provient de Fabrixa, vérifiez x-webhook-signature.

CHOISISSEZ LES THÈMES DE VOTRE ÉVÉNEMENT

Événements Webhook

Les webhooks Fabrixa notifient votre système des changements de statut ou d’activité des commandes. Chaque webhook est déclenché par une valeur x-webhook-topic spécifique. Topics actuellement pris en charge :

SujetDétails
order.created Déclenché lorsqu'une nouvelle commande est passée dans Fabrixa, soit via une requête API, soit directement dans la plateforme.
order.updated Déclenché lorsque les détails de la commande tels que le statut de la commande ou le statut d'exécution sont mis à jour.
INSPECTEZ LA CHARGE UTILE DE VOTRE ÉVÉNEMENT

Exemple de charge utile de webhook

Un exemple de charge utile envoyée avec le webhook. Cette charge utile représente une mise à jour de commande :

{
  "id": 23069,
  "number": "1250211835",
  "comments": null,
  "is_archived": false,
  "status": "accepted",
  "fulfillment_status": "fulfilled",
  "purchased_at": "2025-04-17T16:17:21.000000Z",
  "created_at": "2025-04-17T16:17:23.000000Z",
  "updated_at": "2025-04-18T07:43:52.000000Z",
  "rows": [
    {
      "id": 27954,
      "quantity": 1,
      "client_barcode": "1250211835",
      "fulfillment_status": "fulfilled",
      "variant": {
        "id": 293457,
        "name": "Sherpa fleece deken",
        "subtitle": "100x150",
        "SKU": "SFD787231",
        "product": {
          "id": 5319,
          "name": "Sherpa fleece deken",
          "subtitle": "Sherpa fleece deken"
        }
      },
      "sources": [
        {
          "type": "print",
          "url": "https://storage.googleapis.com/fabrixa-api/storage/99b10aaa-df4d-47e4-9bc9-b1d6a785df4c/orders/merchandise-sources/120002795400.pdf",
          "properties": {
            "fill_style": "contain"
          }
        }
      ]
    }
  ],
  "shipments": [
    {
      "id": 4182,
      "carrier": "PostNL",
      "method": "Standard",
      "status": "registered",
      "tracking_number": "3SABCD1234567",
      "tracking_url": "https://jouw.postnl.nl/track-and-trace/3SABCD1234567-NL-1012AB",
      "packages": [
        {
          "tracking_number": "3SABCD1234567",
          "tracking_url": "https://jouw.postnl.nl/track-and-trace/3SABCD1234567-NL-1012AB"
        }
      ],
      "expected_delivery_date": "2025-04-22",
      "created_at": "2025-04-18T07:43:50.000000Z"
    }
  ]
}

Une fois la commande expédiée, shipments liste chaque envoi avec son transporteur (carrier), son mode d’expédition (method), son statut (status : pending, registered, collected, in transit, delivered, failed, returned ou canceled) et son suivi : tracking_number et tracking_url, ainsi que les mêmes informations pour chaque colis dans packages lorsqu’un envoi en comporte plusieurs. Un webhook order.updated est envoyé à chaque changement du statut ou du suivi d’un envoi, et GET /orders/{order_id} renvoie le même champ.

VÉRIFIEZ VOTRE SOURCE WEBHOOK

Vérifier les signatures Webhook

Pour garantir que la requête webhook est authentique et non modifiée, vérifiez le header x-webhook-signature. Recalculez la signature HMAC-SHA256 avec le raw request payload et votre secret key, puis comparez-la à la signature reçue.

Exemple PHP brut

$payload = file_get_contents('php://input');
$yourSecret = 'your-secret-key';
$expectedSignature = base64_encode(hash_hmac('sha256', $payload, $yourSecret, true));
$receivedSignature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

if (!hash_equals($expectedSignature, $receivedSignature)) {
    http_response_code(403);
    exit('Invalid signature');
}

Exemple Laravel

public function handle(Request $request)
{
    $yourSecret = 'your-secret-key';
    $payload = $request->getContent();
    $expectedSignature = base64_encode(hash_hmac('sha256', $payload, $yourSecret, true));
    $receivedSignature = $request->header('x-webhook-signature');

    if (!hash_equals($expectedSignature, $receivedSignature)) {
        abort(403, 'Invalid signature');
    }

    // Continue processing...
}

Remplacez $yourSecret par votre clé secrète partagée. Utilisez toujours hash_equals pour comparer les signatures afin d’atténuer les attaques temporelles.

ET SI LA LIVRAISON ÉCHOUE ?

Nouvelles tentatives de webhook

Les webhooks sont désactivés par défaut après 10 tentatives de livraison infructueuses. Si votre point de terminaison renvoie un statut d'échec tel que 404 ou toute erreur 5xx, le webhook réessayera 10 fois au total. S'il continue à renvoyer un code de réponse non-2xx ou non-3xx, il sera désactivé. Les réponses réussies comprennent :

RENVOYER UNE RÉPONSE CLAIRE

Réponse du webhook

Nous recommandons fortement que votre point de terminaison renvoie un code d'état 200 OK le plus rapidement possible pour accuser réception réussie du webhook. Bien que toute réponse 2xx ou 3xx soit considérée comme réussie, 200 est la plus couramment utilisée et la plus fiable.

Pour éviter les délais d'attente ou les tentatives de livraison, renvoyez immédiatement 200 OK et gérez le traitement de la charge utile du webhook de manière asynchrone, par exemple via une tâche en arrière-plan ou une file d'attente. Si votre point de terminaison met trop de temps à répondre, cela peut être considéré comme un échec même si la réponse aboutit finalement.

Les réponses avec des codes d'état dans la plage 4xx ou 5xx, ou des délais d'attente, déclencheront de nouvelles tentatives selon le mécanisme de nouvelle tentative.