ONTWIKKELAARS · Integration API Referentie

Fabrixa Integration API Referentie

33 min lezen Laatst bijgewerkt: 06-11-2026 119 weergaven

De Integration API helpt je Fabrixa-orders aan te maken en te beheren, Fabrixa Studio te starten en via webhooks synchroon te blijven met productie- en fulfilmentstatussen. De API volgt REST-conventies en gebruikt JSON voor alle request- en response bodies.

BASIS-URL

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

Stuur alle requests naar deze basis-URL, gevolgd door het specifieke endpoint path. De basis-URL is het startpunt voor interactie met de Fabrixa API: resources ophalen, aanmaken, bijwerken of verwijderen.

VOOR JE EERSTE REQUEST

Authenticatie

Om de Integration API te gebruiken, authenticeer je requests met zowel een Application Access Token als een Application Key:

Authorization header
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Application Key header
X-Application-Key: APPLICATION_KEY
Voorbeeld cURL command
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'

Vervang APPLICATION_ACCESS_TOKEN door je eigen access token en APPLICATION_KEY door je eigen application key.

HOE RESPONSES ZIJN OPGEBOUWD

Endpoints en requests

De endpoints van de Integration API zijn georganiseerd per resource type en volgen de REST-architectuur. Elk endpoint vertegenwoordigt een resource; acties op resources worden uitgevoerd met standaard HTTP methods.

Alle requests en responses van de Integration API gebruiken JSON, zodat de interactie met de API consistent en eenvoudig blijft.

Zie onze Swagger-documentatie voor alle endpointdetails, inclusief request- en responsevoorbeelden.

Responseformaat

Alle endpoints geven data terug in een gestandaardiseerd formaat met deze objecten:

{
  "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"
    }
  ]
}

Beschrijving van responseobjecten

links

Bevat paginatielinks om door de resultaten te navigeren.

  • self — de URL van de huidige pagina.
  • first_page — de URL van de eerste pagina met resultaten.
  • last_page — de URL van de laatste pagina met resultaten.
  • next_page — de URL van de volgende pagina. null als er geen volgende pagina is.
  • prev_page — de URL van de vorige pagina. null als er geen vorige pagina is.

meta

Bevat metadata over de response, zoals paginatie-informatie.

  • total — het totale aantal items over alle pagina’s.
  • current_page — het huidige paginanummer van de resultaten.
  • per_page — het aantal items per pagina.

data

De hoofdinhoud van de response. data verschilt per endpoint: het kan één object zijn, bijvoorbeeld één product, of een array met objecten, bijvoorbeeld een lijst producten.

ALS ER IETS MISGAAT

Fouten en statuscodes

Alle API requests geven HTTP status codes terug die inzicht geven in de response.

400 Bad Request

De server kan de request niet verwerken door validatiefouten: ontbrekende of ongeldige parameters.

401 Unauthorized

De client heeft geen geldige authenticatiegegevens meegestuurd. Wordt ook teruggegeven wanneer de access token is ingetrokken.

403 Forbidden

De server weigert de request door onvoldoende rechten, meestal door onjuiste of ontbrekende toegangsrechten.

404 Not Found

De gevraagde resource kon niet op de server worden gevonden.

412 Precondition Failed

Het request kan niet worden uitgevoerd in de huidige toestand van de resource, bijvoorbeeld een order die niet meer kan worden geannuleerd.

429 Too Many Requests

De client heeft het toegestane aantal requests binnen een bepaalde periode overschreden. Zie Rate limits.

5xx Errors

Er is een interne serverfout opgetreden. Neem contact op met Fabrixa support met details van de mislukte request.

Error response body

Voorbeeld van een error response body:

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

errors bevat details over wat is mislukt. De array messages bevat foutbeschrijvingen. Bij een Bad Request ontvang je de veldnamen die validatie niet hebben gehaald.

KEN JE REQUESTLIMIETEN

Rate limits

De Integration API ondersteunt een limiet van 30 requests per application per minuut.

Als je deze limiet overschrijdt, ontvang je een 429 Too Many Requests response.

Alle Integration API responses bevatten de header X-RateLimit-Remaining, het aantal requests dat de client nog kan doen, en X-RateLimit-Limit, het totaal toegestane aantal per minuut.

TEST VOORDAT JE LIVE GAAT

Sandboxmodus

Met de sandboxmodus test je je integratie van begin tot eind, voordat een echte bestelling wordt geproduceerd of in rekening gebracht. De modus geldt voor je hele account: bestellingen uit alle verkoopkanalen, waaronder de Integration API en gekoppelde Shopify- en WooCommerce-winkels, worden niet geproduceerd en niet van je saldo afgeschreven. Je account staat in de sandboxmodus zolang de status wacht op activering is.

In de sandboxmodus kun je:

Voeg om bestellingen te testen producten uit de Fabrixa-catalogus toe: open een product, klik op Verkoop dit en kies varianten en ontwerpen. Ze verschijnen daarna onder Mijn producten.

Om je account naar de sandboxmodus te schakelen, open je Platform, ga je naar Instellingen → Bedrijf → Sandboxmodus en klik je op Naar sandboxmodus. Je kunt de modus ook inschakelen wanneer je een nieuw verkoopkanaal toevoegt, waaronder een Integration API-kanaal, of mailen naar support@fabrixa.com, dan schakelen wij je account voor je om. De sandboxmodus is alleen beschikbaar voor actieve accounts.

Wanneer je klaar bent, activeer je je account zelf in Platform onder Instellingen → Bedrijf → Sandboxmodus. Je kunt ook mailen naar support@fabrixa.com, dan activeren wij het voor je. Je gekoppelde winkels en API-inloggegevens blijven werken, dus er hoeft niets opnieuw te worden ingesteld.

Na activering gaan alle nieuwe bestellingen naar productie en worden ze van je saldo afgeschreven. Bestellingen die vóór de activering zijn aangemaakt, blijven testbestellingen: ze worden nooit geproduceerd of in rekening gebracht, ook niet na activering.

KIES WAT JE VERKOOPT

Producten

De catalogus is alles wat Fabrixa produceert. Je producten zijn de catalogusproducten die je aan je Fabrixa-account hebt toegevoegd, met je eigen namen, beschrijvingen, afbeeldingen en SKU's. Een orderregel noemt een productvariant - één maat of uitvoering van een product - via de sku of variant_id: een variant van een van je producten, of een rechtstreeks bestelde catalogusvariant.

WAT FABRIXA PRODUCEERT

Catalogus bekijken

Om de producten op te halen die Fabrixa produceert, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/catalog/products met je inloggegevens. Hij toont de actieve producten met een variant die een printpartner op dit moment produceert, en alleen die varianten, elk met SKU, verkoopprijs, afmetingen en optiewaarden.

Queryparameters

  • page en limit (maximaal 100) - verdelen de lijst in pagina's. Zonder deze parameters komt de hele catalogus in één respons terug.
  • search - de producten waarvan de naam de tekst bevat, of waarvan de slug of de SKU van een variant ermee begint.
  • category_id - de producten in een categorie; parent_category_id - de producten in alle subcategorieën van een hoofdcategorie. Zie Cataloguscategorieën.
  • group_id - de producten in een catalogusgroep.
  • sort_by - name, created, updated, type, popular of sold, in de sort_order asc of desc. Standaard komen de nieuwste producten eerst.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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" } ] } ] } ] } ] }

Velden in de respons

  • id, name, subtitle, description (HTML), slug, code en HS_code, de douanetariefcode.
  • is_sellable - of het product open is voor verkoop. Een gesloten product staat nog in de lijst, maar een order voor een van zijn varianten wordt geweigerd.
  • variants_min_selling_price en variants_max_selling_price - de prijsrange over de getoonde varianten.
  • type - het producttype, dat de printlagen en de PDF-paginavolgorde bepaalt; status - in de catalogus altijd Active.
  • categories - de categorieën waarin het product staat, elk met zijn parent_category.
  • images - de productafbeeldingen, met url, is_main, screen_type_size en sort_number.
  • variants - de bestelbare uitvoeringen van het product: id, name, subtitle, SKU, selling_price, de width, height, length en weight, en options, de optiewaarden die deze variant bepalen, bijvoorbeeld de maat.
VIND JE WEG IN DE CATALOGUS

Cataloguscategorieën

Om de categorieën op te halen waarin de catalogus is ingedeeld, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/catalog/categories met je inloggegevens. De respons bevat de hoofdcategorieën, elk met de subcategorieën genest in sub_categories en het aantal catalogusproducten erin in products_count. Geef de id van een categorie mee als category_id bij het bekijken van de catalogus, of de id van een hoofdcategorie als parent_category_id om de producten van al haar subcategorieën in één keer op te halen.

Queryparameters

  • page en limit (maximaal 100) - verdelen de lijst in pagina's. Zonder deze parameters komen alle categorieën terug.
  • search - de categorieën waarvan de naam de tekst bevat.
  • with_products_only - true laat de categorieën weg die geen catalogusproduct bevatten, direct noch in een subcategorie.
  • sort_by - category_name of category_created, in de sort_order asc of desc. Standaard komen de categorieën in hun catalogusvolgorde.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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
                }
            ]
        }
    ]
}
JE ACCOUNT

Je producten

Om de producten in je account op te halen, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/products met je inloggegevens. Je producten zijn de catalogusproducten die je aan je Fabrixa-account hebt toegevoegd: ze dragen de namen, beschrijvingen en afbeeldingen die je ze daar hebt gegeven, en hun varianten de SKU-waarden die je hebt gekozen. Alleen actieve producten worden getoond, tien per pagina tenzij je limit meegeeft.

Queryparameters

  • page en limit (maximaal 100) - de pagina die je wilt en haar grootte; standaard de eerste pagina van tien.
  • search - de producten waarvan de naam de tekst bevat, of waarvan de slug of de SKU van een variant ermee begint.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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"] } ] } ] }

Om één product te lezen, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/products/{product_id}, waarbij {product_id} de id ervan is. De respons bevat dezelfde velden als de lijst. Een product dat niet in je account staat, ook een catalogusproduct, antwoordt met 404 Not Found en de melding Product not found.

Velden in de respons

  • id, name, subtitle, description (HTML), slug, width, height, length en weight.
  • type - het producttype, dat de printlagen en de PDF-paginavolgorde bepaalt.
  • available_options - elke optie van het product met al haar waarden, bijvoorbeeld elke maat waarin het verkrijgbaar is; elke variant neemt één waarde per optie.
  • categories en collections - de categorieën en collecties waarin je het product in je account hebt ingedeeld.
  • images - de productafbeeldingen, met url, is_main, image_size, screen_type_size en sort_number.
  • variants - de bestelbare uitvoeringen van het product, zie Productvarianten: id, name, subtitle, SKU, options, images en de printlagen in available_source_types en required_source_types.
WAT EEN ORDERREGEL NOEMT

Productvarianten

Een variant is één bestelbare uitvoering van een product - één maat, één kleur - en wat een orderregel noemt, via sku of variant_id. Om een variant van een van je producten te lezen, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/variants/{variant_id}, waarbij {variant_id} de id ervan is. Een variant van een product dat niet in je account staat, antwoordt met 404 Not Found en de melding Variant not found.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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"] } }

Velden in de respons

  • id, name, subtitle, description, SKU, width, height, length, weight, options, images en het product waartoe de variant behoort.
  • available_source_types - de printlagen van de variant, met de namen waaronder het productieproces ze kent. Naast "file", dat elke variant accepteert voor een PDF, zijn dit de waarden die het type van een bronbestand mag hebben; een product met één printlaag toont "print".
  • required_source_types - de lagen die een printbestand moet dekken. Een PDF verstuurd als "file" dekt ze met zijn pagina's, in de paginavolgorde van het producttype. Anders heeft de regel voor elk ervan een JPEG-, PNG- of TIFF-bestand nodig met de naam van de laag als type; een regel waarin er een ontbreekt, wordt geweigerd met 400 Bad Request en de namen van de ontbrekende lagen.

Een orderregel voor deze variant, met een PDF waarvan de pagina's de lagen zijn:

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

Welke varianten kunnen worden besteld

  • Een orderregel mag een variant noemen van een product in je account, of rechtstreeks een catalogusvariant, nooit een product van een andere klant. De variant wordt gevonden via de variant_id, of via de sku ongeacht hoofd- of kleine letters.
  • De variant moet actief zijn, en het product actief en open voor verkoop. Voor je kopie van een catalogusproduct moeten ook het catalogusproduct actief en de catalogusvariant ingeschakeld zijn.
  • Anders wordt de order geweigerd met 400 Bad Request en de reden voor de betreffende regel: 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. of The catalog variant is not active.
ORDERS AANMAKEN EN VOLGEN

Bestellingen

Maak orders in Fabrixa vanuit je eigen storefront of platform, voeg de vereiste printbestanden toe en volg elk item terwijl het door fulfilment gaat.

BEREID JE ORDERGEGEVENS VOOR

Order aanmaken

Om een order aan te maken via de Fabrixa Integration API, stuur je een POST request naar https://api.fabrixa.com/v2/integration/orders. De request body moet bevatten:

Structuur van de request body

  • number (optional) - het ordernummer. Als dit ontbreekt, wordt een uniek nummer gegenereerd.
  • comments (optional) - extra opmerkingen of notities bij de order.
  • purchased_at - datum en tijd waarop de order is gekocht, als YYYY-MM-DD HH:MM:SS.
  • client_ip (optional) - het IP-adres van de klant.
  • client_user_agent (optional) - de user-agent van de klant.
  • rows - array met orderitems, elk met:
    • sku - de SKU van de productvariant. Zie Swagger voor details.
    • quantity - aantal bestelde productvarianten.
    • client_barcode (optional) - unieke client-side identifier per orderregel, geformatteerd als Code 128.
    • cart_item_key (required without sources) - unieke identifier van het platform dat Fabrixa Studio embedt, gebruikt om opgeslagen personalisaties aan de order te koppelen.
    • sources (required without cart_item_key) - array met source files voor het product, elk met:
      • type - "file" voor een PDF, of "print" voor een JPEG-, PNG- of TIFF-bestand.
      • url - URL van het source file.
  • customer - klantgegevens:
    • first_name, last_name, email, phone.
  • shipping_address - verzendgegevens:
    • address, address2 (optional), address3 (optional).
    • city, country_code (ISO 3166-2), country, postal_code, state (optional).
    • first_name, last_name, phone (optional), company (optional).
  • shipping_label (optional) - labeldetails:
    • method_name - bijv. "Post NL".
    • tracking_number, tracking_url, label_pdf_url.
    • date_created - geformatteerd als YYYY-MM-DD HH:MM:SS.

Voorbeeldrequest

{
  "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"
  }
}

Voorbeeldresponse

{
    "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"
        }
    }
}
WIJZIG DE ORDERGEGEVENS

Een order bijwerken

Om een order bij te werken, stuur je een PATCH request naar https://api.fabrixa.com/v2/integration/orders/{order_id}, waarbij {order_id} het Fabrixa-order-id is. Alleen de velden die je meestuurt worden gewijzigd, en de status van de order blijft gelijk. Het antwoord bevat de bijgewerkte order. Je kunt wijzigen:

  • number, comments, purchased_at, client_ip, client_user_agent.
  • customer - first_name, last_name, email, phone.
  • shipping_address - dezelfde velden als bij het aanmaken van een order.

Voorbeeldrequest

{
  "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"
  }
}

Voorbeeldresponse

{
    "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"
        }
    }
}
  • Orderregels kunnen niet worden gewijzigd: een request met rows wordt geweigerd met 400 Bad Request. Om de items te wijzigen, annuleer je de order en maak je een nieuwe aan.
  • Een order met de status on hold kan niet worden bijgewerkt; de API antwoordt met 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."
        ]
    }
}
STOP EEN ORDER

Een order annuleren

Om een order te annuleren, stuur je een POST request zonder body naar https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, waarbij {order_id} het Fabrixa-order-id is (het numerieke veld id van de order), niet je ordernummer. Het antwoord bevat de order met de status canceled, en er wordt een order.updated webhook verstuurd.

  • Een order kan worden geannuleerd zolang de status created, imported, accepted of on hold is en de fulfillment_status nog unfulfilled is. Zodra die scheduled wordt, is de productie gestart en kan de order niet meer worden geannuleerd.
  • De kosten van een geannuleerde order worden teruggestort op je saldo.
  • Een order annuleren die al geannuleerd is, geeft deze ongewijzigd terug; het request kan dus veilig opnieuw worden verstuurd.

Voorbeeldresponse

{
    "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"
        }
    }
}

Als de order niet kan worden geannuleerd, antwoordt de API met 412 Precondition Failed en een melding met de reden: de huidige status staat het niet toe (de status staat in de melding), of de productie is al gestart.

{
    "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)."
        ]
    }
}
VAN IMPORT TOT BEZORGING

Orderverloop

Een order wordt gevolgd met drie statussen: de status van de order, de productiestatus fulfillment_status en de status van elke zending in shipments. Elke wijziging wordt verstuurd in de webhook order.updated en teruggegeven door GET /orders/{order_id}.

Orderstatussen

De status van een order, in de volgorde waarin die wordt bereikt:

Fulfilmentstatussen

De fulfillment_status van een order en van elke orderregel, in de volgorde waarin die wordt bereikt. Die gaat alleen vooruit, nooit terug:

Een order als geheel wordt nooit afgekeurd. Een afzonderlijk artikel kan tijdens de productie bij de kwaliteitscontrole worden afgekeurd. Het wordt dan opnieuw geprint: het keert terug naar unfulfilled en doorloopt de productie nog een keer, terwijl de order zijn status behoudt en verdergaat zodra het artikel klaar is.

Zendingstatussen

De status van elke zending in shipments, in de volgorde waarin die wordt bereikt:

Uitzonderingen:

VOLG JE ORDERITEMS

Fulfilment volgen

Om de fulfilment status van een specifieke order op te halen, stuur je een GET request naar https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. De response bevat de fulfilments van de order, inclusief status per item, productdetails en voortgang van productiestappen.

Voorbeeldresponse

{
    "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
                    }
                }
            ]
        }
    ]
}

De response bevat een lijst met fulfilments, elk met:

  • id - unieke identifier van de fulfilment.
  • barcode - barcode voor interne tracking en identificatie; kan ook op het product worden geprint.
  • status - huidige fulfilmentstatus: unfulfilled of fulfilled.
  • created_at en updated_at - timestamps voor aanmaak en laatste update.
  • variant - details van de productvariant: naam, subtitle, SKU.
  • product - productdetails: naam, subtitle.
  • production_steps - array met productiestappen. De lijst hangt af van het producttype. Per stap:
    • id - unieke identifier van de productiestap.
    • name - bijv. "Print duvet".
    • description - wat de productiestap inhoudt.
    • status - huidige status:
      • pending - nog niet gestart.
      • in progress - momenteel bezig.
      • rejected - de stap had een probleem en is niet succesvol afgerond.
      • done - de stap is afgerond.
    • notes - extra notities bij de stap.
    • updated_at - laatste moment waarop de stapstatus is bijgewerkt.

Elke fulfilment hoort bij een specifiek product of productvariant binnen de order, en elk exemplaar van het product in de order heeft een eigen fulfilment record. Zo wordt elk item afzonderlijk gevolgd tijdens productie.

Als er geen fulfilments worden teruggegeven, is de order nog niet in de verwerkingsfase.

PRINTBESTANDEN AANLEVEREN

Vereisten voor bronbestanden

Wanneer je source files aan een order toevoegt, moeten ze aan de volgende vereisten voldoen:

type

PDF is het voorkeursformaat voor de bron. Voor een product met één printlaag, zoals een deken of een handdoek, kan ook een JPEG-, PNG- of TIFF-bestand. Voor een product met meerdere lagen lever je een PDF-bestand met elke laag op een aparte pagina: tijdens de verwerking wordt elke pagina als een aparte laag behandeld, zodat een ontwerp met meerdere lagen als één bronbestand wordt aangeleverd. Bekijk PDF-vereisten en paginavolgorde.

Stel type in op basis van het bestandsformaat. Gebruik voor een PDF "file": elke pagina wordt op één laag van het product geprint, in de paginavolgorde die voor dat product staat vermeld. Gebruik voor een JPEG-, PNG- of TIFF-bestand, geschikt voor een product met één printlaag, "print".

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

Zie de Swagger-documentatie voor meer details.

url

Het veld url moet een directe link naar het source file bevatten. Zorg dat de URL toegankelijk is en dat het bestand zonder authenticatie kan worden gedownload. De link moet tijdens het productieproces bereikbaar blijven.

Hoe we het bestand downloaden

We downloaden het bestand twee keer van je server: een request met Range: 0-0 terwijl de order wordt gevalideerd, en daarna het hele bestand. Beide requests sturen de User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch) mee; als je site automatisch verkeer filtert, sta die dan toe. De URL moet HTTPS op poort 443 gebruiken en het bestand direct teruggeven, zonder redirects, met de echte Content-Type van het bestand, bijvoorbeeld application/pdf. Elk request verloopt na 60 seconden.

Bestandsformaat

Lever een PDF-bestand aan of, voor een product met één laag, een JPEG-, PNG- of TIFF-bestand, geserveerd met de echte Content-Type. Transparante delen van een PNG worden wit geprint. Zorg dat de afbeeldingen van hoge kwaliteit en geschikt voor druk zijn.

Afbeeldingsafmetingen

De maximale afmeting is 15.000 pixels aan elke zijde. Afbeeldingen boven deze limiet kunnen worden verkleind of afgewezen. De resolutie moet passen bij de productafmetingen; anders kunnen afbeeldingen worden verkleind of bijgesneden.

Resolutie

Er is geen specifieke resolutie-eis; zorg alleen dat de beeldkwaliteit voldoende is voor drukwerk.

Kleurruimte

Afbeeldingen moeten in RGB staan voor accurate kleurweergave. Andere kleurruimtes worden tijdens verwerking geconverteerd, wat tot afwijkende kleuren kan leiden.

Bestandsgrootte

Elk source file mag maximaal 200 MB zijn. Een groter bestand wordt geweigerd: bij het aanmaken van de order als je server een Content-Length meestuurt, anders bij het downloaden van het bestand.

PDF-vereisten en paginavolgorde

De volgorde van pagina’s in de PDF is belangrijk. Pagina’s worden op basis van hun positie gekoppeld aan productlagen, en de verwachte paginavolgorde hangt af van het producttype. Zorg dat de pagina’s in je PDF de juiste laagvolgorde volgen.

ProductnaamPDF-paginavolgorde
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

Belangrijk: elke PDF-pagina moet de juiste afmetingen hebben voor de productlaag en correct georiënteerd zijn. Plaats het artwork zo dat de bovenkant van het ontwerp aan de bovenkant van de pagina staat. Een verkeerde pagina-afmeting of oriëntatie kan schaal-, rotatie- of uitlijnproblemen veroorzaken in productie.

PLAN DE LEVERING

Verzending

Weet wat de verzending van een order kost en hoe lang die onderweg is voordat je hem plaatst, berekend met dezelfde regels die Fabrixa op de order zelf toepast.

WAARHEEN HET VERZONDEN WORDT

Verzendlanden

Om te zien naar welke landen een productvariant kan worden verzonden, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/shipping/countries met je inloggegevens. De lijst bevat, gesorteerd op naam, de landen waarnaar de locatie die de variant produceert een verzendtarief heeft voor een verzendpakket waarin de variant kan worden verpakt. Een land dat niet in de lijst staat, heeft geen verzendtarief voor de variant.

Queryparameters

  • variant_id of sku - de variant, aangeduid zoals in een orderregel, net als bij een schatting.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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
        }
    ]
}

Velden in de respons

  • code en name - het land, met de code volgens ISO 3166-1 alpha-2 die je als country_code aan de schatting meegeeft.
  • min_shipping_price en max_shipping_price - de bandbreedte van wat één verzendpakket naar het land kost, exclusief btw, in currency, over alle verzendpakketten waarin de variant kan worden verpakt. Een order van meerdere stuks kan meerdere pakketten nodig hebben; vraag dus een schatting op voor de prijs van een bepaald aantal.
  • min_eta_days en max_eta_days - de bandbreedte van het aantal dagen dat een pakket onderweg is nadat het aan de vervoerder is overgedragen, productietijd niet meegerekend; null als de tarieven geen levertijdschatting bevatten.
VOORDAT JE BESTELT

Verzending inschatten

Om te zien wat de verzending van een productvariant zou kosten en hoe lang die onderweg zou zijn, stuur je een GET-request naar https://api.fabrixa.com/v2/integration/shipping/estimate met je inloggegevens. De schatting volgt dezelfde regels als de prijsberekening van een order: de stuks worden verpakt in de verzendpakketten van de locatie die de variant produceert, en voor elk pakket wordt de prijs bepaald over de route van die locatie naar het land van bestemming. Er wordt niets besteld of gereserveerd, en de prijs van een order wordt bepaald wanneer die wordt geplaatst; de verzendkosten kunnen dus afwijken als de tarieven in de tussentijd veranderen.

Queryparameters

  • variant_id of sku - de variant, aangeduid zoals in een orderregel: een variant van een van je producten, of een catalogusvariant. Het moet een variant zijn die je kunt bestellen.
  • country_code - de code volgens ISO 3166-1 alpha-2 van het land waarnaar de order wordt verzonden, bijvoorbeeld NL.
  • quantity - het aantal stuks, van 1 tot en met 1000.

Voorbeeldrequest

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'

Voorbeeldresponse

{
    "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
    }
}

Velden in de respons

  • variant_id, sku, quantity en country_code - de variant, het aantal en de bestemming waarvoor de schatting geldt.
  • origin_country - het land van waaruit de variant wordt verzonden, met code en name.
  • packages_count - het aantal verzendpakketten waarin de stuks worden verpakt.
  • packages - de pakketten zelf, één regel per pakkettype: het package_type, de length, width en height in cm, de quantity van zulke pakketten, de price voor het verzenden van één ervan en de eta_days. De prijzen maal de aantallen tellen op tot shipping_price.
  • shipping_price - de verzendprijs van alle pakketten samen, exclusief btw, in currency. Een route zonder verzendtarief wordt gratis verzonden, net als bij een order, en krijgt de prijs 0.00.
  • eta_days - het aantal dagen dat het traagste pakket onderweg is nadat het aan de vervoerder is overgedragen, productietijd niet meegerekend; null als er voor de route geen levertijdschatting is.

Een request die niet door de validatie komt, wordt beantwoord met 400 Bad Request en de reden per veld, met dezelfde meldingen als bij een orderregel, bijvoorbeeld The variant not found. Als geen enkel verzendpakket de stuks kan bevatten, is het antwoord 400 Bad Request met de melding No shipping package can carry the variant.

PRODUCTPERSONALISATIE

Fabrixa Studio

Fabrixa Studio is een tool waarmee gebruikers producten realtime kunnen personaliseren via een intuïtieve interface waarin zij eigen ontwerpen kunnen maken of uploaden.

Fabrixa Studio is ideaal voor bedrijven die custom producten aanbieden, zodat klanten hun ontwerp kunnen bekijken voordat zij de order afronden.

VOEG STUDIO TOE AAN JE SHOP

Fabrixa Studio insluiten

Je kunt Fabrixa Studio in je website insluiten met een iframe. Zo kunnen klanten producten direct op je site personaliseren tijdens checkout.

Voorbeeld iframe voor het insluiten van 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>

Vervang de waarden voor product_sku, cart_item_key en application_key door je dynamische waarden.

De kop van Studio toont de productnaam zoals die in je winkel staat - dezelfde titel die je klanten zien - met daaronder de opties van de gekozen variant. Het is de eigen kopie van het product in je winkel, dus een naam die je in Fabrixa aanpast, verschijnt ook in Studio; locale vertaalt hem niet.

Request om een order aan te maken met 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": {
    "...": "..."
  }
}
LUISTER NAAR KLANTACTIES

Studio-events afhandelen

Wanneer binnen het iframe op de knop Add to Cart wordt geklikt, wordt het volgende command uitgevoerd:

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

Wanneer op de knop Back wordt geklikt:

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

De methode postMessage maakt cross-origin communicatie mogelijk tussen het iframe en het parent window, zodat specifieke gebruikersacties kunnen worden doorgegeven.

Het eerste argument van postMessage is de data die je wilt sturen. De string 'customizationFinished' betekent dat de gebruiker de personalisatie heeft afgerond en het product aan de cart toevoegt. 'closeButtonClicked' betekent dat de gebruiker terug wil gaan.

Luister in het parent window naar deze berichten via de message event listener:

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.');
        }
    }
});

Controleer altijd de origin van inkomende berichten om zeker te weten dat ze van een vertrouwde bron komen. Voer op basis van het bericht de juiste acties uit, zoals de interface bijwerken of de cart verwerken. Validatie van origin is belangrijk voor security en voorkomt dat ongeautoriseerde scripts met je applicatie communiceren.

TOON HET EINDONTWERP

Voorbeeld van personalisatie

Nadat de personalisatie is voltooid, toon je het eindontwerp met de preview-URL hieronder. Deze URL geeft een afbeelding van het gepersonaliseerde product terug, geschikt als src waarde in een <img> tag. Ideaal voor weergave in cart, orderoverzicht of shopinterface.

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

Vervang {CART_ITEM_KEY} door de echte cart item key en {APPLICATION_KEY} door je geldige application key.

Voorbeeldgebruik in een image tag:

<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;" />
PROBEER MET JE EIGEN WAARDEN

Live demo

De customization preview verschijnt hier nadat het ontwerp is afgerond.

Customization preview
ONTVANG EVENT-UPDATES

Webhaken

Webhooks worden door Fabrixa gebruikt om je systeem te informeren over realtime events, zoals orderupdates of nieuwe orders. Wanneer een event plaatsvindt, stuurt Fabrixa een webhook naar je server met de relevante informatie. Je server moet een publieke POST endpoint beschikbaar stellen om inkomende webhooks te verwerken.

CONTROLEER INKOMENDE HEADERS

Webhook request headers

De webhook request bevat de volgende headers om de inkomende request te identificeren en valideren:

{
  "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"
}
Headeroverzicht

Webhooks worden verstuurd met de User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); als je endpoint automatisch verkeer filtert, sta die dan toe. Om zeker te weten dat een request van Fabrixa komt, controleer je x-webhook-signature.

KIES JE EVENT TOPICS

Webhook events

Fabrixa webhooks informeren je systeem over wijzigingen in orderstatus of activiteit. Elke webhook wordt getriggerd door een specifieke x-webhook-topic waarde. Momenteel ondersteunde topics:

OnderwerpBeschrijving
order.created Getriggerd wanneer een nieuwe order in Fabrixa wordt geplaatst, via API request of direct in het platform.
order.updated Getriggerd wanneer orderdetails zoals orderstatus of fulfilmentstatus worden bijgewerkt.
BEKIJK DE EVENT PAYLOAD

Voorbeeld webhook payload

Voorbeeld van de payload die met de webhook wordt verzonden. Deze payload toont een orderupdate:

{
  "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"
    }
  ]
}

Zodra de order is verzonden, toont shipments elke zending met de vervoerder (carrier), verzendmethode (method), status (status: pending, registered, collected, in transit, delivered, failed, returned of canceled) en tracking: tracking_number en tracking_url, en hetzelfde per pakket in packages als een zending er meerdere heeft. Er wordt een order.updated webhook verstuurd telkens wanneer de status of tracking van een zending verandert, en GET /orders/{order_id} geeft hetzelfde veld terug.

VERIFIEER DE WEBHOOKBRON

Webhook signatures verifiëren

Om zeker te weten dat de webhook request authentiek en ongewijzigd is, verifieer je de x-webhook-signature header. Bereken de HMAC-SHA256 signature opnieuw met de raw request payload en je secret key, en vergelijk deze met de ontvangen signature.

Raw PHP voorbeeld

$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');
}

Laravel voorbeeld

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

Vervang $yourSecret door je gedeelde secret key. Gebruik altijd hash_equals om signatures te vergelijken en timing attacks te beperken.

WAT ALS DELIVERY MISLUKT?

Webhook retries

Webhooks worden standaard uitgeschakeld na 10 mislukte afleverpogingen. Als je endpoint een onsuccesvolle status teruggeeft, zoals 404 of een 5xx error, probeert de webhook het maximaal 10 keer opnieuw. Blijft de response non-2xx of non-3xx, dan wordt de webhook gedeactiveerd. Succesvolle responses zijn:

GEEF EEN DUIDELIJKE RESPONSE

Webhook response

We raden sterk aan dat je endpoint zo snel mogelijk een 200 OK status code teruggeeft om succesvolle ontvangst van de webhook te bevestigen. Hoewel elke 2xx of 3xx response als succesvol geldt, is 200 het meest gebruikelijk en betrouwbaar.

Om delivery timeouts of retries te voorkomen, geef je direct 200 OK terug en verwerk je de webhook payload asynchroon, bijvoorbeeld via een background job of queue. Als je endpoint te lang doet over de response, kan dit als failure worden gezien, zelfs als de response uiteindelijk succesvol is.

Responses met status codes in de 4xx of 5xx range, of timeouts, starten retries volgens het retrymechanisme.