UTVECKLARE · Referens för integrations-API

Fabrixa Integration API Referens

31 min läst Senast uppdaterad:06-11-2026 119 visningar

Integration API hjälper dig att skapa och hantera Fabrixa-order, lansera Fabrixa Studio och hålla dig synkroniserad med produktions- och leveransstatus via webhooks. API:n följer REST-konventioner och använder JSON för alla förfrågnings- och svarsinstanser.

BAS URL

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

Skicka alla förfrågningar till denna bas-URL följt av den specifika slutpunktssökvägen. Bas-URLen är grunden för att interagera med Fabrixa API - hämta, skapa, uppdatera eller ta bort resurser.

INNAN DIN FÖRSTA BEGÄRAN

Autentisering

För att komma åt Integration API, autentisera dina förfrågningar med både en Application Access Token och en Application Key:

Auktoriseringshuvud
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Applikationsnyckelhuvud
X-Application-Key: APPLICATION_KEY
Exempel cURL-kommando
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'

Ersätt APPLICATION_ACCESS_TOKEN med din faktiska åtkomsttoken och APPLICATION_KEY med din faktiska applikationsnyckel.

HUR SVAREN ÄR STRUKTURERADE

Slutpunkter och förfrågningar

Integration API-slutpunkterna är organiserade efter resurstyp och följer den arkitektoniska stilen RESTful. Varje slutpunkt representerar en resurs, och åtgärder på dessa resurser utförs med vanliga HTTP-metoder.

Alla Integration API-förfrågningar och svar är i JSON-format, vilket ger ett konsekvent och lättanvänt gränssnitt för interaktion med API.

För fullständig information om varje endpoint, inklusive exempel på förfrågningar och svar, se vår Swagger-dokumentation.

Svarsformat

Alla endpoints returnerar data i ett standardiserat format med dessa objekt:

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

Beskrivning av svarsobjekt

links

Innehåller pagineringslänkar för att navigera genom resultaten.

  • self — webbadressen till den aktuella sidan.
  • first_page — webbadressen till den första resultatsidan.
  • last_page — webbadressen till den sista resultatsidan.
  • next_page — webbadressen till nästa sida. null om det inte finns någon nästa sida.
  • prev_page — webbadressen till föregående sida. null om det inte finns någon föregående sida.

meta

Innehåller metadata om svaret, till exempel sidnumreringsinformation.

  • total — det totala antalet artiklar som är tillgängliga på alla sidor.
  • current_page — det aktuella sidnumret för resultaten.
  • per_page — antalet objekt per sida.

data

Huvudinnehållet i svaret. data varierar beroende på slutpunkt - det kan vara ett enskilt objekt, till exempel en produkt, eller en uppsättning objekt, till exempel en lista med produkter.

NÄR NÅGOT GÅR FEL

Fel och statuskoder

Alla API-begäranden returnerar HTTP-statuskoder som ger insikt i svaret.

400 Bad Request

Servern kan inte behandla begäran på grund av valideringsfel - saknade eller ogiltiga parametrar.

401 Unauthorized

Klienten har inte angett giltiga autentiseringsuppgifter. Returneras även när åtkomsttoken har återkallats.

403 Forbidden

Servern nekade begäran på grund av otillräckliga åtkomsträttigheter, vanligtvis orsakad av felaktiga eller saknade åtkomstbehörigheter.

404 Not Found

Den begärda resursen kunde inte hittas på servern.

412 Precondition Failed

Förfrågan kan inte utföras i resursens nuvarande tillstånd, till exempel en beställning som inte längre kan avbrytas.

429 Too Many Requests

Klienten har överskridit det tillåtna antalet förfrågningar under en given tidsram. Se Rate Limits.

5xx Errors

Ett internt serverfel uppstod. Kontakta Fabrixas support med information om den misslyckade begäran.

Fel Response Body

Ett exempel på en felsvarskropp:

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

errors innehåller detaljer om vad som misslyckades. messages-matrisen listar felbeskrivningar. För en dålig begäran kommer du att få namnen på de fält som misslyckades med valideringen.

KÄNNA DINA FRÅGAN BEGRÄNSNINGAR

Prisgränser

Integration API stöder en gräns på 30 förfrågningar per applikation per minut.

Om du överskrider denna gräns kommer du att få ett 429 Too Many Requests svar.

Alla Integration API-svar inkluderar rubriken X-RateLimit-Remaining, hur många förfrågningar klienten fortfarande kan göra och rubriken X-RateLimit-Limit, det totala tillåtna antalet per minut.

TESTA INNAN DU GÅR LIVE

Sandlådeläge

Med sandlådeläge kan du testa din integration från början till slut innan någon riktig order produceras eller debiteras. Det gäller hela ditt konto: ordrar från alla försäljningskanaler, inklusive Integration API och anslutna Shopify- och WooCommerce-butiker, produceras inte och dras inte från ditt saldo. Ditt konto är i sandlådeläge så länge dess status är väntar på aktivering.

I sandlådeläge kan du:

För att testa ordrar lägger du till produkter från Fabrixa-katalogen: öppna en produkt, klicka på Sälj den här och välj varianter och designer. De visas sedan under Mina produkter.

För att växla ditt konto till sandlådeläge öppnar du Platform, går till Inställningar → Företag → Sandlådeläge och klickar på Växla till sandlådeläge. Du kan också aktivera det när du lägger till en ny försäljningskanal, inklusive en Integration API-kanal, eller mejla support@fabrixa.com så växlar vi ditt konto åt dig. Sandlådeläge är bara tillgängligt för aktiva konton.

När du är redo aktiverar du kontot själv i Platform under Inställningar → Företag → Sandlådeläge. Du kan också mejla support@fabrixa.com så aktiverar vi det åt dig. Dina anslutna butiker och API-uppgifter fortsätter fungera, så inget behöver konfigureras om.

Efter aktiveringen går alla nya ordrar till produktion och dras från ditt saldo. Ordrar som skapats före aktiveringen förblir testordrar: de produceras eller debiteras aldrig, inte ens efter aktiveringen.

HITTA VAD DU VILL SÄLJA

Produkter

Katalogen är allt som Fabrixa producerar. Dina produkter är de katalogprodukter du har lagt till i ditt Fabrixa-konto, med dina egna namn, beskrivningar, bilder och SKU:er. En orderrad anger en produktvariant - en storlek eller utförande av en produkt - via dess sku eller variant_id: en variant av en av dina produkter, eller en katalogvariant som beställs direkt.

VAD FABRIXA PRODUCERAR

Bläddra i katalogen

För att lista de produkter Fabrixa producerar skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/catalog/products med dina inloggningsuppgifter. Den listar de aktiva produkter som har en variant som en tryckpartner för närvarande producerar, och bara de varianterna, var och en med sin SKU, sitt försäljningspris, sina mått och sina alternativvärden.

Frågeparametrar

  • page och limit (upp till 100) - delar upp listan i sidor. Utan dem returneras hela katalogen i ett svar.
  • search - de produkter vars namn innehåller texten, eller vars slug eller variant-SKU börjar med den.
  • category_id - produkterna i en kategori; parent_category_id - produkterna i alla underkategorier till en toppkategori. Se Katalogkategorier.
  • group_id - produkterna i en kataloggrupp.
  • sort_by - name, created, updated, type, popular eller sold, i sort_order asc eller desc. Som standard kommer de nyaste produkterna först.

Exempelförfrågan

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'

Exempel på svar

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

Fält i svaret

  • id, name, subtitle, description (HTML), slug, code och HS_code, tullens varukod.
  • is_sellable - om produkten är öppen för försäljning. En stängd produkt listas fortfarande, men en order på en av dess varianter avvisas.
  • variants_min_selling_price och variants_max_selling_price - prisintervallet över de listade varianterna.
  • type - produkttypen, som bestämmer trycklagren och PDF-sidordningen; status - alltid Active i katalogen.
  • categories - de kategorier produkten finns i, var och en med sin parent_category.
  • images - produktbilderna, med url, is_main, screen_type_size och sort_number.
  • variants - de beställningsbara utförandena av produkten: id, name, subtitle, SKU, selling_price, måtten width, height, length och weight, samt options, de alternativvärden som utgör varianten, till exempel dess storlek.
HITTA RÄTT I KATALOGEN

Katalogkategorier

För att lista de kategorier katalogen är ordnad i skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/catalog/categories med dina inloggningsuppgifter. Svaret innehåller toppkategorierna, var och en med sina underkategorier nästlade i sub_categories och antalet katalogprodukter den innehåller i products_count. Skicka en kategoris id som category_id när du bläddrar i katalogen, eller en toppkategoris id som parent_category_id för att få produkterna i alla dess underkategorier på en gång.

Frågeparametrar

  • page och limit (upp till 100) - delar upp listan i sidor. Utan dem returneras alla kategorier.
  • search - de kategorier vars namn innehåller texten.
  • with_products_only - true utelämnar de kategorier som inte innehåller någon katalogprodukt, vare sig direkt eller i en underkategori.
  • sort_by - category_name eller category_created, i sort_order asc eller desc. Som standard kommer kategorierna i sin katalogordning.

Exempelförfrågan

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'

Exempel på svar

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

Dina produkter

För att lista produkterna på ditt konto skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/products med dina inloggningsuppgifter. Dina produkter är de katalogprodukter du har lagt till i ditt Fabrixa-konto: de bär de namn, beskrivningar och bilder du gav dem där, och deras varianter de SKU-värden du valde. Bara aktiva produkter listas, tio per sida om du inte skickar limit.

Frågeparametrar

  • page och limit (upp till 100) - sidan som ska returneras och dess storlek; som standard den första sidan med tio.
  • search - de produkter vars namn innehåller texten, eller vars slug eller variant-SKU börjar med den.

Exempelförfrågan

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'

Exempel på svar

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

För att läsa en enskild produkt skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/products/{product_id}, där {product_id} är dess id. Svaret innehåller samma fält som listan. En produkt som inte finns på ditt konto, även en katalogprodukt, svarar 404 Not Found med meddelandet Product not found.

Fält i svaret

  • id, name, subtitle, description (HTML), slug, width, height, length och weight.
  • type - produkttypen, som bestämmer trycklagren och PDF-sidordningen.
  • available_options - varje alternativ för produkten med alla dess värden, till exempel varje storlek den finns i; varje variant tar ett värde per alternativ.
  • categories och collections - de kategorier och kollektioner du sorterat in produkten i i ditt konto.
  • images - produktbilderna, med url, is_main, image_size, screen_type_size och sort_number.
  • variants - de beställningsbara utförandena av produkten, se Produktvarianter: id, name, subtitle, SKU, options, images och trycklagren i available_source_types och required_source_types.
VAD EN ORDERRAD ANGER

Produktvarianter

En variant är ett beställningsbart utförande av en produkt - en storlek, en färg - och det som en orderrad anger, via sku eller variant_id. För att läsa en variant av en av dina produkter skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/variants/{variant_id}, där {variant_id} är dess id. En variant av en produkt som inte finns på ditt konto svarar 404 Not Found med meddelandet Variant not found.

Exempelförfrågan

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'

Exempel på svar

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

Fält i svaret

  • id, name, subtitle, description, SKU, width, height, length, weight, options, images och den product varianten tillhör.
  • available_source_types - variantens trycklager, namngivna som dess produktionsprocess känner dem. Utöver "file", som varje variant tar emot för en PDF, är det de värden en källfils type får ha; en produkt med ett enda trycklager listar "print".
  • required_source_types - de lager en tryckfil måste täcka. En PDF som skickas som "file" täcker dem med sina sidor, i produkttypens sidordning. Annars behöver raden en JPEG-, PNG- eller TIFF-fil för vart och ett av dem, med lagrets namn som type; en rad där ett saknas avvisas med 400 Bad Request och namnen på de saknade lagren.

En orderrad för den här varianten, med en PDF vars sidor är dess lager:

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

Vilka varianter kan beställas

  • En orderrad får ange en variant av en produkt på ditt konto, eller en katalogvariant direkt, aldrig en produkt som tillhör en annan kund. Varianten hittas via sitt variant_id, eller via sin sku oavsett stora eller små bokstäver.
  • Varianten måste vara aktiv, och dess produkt aktiv och öppen för försäljning. För din kopia av en katalogprodukt måste även katalogprodukten vara aktiv och katalogvarianten påslagen.
  • Annars avvisas ordern med 400 Bad Request och orsaken för raden i fråga: 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. eller The catalog variant is not active.
SKAPA OCH SPÅRA BESTÄLLNINGAR

Order

Skapa beställningar i Fabrixa från ditt eget skyltfönster eller plattform, bifoga de nödvändiga utskriftsfilerna och följ varje artikel när den går igenom uppfyllelsen.

FÖRBERED DINA BESTÄLLNINGSDATA

Skapa en beställning

För att skapa en beställning via Fabrixa Integration API, skicka en POST-förfrågan till https://api.fabrixa.com/v2/integration/orders. Begäran måste innehålla:

Begär kroppsstruktur

  • number (valfritt) - ordernumret. Om det inte anges genereras ett unikt nummer.
  • comments (valfritt) - ytterligare kommentarer eller anteckningar för ordern.
  • purchased_at - datum och tid då ordern köptes, formaterat som YYYY-MM-DD HH:MM:SS.
  • client_ip (valfritt) - kundens IP-adress.
  • client_user_agent (valfritt) - kundens user-agent-sträng.
  • rows - array med orderrader, varje rad innehåller:
    • sku - produktvariantens SKU. Se Swagger för detaljer.
    • quantity - antal beställda produktvarianter.
    • client_barcode (valfritt) - unik klientidentifierare per orderrad, formaterad som Code 128.
    • cart_item_key (krävs utan sources) - unik identifierare från plattformen som bäddar in Fabrixa Studio, används för att koppla sparade anpassningar till ordern.
    • sources (krävs utan cart_item_key) - array med källfiler kopplade till produkten, varje fil innehåller:
      • type - "file" för en PDF, eller "print" för en JPEG-, PNG- eller TIFF-fil.
      • url - URL till källfilen.
  • customer - kunduppgifter:
    • first_name, last_name, email, phone.
  • shipping_address - leveransuppgifter:
    • address, address2 (valfritt), address3 (valfritt).
    • city, country_code (ISO 3166-2), country, postal_code, state (valfritt).
    • first_name, last_name, phone (valfritt), company (valfritt).
  • shipping_label (valfritt) - etikettuppgifter:
    • method_name - t.ex. "Post NL".
    • tracking_number, tracking_url, label_pdf_url.
    • date_created - formaterat som YYYY-MM-DD HH:MM:SS.

Exempelförfrågan

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

Exempel på svar

{
    "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"
        }
    }
}
ÄNDRA BESTÄLLNINGSUPPGIFTER

Uppdatera en beställning

För att uppdatera en beställning, skicka en PATCH-förfrågan till https://api.fabrixa.com/v2/integration/orders/{order_id}, där {order_id} är beställningens Fabrixa-id. Bara de fält du skickar ändras, och beställningens status förblir densamma. Svaret innehåller den uppdaterade beställningen. Du kan ändra:

  • number, comments, purchased_at, client_ip, client_user_agent.
  • customer - first_name, last_name, email, phone.
  • shipping_address - samma fält som när du skapar en beställning.

Exempelförfrågan

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

Exempel på svar

{
    "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"
        }
    }
}
  • Beställningsrader kan inte ändras: en förfrågan med rows avvisas med 400 Bad Request. För att ändra artiklarna, avbryt beställningen och skapa en ny.
  • En beställning med status on hold kan inte uppdateras; API:et svarar med 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."
        ]
    }
}
STOPPA EN BESTÄLLNING

Avbryt en beställning

För att avbryta en beställning, skicka en POST-förfrågan utan body till https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, där {order_id} är beställningens Fabrixa-id (beställningens numeriska id-fält), inte ditt beställningsnummer. Svaret innehåller beställningen med statusen canceled, och en order.updated-webhook skickas.

  • En beställning kan avbrytas så länge dess status är created, imported, accepted eller on hold och dess fulfillment_status fortfarande är unfulfilled. När den blir scheduled har produktionen startat och beställningen kan inte längre avbrytas.
  • Avgifterna för en avbruten beställning återbetalas till ditt saldo.
  • Att avbryta en beställning som redan är avbruten returnerar den oförändrad, så förfrågan kan tryggt upprepas.

Exempel på svar

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

Om beställningen inte kan avbrytas svarar API:et med 412 Precondition Failed och ett meddelande med orsaken: dess nuvarande status tillåter det inte (statusen anges i meddelandet), eller så har produktionen redan startat.

{
    "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)."
        ]
    }
}
FRÅN IMPORT TILL LEVERANS

Orderns livscykel

En order följs med tre statusar: orderns status, dess produktionsstatus fulfillment_status och status för varje försändelse i shipments. Varje ändring skickas i webhooken order.updated och returneras av GET /orders/{order_id}.

Orderstatus

Värdena i fältet status för en order, i den ordning de nås:

Uppfyllelsestatusar

Värdena i fältet fulfillment_status för en order och för varje orderrad, i den ordning de nås. Den rör sig bara framåt, aldrig bakåt:

En order som helhet avvisas aldrig. En enskild artikel kan avvisas i kvalitetskontrollen under produktionen. Den trycks då om: den återgår till unfulfilled och går igenom produktionen en gång till, medan ordern behåller sin status och fortsätter när artikeln är klar.

Leveransstatusar

Värdena i fältet status för varje försändelse i shipments, i den ordning de nås:

Undantag:

SPÅRA DINA BESTÄLLNINGSVAROR

Spåruppfyllelse

För att få uppfyllelsestatus för en specifik beställning, skicka en GET-förfrågan till https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. Svaret ger en lista över uppfyllelser som är associerade med beställningen, inklusive varje artikelstatus, produktinformation och framsteg i produktionssteg.

Exempel på svar

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

Svaret innehåller en lista över uppfyllelser, som var och en innehåller:

  • id - unik identifierare för fulfilment.
  • barcode - streckkod för intern spårning och identifiering; kan också tryckas på produkten.
  • status - aktuell fulfilment-status: unfulfilled eller fulfilled.
  • created_at och updated_at - tidsstämplar för skapande och senaste uppdatering.
  • variant - detaljerad information om produktvarianten: namn, undertitel, SKU.
  • product - produktinformation: namn, undertitel.
  • production_steps - array med produktionssteg. Listan beror på produkttypen. För varje steg:
    • id - unik identifierare för produktionssteget.
    • name - t.ex. "Print duvet".
    • description - vad produktionssteget innebär.
    • status - aktuell status:
      • pending - ännu inte startat.
      • in progress - pågår.
      • rejected - steget fick ett problem och slutfördes inte.
      • done - steget är slutfört.
    • notes - eventuella ytterligare anteckningar för steget.
    • updated_at - senaste gången stegstatusen uppdaterades.

Varje uppfyllnadspost motsvarar en specifik produkt eller produktvariant inom beställningen, och varje kopia av produkten i beställningen har sin egen uppfyllnadspost - varje artikel spåras individuellt genom hela produktionen.

Om inga uppfyllelser returneras för en beställning har beställningen ännu inte kommit in i behandlingsstadiet.

HUR MAN TILLHANDAHÅLLER UTSKRIFTSFILER

Källfilskrav

När du inkluderar källfiler i din beställning, se till att de uppfyller följande krav:

type

PDF är det föredragna källformatet. För en produkt med ett tryckskikt, till exempel en filt eller en handduk, fungerar även en JPEG-, PNG- eller TIFF-fil. För en produkt med flera skikt lämnar du en PDF-fil med varje skikt på en egen sida: vid bearbetningen behandlas varje sida som ett eget skikt, så en design med flera skikt skickas in som en enda källfil. Se PDF-krav och sidordning.

Ange type efter filformatet. För en PDF använder du "file": varje sida trycks på ett skikt av produkten, i den sidordning som anges för produkten. För en JPEG-, PNG- eller TIFF-fil, som passar en produkt med ett tryckskikt, använder du "print".

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

För mer information, se Swagger-dokumentationen.

url

Fältet url måste innehålla en direktlänk till källfilen. Se till att webbadressen är tillgänglig och att filen kan laddas ner utan autentisering. Länken måste vara tillgänglig under hela produktionsprocessen.

Så hämtar vi filen

Vi laddar ner filen från din server två gånger: en förfrågan med Range: 0-0 medan beställningen valideras, och sedan hela filen. Båda förfrågningarna skickar User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); om din webbplats filtrerar automatiserad trafik, tillåt den. URL:en måste använda HTTPS på port 443 och returnera filen direkt, utan omdirigeringar, med filens verkliga Content-Type, till exempel application/pdf. Varje förfrågan avbryts efter 60 sekunder.

Filformat

Lämna en PDF-fil eller, för en produkt med ett skikt, en JPEG-, PNG- eller TIFF-fil, som serveras med sin verkliga Content-Type. Genomskinliga ytor i en PNG trycks vita. Se till att bilderna håller hög kvalitet och lämpar sig för tryck.

Bildmått

Maximala mått är 15,000 pixels på vardera sidan. Bilder som överskrider denna gräns kan ändras i storlek eller avvisas. Bildupplösningen bör matcha produktens dimensioner; Annars kan bilderna ändras eller beskäras så att de passar.

Upplösning

Inga specifika upplösningskrav - se bara till att bildkvaliteten är tillräcklig för utskrift.

Färgrymd

Bilder bör vara i RGB färgrymd för korrekt färgrepresentation. Andra färgrymder kommer att konverteras under bearbetningen, vilket kan resultera i felaktiga färger.

Fil-storlek

Varje källfil får vara högst 200 MB. En större fil avvisas: när beställningen skapas om din server skickar Content-Length, annars när filen laddas ner.

PDF-krav och sidordning

Ordningen på sidorna i PDF:en är viktig. Sidorna matchas till produktlager efter position, och den förväntade sidordningen beror på produkttypen. Se till att sidorna i din PDF följer rätt lagersekvens för produkten du skickar in.

ProduktPDF sidordning
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

Viktigt: varje PDF-sida måste matcha de nödvändiga måtten för sitt produktlager och vara korrekt orienterad. Placera konstverket så att toppen av designen är i linje med toppen av sidan. Felaktig sidstorlek eller orientering kan orsaka problem med skalning, rotation eller justering i produktionen.

PLANERA LEVERANSEN

Frakt

Ta reda på vad frakten för en beställning kostar och hur länge den är på väg innan du lägger den, beräknat enligt samma regler som Fabrixa tillämpar på själva beställningen.

VART DEN SKICKAS

Leveransländer

För att ta reda på vilka länder en produktvariant kan skickas till skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/shipping/countries med dina inloggningsuppgifter. Listan innehåller de länder dit den plats som producerar varianten har ett fraktpris för en fraktförpackning som varianten kan packas i, sorterade efter namn. Ett land som inte finns med i listan har inget fraktpris för varianten.

Frågeparametrar

  • variant_id eller sku - varianten, angiven som på en orderrad, precis som för en uppskattning.

Exempelförfrågan

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'

Exempel på svar

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

Fält i svaret

  • code och name - landet, med landskoden enligt ISO 3166-1 alpha-2 som du skickar som country_code till uppskattningen.
  • min_shipping_price och max_shipping_price - intervallet för vad en enda fraktförpackning kostar att skicka till landet, exklusive moms, i den valuta som anges i currency, för de olika förpackningar som varianten kan packas i. En order med flera enheter kan behöva flera paket, så be om en uppskattning för priset på ett visst antal.
  • min_eta_days och max_eta_days - intervallet för antalet dagar som ett paket är på väg efter att det har lämnats över till transportören, produktionstiden ej inräknad; null när fraktpriserna saknar leveransuppskattning.
INNAN DU BESTÄLLER

Uppskatta frakt

För att ta reda på vad frakten för en produktvariant skulle kosta och hur länge försändelsen skulle vara på väg skickar du en GET-förfrågan till https://api.fabrixa.com/v2/integration/shipping/estimate med dina inloggningsuppgifter. Uppskattningen följer samma regler som en order prissätts efter: enheterna packas i fraktförpackningarna hos den plats som producerar varianten, och varje paket prissätts längs rutten från den platsen till destinationslandet. Ingenting beställs eller reserveras, och en order prissätts när den läggs, så fraktkostnaden kan bli en annan om fraktpriserna ändras under tiden.

Frågeparametrar

  • variant_id eller sku - varianten, angiven som på en orderrad: en variant av en av dina produkter, eller en katalogvariant. Det måste vara en variant som du kan beställa.
  • country_code - landskoden enligt ISO 3166-1 alpha-2 för det land som ordern skickas till, till exempel NL.
  • quantity - antalet enheter, från 1 till 1000.

Exempelförfrågan

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'

Exempel på svar

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

Fält i svaret

  • variant_id, sku, quantity och country_code - varianten, antalet och destinationen som uppskattningen gäller för.
  • origin_country - landet som varianten skickas från, med dess code och name.
  • packages_count - antalet paket som enheterna packas i.
  • packages - själva paketen, en post per pakettyp: package_type, dess length, width och height i cm, quantity av sådana paket, price för att skicka ett av dem och dess eta_days. Priserna gånger antalen blir tillsammans shipping_price.
  • shipping_price - fraktpriset för alla paket tillsammans, exklusive moms, i den valuta som anges i currency. På en rutt utan fraktpris är frakten gratis, precis som för en order, och priset blir 0.00.
  • eta_days - antalet dagar som det långsammaste paketet är på väg efter att det har lämnats över till transportören, produktionstiden ej inräknad; null när rutten saknar leveransuppskattning.

En förfrågan som inte klarar valideringen besvaras med 400 Bad Request och orsaken för varje fält, med samma meddelanden som för en orderrad, till exempel The variant not found. När ingen fraktförpackning kan rymma enheterna blir svaret 400 Bad Request med meddelandet No shipping package can carry the variant.

PRODUKTANPASSNING

Fabrixa Studio

Fabrixa Studio är ett verktyg som låter användare sömlöst anpassa och personifiera produkter i realtid med ett intuitivt gränssnitt där användare kan skapa eller ladda upp sina egna mönster.

Fabrixa Studio är idealisk för företag som erbjuder skräddarsydda produkter - vilket gör det möjligt för kunder att visualisera sin design innan de slutför beställningar.

LÄGG TILL STUDIO I DIN BUTIK

Bädda in Fabrixa Studio

Du kan bädda in Fabrixa Studio på din webbplats med en iframe. Detta gör det möjligt för dina kunder att anpassa produkter direkt på din webbplats under kassan.

Exempel på iframe för inbäddning av 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>

Ersätt värdena för product_sku, cart_item_key och application_key med dina dynamiska värden.

Studios sidhuvud visar produktens namn så som det står i din butik - samma titel som dina kunder ser - med den valda variantens alternativ under. Det är butikens egen kopia av produkten, så ett namn du ändrar i Fabrixa visas också i Studio; locale översätter det inte.

Begäran om att skapa en beställning med 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": {
    "...": "..."
  }
}
LYSSNA EFTER KUNDÅTGÄRDER

Hantera studioevenemang

När knappen Lägg till i kundvagn klickas inuti iframen, körs följande kommando:

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

På samma sätt, när knappen Back klickas:

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

Metoden postMessage underlättar kommunikation mellan iframen och dess överordnade fönster, vilket gör att den kan meddela föräldern om specifika användaråtgärder.

Det första argumentet för postMessage är den data du vill skicka. Strängen 'customizationFinished' indikerar att användaren har slutfört anpassningen och lägger till produkten i kundvagnen. 'closeButtonClicked' indikerar att användaren har valt att gå tillbaka.

I det överordnade fönstret, lyssna efter dessa meddelanden med message händelseavlyssnaren:

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

Kontrollera alltid origin för inkommande meddelanden för att säkerställa att de kommer från en pålitlig källa. Beroende på det mottagna meddelandet, utför nödvändiga åtgärder - uppdatera användargränssnittet, bearbeta vagnen, etc. Validering av origin är avgörande för säkerheten - det förhindrar obehöriga skript från att interagera med din applikation.

VISA DEN FÄRDIGA DESIGNEN

Förhandsvisning av anpassning

När anpassningen är klar visar du den slutliga designen med förhandsgranskningsadressen nedan. Denna URL returnerar en bild av den anpassade produkten, lämplig som src-värdet i en <img>-tagg. Idealisk för att visa den skräddarsydda produkten i din kundvagn, beställningssammanfattning eller var som helst i ditt butiksgränssnitt.

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

Ersätt {CART_ITEM_KEY} med den faktiska varukorgsnyckeln och {APPLICATION_KEY} med din giltiga applikationsnyckel.

Exempel på användning i en bildtagg:

<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;" />
PROVA MED DINA VÄRDERINGAR

Live Demo

Anpassningsförhandsgranskningen visas här när designen är klar.

Customization preview
FÅ UPPDATERINGAR AV HÄNDELSER

Webhooks

Webhooks används av Fabrixa för att meddela ditt system om händelser i realtid - beställ uppdateringar eller skapelser. När en händelse inträffar skickar Fabrixa en webhook till din server som innehåller relevant information. Din server måste exponera en offentlig POST-slutpunkt för att hantera inkommande webhooks.

GRANSKA DINA INKOMMANDE HEADERS

Webhook Request Headers

Webhook-begäran innehåller följande rubriker för att hjälpa dig att identifiera och validera den inkommande begäran:

{
  "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"
}
Rubrikfördelning

Webhooks skickas med User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); om din endpoint filtrerar automatiserad trafik, tillåt den. För att vara säker på att en förfrågan kommer från Fabrixa, verifiera x-webhook-signature.

VÄLJ DINA EVENTÄMNEN

Webhook-evenemang

Fabrixa webhooks meddelar ditt system om ändringar i orderstatus eller aktivitet. Varje webhook triggas av ett specifikt x-webhook-topic-värde. Ämnen som stöds för närvarande:

ÄmneBeskrivning
order.created Utlöses när en ny beställning görs i Fabrixa, antingen via API-förfrågan eller direkt i plattformen.
order.updated Utlöses när beställningsinformation som beställningsstatus eller leveransstatus uppdateras.
KONTROLLERA DIN EVENEMANGSNYTTSLAST

Webhook Payload Exempel

Ett exempel på nyttolasten som skickas med webhook. Denna nyttolast representerar en orderuppdatering:

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

När beställningen har skickats listar shipments varje försändelse med transportör (carrier), fraktsätt (method), status (status: pending, registered, collected, in transit, delivered, failed, returned eller canceled) och spårning: tracking_number och tracking_url, och samma sak för varje paket i packages när en försändelse har flera. En order.updated-webhook skickas varje gång en försändelses status eller spårning ändras, och GET /orders/{order_id} returnerar samma fält.

VERIFIERA DIN WEBHOOK-KÄLLA

Verifiera Webhook-signaturer

För att säkerställa att webhook-begäran är äkta och opåverkad, verifiera rubriken x-webhook-signature. Detta innebär att man räknar om HMAC-SHA256-signaturen med hjälp av den råa begäranden nyttolasten och din hemliga nyckel och sedan jämför den med den mottagna signaturen.

Exempel på rå PHP

$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 exempel

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

Ersätt $yourSecret med din delade hemliga nyckel. Använd alltid hash_equals för att jämföra signaturer för att mildra timingattacker.

VAD OM LEVERANS MISSLYCKAS?

Webhook försöker igen

Webhooks är inaktiverat efter 10 misslyckade leveransförsök som standard. Om din slutpunkt returnerar en misslyckad status som 404 eller något 5xx-fel, kommer webhooken att försöka igen totalt 10 gånger. Om den fortsätter att returnera en icke-2xx eller icke-3xx svarskod, kommer den att avaktiveras. Framgångsrika svar inkluderar:

TILLBAKA ETT TYDLIGT SVAR

Webhook svar

Vi rekommenderar starkt att din slutpunkt returnerar en 200 OK-statuskod så snabbt som möjligt för att bekräfta mottagandet av webhook. Även om alla 2xx- eller 3xx-svar anses vara framgångsrika, är 200 det vanligaste och mest pålitliga.

För att undvika tidsgränser för leverans eller omförsök, returnera 200 OK omedelbart och hantera webhook-nyttolasten asynkront, till exempel via ett bakgrundsjobb eller kö. Om din slutpunkt tar för lång tid att svara kan det anses vara ett misslyckande även om svaret i slutändan är framgångsrikt.

Svar med statuskoder i intervallet 4xx eller 5xx, eller timeouts, kommer att utlösa omförsök enligt mekanismen för återförsök.