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.
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.
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.nullom det inte finns någon nästa sida.prev_page— webbadressen till föregående sida.nullom 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.
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.
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.
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:
- ansluta din Shopify- eller WooCommerce-butik eller skapa en Integration API-kanal;
- lägga till produkter och kontrollera priser och fraktuppskattningar;
- importera, skapa, uppdatera och avbryta ordrar;
- se att ingen av dessa ordrar produceras eller dras från ditt saldo;
- kontrollera leverans av webhooks och signaturer.
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.
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.
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
pageochlimit(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-SKUbö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,popularellersold, isort_orderascellerdesc. 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,codeochHS_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_priceochvariants_max_selling_price- prisintervallet över de listade varianterna.type- produkttypen, som bestämmer trycklagren och PDF-sidordningen;status- alltidActivei katalogen.categories- de kategorier produkten finns i, var och en med sinparent_category.images- produktbilderna, medurl,is_main,screen_type_sizeochsort_number.variants- de beställningsbara utförandena av produkten:id,name,subtitle,SKU,selling_price, måttenwidth,height,lengthochweight, samtoptions, de alternativvärden som utgör varianten, till exempel dess storlek.
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
pageochlimit(upp till 100) - delar upp listan i sidor. Utan dem returneras alla kategorier.search- de kategorier vars namn innehåller texten.with_products_only-trueutelämnar de kategorier som inte innehåller någon katalogprodukt, vare sig direkt eller i en underkategori.sort_by-category_nameellercategory_created, isort_orderascellerdesc. 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
}
]
}
]
}
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
pageochlimit(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-SKUbö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,lengthochweight.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.categoriesochcollections- de kategorier och kollektioner du sorterat in produkten i i ditt konto.images- produktbilderna, medurl,is_main,image_size,screen_type_sizeochsort_number.variants- de beställningsbara utförandena av produkten, se Produktvarianter:id,name,subtitle,SKU,options,imagesoch trycklagren iavailable_source_typesochrequired_source_types.
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,imagesoch denproductvarianten 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ällfilstypefå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 somtype; en rad där ett saknas avvisas med400 Bad Requestoch 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 sinskuoavsett 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 Requestoch 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.ellerThe catalog variant is not active.
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.
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 somYYYY-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 somCode 128.cart_item_key(krävs utansources) - unik identifierare från plattformen som bäddar in Fabrixa Studio, används för att koppla sparade anpassningar till ordern.sources(krävs utancart_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 somYYYY-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"
}
}
}
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
rowsavvisas med400 Bad Request. För att ändra artiklarna, avbryt beställningen och skapa en ny. - En beställning med status
on holdkan inte uppdateras; API:et svarar med412 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."
]
}
}
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,acceptedelleron holdoch dessfulfillment_statusfortfarande ärunfulfilled. När den blirscheduledhar 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)."
]
}
}
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:
imported- ordern har tagits emot via API:et. Alla ordrar börjar här.on hold- saldot täcker inte kostnaden för ordern. När det har fyllts på återgår ordern tillimportedoch fortsätter.accepted- ordern har godkänts och skickas till produktion.completed(slutgiltig) - alla artiklar har producerats.canceled(slutgiltig) - ordern har avbrutits. Det är möjligt så länge den ärimported,acceptedelleron holdoch produktionen ännu inte har startat.
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:
unfulfilled- produktionen har inte startat.scheduled- ordern är planerad i en produktionsbatch. Från och med nu kan den inte längre avbrytas.processing- produktionen pågår.partially fulfilled- vissa artiklar är klara, resten är fortfarande i produktion.fulfilled(slutgiltig) - alla artiklar är klara. Ordernsstatusblir dåcompleted.
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:
pending- försändelsen förbereds.registered- etiketten har skapats hos transportören.collected- transportören har hämtat paketet.in transit- paketet är på väg.delivered(slutgiltig) - paketet har levererats.
Undantag:
failed- transportören har rapporterat ett problem.returned(slutgiltig) - paketet har returnerats till oss.canceled(slutgiltig) - försändelsen har avbrutits.
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_atochupdated_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.
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.
| Produkt | PDF sidordning |
|---|---|
| Duvet Cover |
|
| Curtains |
|
| T-shirt |
|
| Tanktop |
|
| Sweater |
|
| Hoodie |
|
| Sweatpants |
|
| Sweatshorts |
|
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.
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.
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_idellersku- 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
codeochname- landet, med landskoden enligt ISO 3166-1 alpha-2 som du skickar somcountry_codetill uppskattningen.min_shipping_priceochmax_shipping_price- intervallet för vad en enda fraktförpackning kostar att skicka till landet, exklusive moms, i den valuta som anges icurrency, 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_daysochmax_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;nullnär fraktpriserna saknar leveransuppskattning.
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_idellersku- 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 exempelNL.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,quantityochcountry_code- varianten, antalet och destinationen som uppskattningen gäller för.origin_country- landet som varianten skickas från, med desscodeochname.packages_count- antalet paket som enheterna packas i.packages- själva paketen, en post per pakettyp:package_type, desslength,widthochheighti cm,quantityav sådana paket,priceför att skicka ett av dem och desseta_days. Priserna gånger antalen blir tillsammansshipping_price.shipping_price- fraktpriset för alla paket tillsammans, exklusive moms, i den valuta som anges icurrency. På en rutt utan fraktpris är frakten gratis, precis som för en order, och priset blir0.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;nullnä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.
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.
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.
application_key- unik nyckel för autentisering till integrations-API.product_sku- produktvariantens SKU, hämtad från integrations-API:et.cart_item_key- ett unikt värde som är associerat med produktens bilbeläggningsplattform som identifierar inbäddningsplattformen Används för att spara användaranpassningarna; under orderskapandet identifierar den de sparade anpassningarna och tilldelar dem till ordern. Se exempel nedan.locale(valfri) - språket i Studios gränssnitt och felmeddelanden, t.ex.de_DEellerde. Utan den öppnas Studio på köparens webbläsarspråk om det stöds, annars på engelska.
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": {
"...": "..."
}
}
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.
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;" />
Live Demo
Anpassningsförhandsgranskningen visas här när designen är klar.
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.
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
content-type- alltid inställd påapplication/jsonför webhooks.x-webhook-signature- HMAC-SHA256-signaturen för begäran om verifiering.x-webhook-topic- av evenemangstypen eller.topic. Till exempel:order.created- utlöses när en ny order skapas.order.updated- utlöses när en befintlig order uppdateras.
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.
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:
| Ämne | Beskrivning |
|---|---|
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. |
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 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.
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:
2xx- indikerar framgångsrik bearbetning, t.ex.200 OK.301och302- omdirigeringssvar som indikerar att webhook har hanterats eller vidarebefordrats.
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.