Fabrixa Integration API-reference
31 min læst Sidst opdateret:06-11-2026 119 visninger
Integrations-API'en hjælper dig med at oprette og administrere Fabrixa-ordrer, starte Fabrixa Studio og forblive synkroniseret med produktions- og opfyldelsesstatus via webhooks. API'en følger REST-konventioner og bruger JSON til alle anmodnings- og svarinstanser.
BASE URL
https://api.fabrixa.com/v2/integration
Send alle anmodninger til denne basis-URL efterfulgt af den specifikke slutpunktsti. Basis-URL'en er grundlaget for interaktion med Fabrixa API - hentning, oprettelse, opdatering eller sletning af ressourcer.
Autentificering
For at få adgang til Integration API skal du godkende dine anmodninger ved hjælp af både et Application Access Token og en Application Key:
Autorisationshoved
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Applikationsnøglehoved
X-Application-Key: APPLICATION_KEY
Eksempel på 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'
Erstat APPLICATION_ACCESS_TOKEN med dit faktiske adgangstoken og APPLICATION_KEY med din faktiske applikationsnøgle.
Slutpunkter og anmodninger
Integration API-endepunkterne er organiseret efter ressourcetype og følger den RESTful-arkitektoniske stil. Hvert slutpunkt repræsenterer en ressource, og handlinger på disse ressourcer udføres ved hjælp af standard HTTP-metoder.
Alle Integration API-anmodninger og -svar er i JSON-format, hvilket giver en ensartet og brugervenlig grænseflade til interaktion med API'en.
For fulde detaljer om hvert endpoint, inklusive eksempler på requests og responses, se vores Swagger-dokumentation.
Svarformat
Alle endepunkter returnerer data i et standardiseret format med disse objekter:
{
"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"
}
]
}
Beskrivelse af svarobjekter
links
Indeholder sideinddelingslinks til at navigere gennem resultaterne.
self— URL'en på den aktuelle side.first_page— URL'en på den første side med resultater.last_page— URL'en på den sidste side med resultater.next_page— URL'en på den næste side.nullhvis der ikke er nogen næste side.prev_page— URL'en på den forrige side.nullhvis der ikke er nogen tidligere side.
meta
Indeholder metadata om svaret, såsom pagineringsoplysninger.
total— det samlede antal tilgængelige varer på alle sider.current_page— det aktuelle sidenummer for resultaterne.per_page— antallet af varer pr. side.
data
Hovedindholdet i svaret. data varierer efter slutpunkt - det kan være et enkelt objekt, for eksempel et produkt, eller en række objekter, for eksempel en liste over produkter.
Fejl og statuskoder
Alle API-anmodninger returnerer HTTP-statuskoder, der giver indsigt i svaret.
400 Bad Request
Serveren kan ikke behandle anmodningen på grund af valideringsfejl - manglende eller ugyldige parametre.
401 Unauthorized
Klienten har ikke angivet gyldige godkendelsesoplysninger. Returneres også, når adgangstokenet er blevet tilbagekaldt.
403 Forbidden
Serveren afviste anmodningen på grund af utilstrækkelige adgangsrettigheder, typisk forårsaget af forkerte eller manglende adgangstilladelser.
404 Not Found
Den anmodede ressource kunne ikke findes på serveren.
412 Precondition Failed
Anmodningen kan ikke udføres i ressourcens nuværende tilstand, for eksempel en ordre, der ikke længere kan annulleres.
429 Too Many Requests
Klienten har overskredet det tilladte antal anmodninger i en given tidsramme. Se Rate Limits.
5xx Errors
Der opstod en intern serverfejl. Kontakt venligst Fabrixas support med detaljer om den mislykkede anmodning.
Error Response Body
Et eksempel på en fejlsvartekst:
{
"links": {
"self": "https://api.fabrixa.com/v2/integration/ping"
},
"meta": [],
"errors": {
"messages": [
"Application Key is not specified."
]
}
}
errors indeholder detaljer om, hvad der fejlede. messages-arrayet viser fejlbeskrivelser. For en dårlig anmodning vil du modtage navnene på de felter, der mislykkedes ved validering.
Satsgrænser
Integrations-API'en understøtter en grænse på 30 anmodninger pr. applikation pr. minut.
Hvis du overskrider denne grænse, vil du modtage et 429 Too Many Requests svar.
Alle Integration API-svar inkluderer X-RateLimit-Remaining-headeren, hvor mange anmodninger klienten stadig kan lave, og X-RateLimit-Limit-headeren, det samlede tilladte antal pr. minut.
Sandkassetilstand
Sandkassetilstand lader dig teste din integration fra start til slut, før en rigtig ordre produceres eller debiteres. Den gælder hele din konto: ordrer fra alle salgskanaler, inklusive Integration API og tilsluttede Shopify- og WooCommerce-butikker, produceres ikke og trækkes ikke fra din saldo. Din konto er i sandkassetilstand, så længe dens status er afventer aktivering.
I sandkassetilstand kan du:
- tilslutte din Shopify- eller WooCommerce-butik eller oprette en Integration API-kanal;
- tilføje produkter og tjekke priser og forsendelsesestimater;
- importere, oprette, opdatere og annullere ordrer;
- se, at ingen af disse ordrer produceres eller trækkes fra din saldo;
- kontrollere levering af webhooks og signaturer.
For at teste ordrer skal du tilføje produkter fra Fabrixa-kataloget: åbn et produkt, klik på Sælg dette og vælg varianter og designs. De vises derefter under Mine produkter.
Sådan skifter du din konto til sandkassetilstand: Åbn Platform, gå til Indstillinger → Virksomhed → Sandkassetilstand, og klik på Skift til sandkassetilstand. Du kan også aktivere den, når du tilføjer en ny salgskanal, inklusive en Integration API-kanal, eller skrive til support@fabrixa.com, så skifter vi din konto for dig. Sandkassetilstand er kun tilgængelig for aktive konti.
Når du er klar, kan du selv aktivere din konto i Platform under Indstillinger → Virksomhed → Sandkassetilstand. Du kan også skrive til support@fabrixa.com, så aktiverer vi den for dig. Dine tilsluttede butikker og API-legitimationsoplysninger fortsætter med at virke, så intet skal konfigureres igen.
Efter aktivering går alle nye ordrer i produktion og trækkes fra din saldo. Ordrer oprettet før aktivering forbliver testordrer: de produceres eller debiteres aldrig, heller ikke efter aktivering.
Produkter
Kataloget er alt, hvad Fabrixa producerer. Dine produkter er de katalogprodukter, du har føjet til din Fabrixa-konto, med dine egne navne, beskrivelser, billeder og SKU'er. En ordrelinje angiver en produktvariant - én størrelse eller udgave af et produkt - via dens sku eller variant_id: en variant af et af dine produkter eller en katalogvariant, der bestilles direkte.
Gennemse kataloget
For at hente de produkter, Fabrixa producerer, sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/catalog/products med dine loginoplysninger. Det viser de aktive produkter, der har en variant, som en trykpartner i øjeblikket producerer, og kun de varianter, hver med sin SKU, salgspris, mål og optionsværdier.
Forespørgselsparametre
pageoglimit(op til 100) - deler listen op i sider. Uden dem returneres hele kataloget i ét svar.search- de produkter, hvis navn indeholder teksten, eller hvis slug eller variant-SKUbegynder med den.category_id- produkterne i en kategori;parent_category_id- produkterne i alle underkategorier til en topkategori. Se Katalogkategorier.group_id- produkterne i en kataloggruppe.sort_by-name,created,updated,type,popularellersold, isort_orderascellerdesc. Som standard kommer de nyeste produkter først.
Eksempel på anmodning
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'
Eksempel 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"
}
]
}
]
}
]
}
]
}
Felter i svaret
id,name,subtitle,description(HTML),slug,codeogHS_code, toldtarifkoden.is_sellable- om produktet er åbent for salg. Et lukket produkt vises stadig, men en ordre på en af dets varianter afvises.variants_min_selling_priceogvariants_max_selling_price- prisintervallet på tværs af de viste varianter.type- produkttypen, som fastlægger tryklagene og PDF-siderækkefølgen;status- altidActivei kataloget.categories- de kategorier, produktet ligger i, hver med sinparent_category.images- produktbillederne medurl,is_main,screen_type_sizeogsort_number.variants- de udgaver af produktet, der kan bestilles:id,name,subtitle,SKU,selling_price, målenewidth,height,lengthogweightsamtoptions, de optionsværdier, der udgør varianten, for eksempel dens størrelse.
Katalogkategorier
For at hente de kategorier, kataloget er inddelt i, sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/catalog/categories med dine loginoplysninger. Svaret indeholder topkategorierne, hver med sine underkategorier indlejret i sub_categories og antallet af katalogprodukter i den i products_count. Send en kategoris id som category_id, når du gennemser kataloget, eller en topkategoris id som parent_category_id for at få produkterne fra alle dens underkategorier på én gang.
Forespørgselsparametre
pageoglimit(op til 100) - deler listen op i sider. Uden dem returneres alle kategorier.search- de kategorier, hvis navn indeholder teksten.with_products_only-trueudelader de kategorier, der ikke indeholder noget katalogprodukt, hverken direkte eller i en underkategori.sort_by-category_nameellercategory_created, isort_orderascellerdesc. Som standard kommer kategorierne i deres katalogrækkefølge.
Eksempel på anmodning
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'
Eksempel 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
}
]
}
]
}
Dine produkter
For at hente produkterne på din konto sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/products med dine loginoplysninger. Dine produkter er de katalogprodukter, du har føjet til din Fabrixa-konto: de bærer de navne, beskrivelser og billeder, du gav dem der, og deres varianter de SKU-værdier, du valgte. Kun aktive produkter vises, ti pr. side, medmindre du sender limit.
Forespørgselsparametre
pageoglimit(op til 100) - den side, der skal returneres, og dens størrelse; som standard den første side med ti.search- de produkter, hvis navn indeholder teksten, eller hvis slug eller variant-SKUbegynder med den.
Eksempel på anmodning
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'
Eksempel 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"]
}
]
}
]
}
For at læse ét produkt sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/products/{product_id}, hvor {product_id} er dets id. Svaret indeholder de samme felter som listen. Et produkt, der ikke er på din konto, også et katalogprodukt, svarer 404 Not Found med beskeden Product not found.
Felter i svaret
id,name,subtitle,description(HTML),slug,width,height,lengthogweight.type- produkttypen, som fastlægger tryklagene og PDF-siderækkefølgen.available_options- hver option for produktet med alle dens værdier, for eksempel hver størrelse, det findes i; hver variant tager én værdi pr. option.categoriesogcollections- de kategorier og kollektioner, du har sorteret produktet i i din konto.images- produktbillederne medurl,is_main,image_size,screen_type_sizeogsort_number.variants- de udgaver af produktet, der kan bestilles, se Produktvarianter:id,name,subtitle,SKU,options,imagesog tryklagene iavailable_source_typesogrequired_source_types.
Produktvarianter
En variant er én udgave af et produkt, der kan bestilles - én størrelse, én farve - og det, en ordrelinje angiver, via sku eller variant_id. For at læse en variant af et af dine produkter sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/variants/{variant_id}, hvor {variant_id} er dens id. En variant af et produkt, der ikke er på din konto, svarer 404 Not Found med beskeden Variant not found.
Eksempel på anmodning
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'
Eksempel 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"]
}
}
Felter i svaret
id,name,subtitle,description,SKU,width,height,length,weight,options,imagesog detproduct, varianten hører til.available_source_types- variantens tryklag, navngivet som dens produktionsproces kender dem. Ud over"file", som enhver variant tager imod for en PDF, er det de værdier, en kildefilstypemå have; et produkt med et enkelt tryklag viser"print".required_source_types- de lag, en trykfil skal dække. En PDF sendt som"file"dækker dem med sine sider, i produkttypens siderækkefølge. Ellers har linjen brug for en JPEG-, PNG- eller TIFF-fil til hvert af dem med lagets navn somtype; en linje, hvor et mangler, afvises med400 Bad Requestog navnene på de manglende lag.
En ordrelinje for denne variant, med en PDF, hvis sider er dens lag:
"rows": [
{
"sku": "DDC-140200",
"quantity": 1,
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/duvet-cover.pdf"
}
]
}
]
Hvilke varianter kan bestilles
- En ordrelinje må angive en variant af et produkt på din konto eller en katalogvariant direkte, aldrig et produkt, der tilhører en anden kunde. Varianten findes via sit
variant_ideller via sinskuuanset store og små bogstaver. - Varianten skal være aktiv, og dens produkt aktivt og åbent for salg. For din kopi af et katalogprodukt skal katalogproduktet også være aktivt og katalogvarianten slået til.
- Ellers afvises ordren med
400 Bad Requestog årsagen for den pågældende linje: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.
Ordrer
Opret ordrer i Fabrixa fra din egen butiksfacade eller platform, vedhæft de påkrævede printfiler, og følg hver vare, mens den bevæger sig gennem opfyldelsen.
Opret en ordre
For at oprette en ordre via Fabrixa Integration API skal du sende en POST anmodning til https://api.fabrixa.com/v2/integration/orders. Anmodningsorganet skal omfatte:
Anmod om kropsstruktur
number(valgfrit) - ordrenummeret. Hvis det ikke angives, genereres et unikt nummer.comments(valgfrit) - yderligere kommentarer eller noter til ordren.purchased_at- dato og klokkeslæt for købet, formateret somYYYY-MM-DD HH:MM:SS.client_ip(valgfrit) - kundens IP-adresse.client_user_agent(valgfrit) - kundens user-agent-streng.rows- array med ordrelinjer, hver med:sku- produktvariantens SKU. Se Swagger for detaljer.quantity- antal bestilte produktvarianter.client_barcode(valgfrit) - unik klient-side-identifikator pr. ordrelinje, formateret somCode 128.cart_item_key(påkrævet udensources) - unik identifikator fra platformen, der indlejrer Fabrixa Studio, brugt til at knytte gemte tilpasninger til ordren.sources(påkrævet udencart_item_key) - array med kildefiler til produktet, hver med:type-"file"for en PDF eller"print"for en JPEG-, PNG- eller TIFF-fil.url- URL til kildefilen.
customer- kundeoplysninger:first_name,last_name,email,phone.
shipping_address- leveringsoplysninger:address,address2(valgfrit),address3(valgfrit).city,country_code(ISO 3166-2),country,postal_code,state(valgfrit).first_name,last_name,phone(valgfrit),company(valgfrit).
shipping_label(valgfrit) - labeloplysninger:method_name- f.eks. "Post NL".tracking_number,tracking_url,label_pdf_url.date_created- formateret somYYYY-MM-DD HH:MM:SS.
Eksempel på anmodning
{
"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"
}
}
Eksempel 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"
}
}
}
Opdater en ordre
For at opdatere en ordre skal du sende en PATCH anmodning til https://api.fabrixa.com/v2/integration/orders/{order_id}, hvor {order_id} er Fabrixa-ordre-id’et. Kun de felter, du sender, ændres, og ordrens status forbliver den samme. Svaret indeholder den opdaterede ordre. Du kan ændre:
number,comments,purchased_at,client_ip,client_user_agent.customer-first_name,last_name,email,phone.shipping_address- de samme felter som ved oprettelse af en ordre.
Eksempel på anmodning
{
"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"
}
}
Eksempel 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"
}
}
}
- Ordrelinjer kan ikke ændres: en anmodning med
rowsafvises med400 Bad Request. For at ændre varerne skal du annullere ordren og oprette en ny. - En ordre med status
on holdkan ikke opdateres; API’et svarer 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."
]
}
}
Annuller en ordre
For at annullere en ordre skal du sende en POST anmodning uden body til https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, hvor {order_id} er Fabrixa-ordre-id’et (ordrens numeriske id-felt), ikke dit ordrenummer. Svaret indeholder ordren med status canceled, og der sendes en order.updated webhook.
- En ordre kan annulleres, så længe dens status er
created,imported,acceptedelleron hold, og densfulfillment_statusstadig erunfulfilled. Når den skifter tilscheduled, er produktionen startet, og ordren kan ikke længere annulleres. - Gebyrerne for en annulleret ordre refunderes til din saldo.
- Annullering af en ordre, der allerede er annulleret, returnerer den uændret, så anmodningen trygt kan gentages.
Eksempel 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"
}
}
}
Hvis ordren ikke kan annulleres, svarer API’et med 412 Precondition Failed og en besked med årsagen: ordrens nuværende status tillader det ikke (status står i beskeden), eller produktionen er allerede startet.
{
"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)."
]
}
}
Ordrens livscyklus
En ordre følges med tre statusser: ordrens status, dens produktionsstatus fulfillment_status og status for hver forsendelse i shipments. Hver ændring sendes i webhooken order.updated og returneres af GET /orders/{order_id}.
Ordrestatusser
Værdierne i feltet status for en ordre, i den rækkefølge de nås:
imported- ordren er modtaget via API'et. Alle ordrer starter her.on hold- saldoen dækker ikke ordrens pris. Når den er fyldt op, vender ordren tilbage tilimportedog fortsætter.accepted- ordren er accepteret og sendes i produktion.completed(endelig) - alle varer er produceret.canceled(endelig) - ordren er annulleret. Det er muligt, så længe den erimported,acceptedelleron hold, og produktionen endnu ikke er startet.
Opfyldelsesstatusser
Værdierne i feltet fulfillment_status for en ordre og for hver ordrelinje, i den rækkefølge de nås. Den bevæger sig kun fremad, aldrig tilbage:
unfulfilled- produktionen er ikke startet.scheduled- ordren er planlagt i en produktionsbatch. Herefter kan den ikke længere annulleres.processing- produktionen er i gang.partially fulfilled- nogle varer er færdige, resten er stadig i produktion.fulfilled(endelig) - alle varer er færdige. Ordrensstatusbliver dereftercompleted.
En ordre som helhed afvises aldrig. En enkelt vare kan blive afvist ved kvalitetskontrollen under produktionen. Den bliver så trykt igen: den vender tilbage til unfulfilled og går gennem produktionen en gang til, mens ordren beholder sin status og fortsætter, når varen er færdig.
Forsendelsesstatusser
Værdierne i feltet status for hver forsendelse i shipments, i den rækkefølge de nås:
pending- forsendelsen er ved at blive klargjort.registered- labelen er oprettet hos fragtfirmaet.collected- fragtfirmaet har afhentet pakken.in transit- pakken er undervejs.delivered(endelig) - pakken er leveret.
Undtagelser:
failed- fragtfirmaet har meldt et problem.returned(endelig) - pakken er sendt retur til os.canceled(endelig) - forsendelsen er annulleret.
Sporopfyldelse
For at få opfyldelsesstatus for en specifik ordre skal du sende en GET anmodning til https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. Svaret giver en liste over opfyldelser forbundet med ordren, herunder hver varestatus, produktdetaljer og produktionstrinsfremskridt.
Eksempel 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 inkluderer en liste over opfyldelser, der hver giver:
id- unik identifikator for fulfilment.barcode- stregkode til intern sporing og identifikation; kan også printes på produktet.status- den aktuelle fulfilment-status: unfulfilled eller fulfilled.created_atogupdated_at- tidsstempler for oprettelse og seneste opdatering.variant- detaljerede oplysninger om produktvarianten: navn, undertitel, SKU.product- produktoplysninger: navn, undertitel.production_steps- array med produktionstrin. Listen afhænger af produkttypen. For hvert trin:id- unik identifikator for produktionstrinnet.name- f.eks. "Print duvet".description- hvad produktionstrinnet omfatter.status- den aktuelle status:- pending - endnu ikke startet.
- in progress - er i gang.
- rejected - trinnet havde et problem og blev ikke fuldført.
- done - trinnet er fuldført.
notes- eventuelle yderligere noter til trinnet.updated_at- seneste tidspunkt hvor trinstatus blev opdateret.
Hver opfyldelsespost svarer til et specifikt produkt eller produktvariant i ordren, og hver kopi af produktet i ordren har sin egen opfyldelsespost - hver vare spores individuelt gennem hele produktionen.
Hvis der ikke returneres nogen opfyldelse af en ordre, er ordren endnu ikke gået ind i behandlingsfasen.
Krav til kildefil
Når du inkluderer kildefiler i din ordre, skal du sikre dig, at de opfylder følgende krav:
type
PDF er det foretrukne kildeformat. Til et produkt med ét trykt lag, f.eks. et tæppe eller et håndklæde, kan en JPEG-, PNG- eller TIFF-fil også bruges. Til et produkt med flere lag skal du levere en PDF-fil med hvert lag som en separat side: under behandlingen behandles hver side som et selvstændigt lag, så et design med flere lag indsendes som én kildefil. Se PDF-krav og siderækkefølge.
Angiv type efter filformatet. Til en PDF skal du bruge "file": hver side trykkes på ét lag af produktet i den siderækkefølge, der er angivet for produktet. Til en JPEG-, PNG- eller TIFF-fil, som passer til et produkt med ét trykt lag, skal du bruge "print".
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/source.pdf"
}
]
For yderligere detaljer, se Swagger-dokumentationen.
url
Feltet url skal indeholde et direkte link til kildefilen. Sørg for, at URL'en er tilgængelig, og at filen kan downloades uden godkendelse. Linket skal forblive tilgængeligt gennem hele produktionsprocessen.
Sådan henter vi filen
Vi henter filen fra din server to gange: en anmodning med Range: 0-0, mens ordren valideres, og derefter hele filen. Begge anmodninger sender User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); hvis dit site filtrerer automatiseret trafik, så tillad den. URL’en skal bruge HTTPS på port 443 og returnere filen direkte, uden omdirigeringer, med filens rigtige Content-Type, f.eks. application/pdf. Hver anmodning udløber efter 60 sekunder.
Filformat
Lever en PDF-fil eller, til et produkt med ét lag, en JPEG-, PNG- eller TIFF-fil, leveret med dens rigtige Content-Type. Gennemsigtige områder i en PNG trykkes hvide. Sørg for, at billederne er af høj kvalitet og egnede til tryk.
Billeddimensioner
Maksimale dimensioner er 15,000 pixels på hver side. Billeder, der overskrider denne grænse, kan ændres eller afvises. Billedopløsningen skal matche produktdimensioner; Ellers kan billederne blive ændret eller beskåret, så de passer.
Opløsning
Intet specifikt krav til opløsning - bare sørg for, at billedkvaliteten er tilstrækkelig til udskrivning.
Farverum
Billeder skal være i RGB farverum for nøjagtig farvegengivelse. Andre farverum vil blive konverteret under behandlingen, hvilket kan resultere i forkerte farver.
Filstørrelse
Hver kildefil må højst være 200 MB. En større fil afvises: når ordren oprettes, hvis din server sender Content-Length, ellers når filen downloades.
PDF-krav og siderækkefølge
Rækkefølgen af sider i PDF'en er vigtig. Sider matches til produktlag efter position, og den forventede siderækkefølge afhænger af produkttypen. Sørg for, at siderne i din PDF følger den korrekte lagsekvens for det produkt, du indsender.
| Produkt | PDF-siderækkefølge |
|---|---|
| Duvet Cover |
|
| Curtains |
|
| T-shirt |
|
| Tanktop |
|
| Sweater |
|
| Hoodie |
|
| Sweatpants |
|
| Sweatshorts |
|
Vigtigt: hver PDF-side skal matche de påkrævede dimensioner for sit produktlag og være orienteret korrekt. Placer kunstværket, så toppen af designet flugter med toppen af siden. Forkert sidestørrelse eller -retning kan forårsage problemer med skalering, rotation eller justering i produktionen.
Fragt
Se, hvad fragten på en ordre vil koste, og hvor længe den vil være undervejs, før du opretter den, beregnet efter de samme regler, som Fabrixa bruger til selve ordren.
Leveringslande
For at finde ud af, hvilke lande en produktvariant kan sendes til, sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/shipping/countries med dine loginoplysninger. Listen er sorteret efter navn og indeholder de lande, som det sted, der producerer varianten, har en fragttakst til for en forsendelsespakke, som varianten kan pakkes i. Et land, der ikke er på listen, har ingen fragttakst for varianten.
Forespørgselsparametre
variant_idellersku- varianten, angivet som i en ordrelinje, ligesom for et overslag.
Eksempel på anmodning
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'
Eksempel 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
}
]
}
Felter i svaret
codeogname- landet med ISO 3166-1 alpha-2-koden, som du angiver somcountry_codei overslaget.min_shipping_priceogmax_shipping_price- intervallet for, hvad én forsendelsespakke koster at sende til landet, ekskl. moms, i valutaen icurrency, på tværs af de pakker, som varianten kan pakkes i. En ordre på flere enheder kan kræve flere pakker, så bed om et overslag for at få prisen for et bestemt antal.min_eta_daysogmax_eta_days- intervallet for antallet af dage, en pakke er undervejs, efter at den er overdraget til fragtfirmaet, produktionstid ikke medregnet;null, når taksterne ikke har et leveringsestimat.
Anslå fragten
For at finde ud af, hvad fragten for en produktvariant ville koste, og hvor længe forsendelsen ville være undervejs, sender du en GET-forespørgsel til https://api.fabrixa.com/v2/integration/shipping/estimate med dine loginoplysninger. Overslaget følger de regler, som prisen på en ordre beregnes efter: enhederne pakkes i forsendelsespakkerne på det sted, der producerer varianten, og prisen for hver pakke beregnes ud fra ruten fra det sted til destinationslandet. Intet bliver bestilt eller reserveret, og prisen på en ordre beregnes, når den afgives, så dens fragt kan afvige, hvis taksterne ændres i mellemtiden.
Forespørgselsparametre
variant_idellersku- varianten, angivet som i en ordrelinje: en variant af et af dine produkter eller en katalogvariant. Det skal være en variant, du kan bestille.country_code- ISO 3166-1 alpha-2-koden for det land, ordren sendes til, for eksempelNL.quantity- antallet af enheder, fra 1 til 1000.
Eksempel på anmodning
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'
Eksempel 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
}
}
Felter i svaret
variant_id,sku,quantityogcountry_code- den variant, det antal og den destination, som overslaget gælder for.origin_country- det land, varianten sendes fra, med detscodeogname.packages_count- antallet af forsendelsespakker, som enhederne pakkes i.packages- selve pakkerne, én post pr. pakketype:package_type, denslength,widthogheighti cm,quantityaf sådanne pakker,pricefor at sende én af dem og denseta_days. Priserne gange antallene giver tilsammenshipping_price.shipping_price- fragtprisen for alle pakkerne tilsammen, ekskl. moms, i valutaen icurrency. På en rute uden fragttakst er forsendelsen gratis, ligesom for en ordre, og prisen er0.00.eta_days- antallet af dage, den langsomste pakke er undervejs, efter at den er overdraget til fragtfirmaet, produktionstid ikke medregnet;null, når ruten ikke har et leveringsestimat.
En forespørgsel, der ikke består valideringen, besvares med 400 Bad Request og årsagen for hvert felt, med de samme beskeder som for en ordrelinje, for eksempel The variant not found. Når ingen forsendelsespakke kan rumme enhederne, er svaret 400 Bad Request med beskeden No shipping package can carry the variant.
Fabrixa Studio
Fabrixa Studio er et værktøj, der lader brugere problemfrit tilpasse og personliggøre produkter i realtid med en intuitiv grænseflade, hvor brugerne kan oprette eller uploade deres egne designs.
Fabrixa Studio er ideel til virksomheder, der tilbyder brugerdefinerede produkter - hvilket gør det muligt for kunderne at visualisere deres design, før de afslutter ordrer.
Integrer Fabrixa Studio
Du kan integrere Fabrixa Studio på dit websted ved hjælp af en iframe. Dette gør det muligt for dine kunder at tilpasse produkter direkte på dit websted under kassen.
Eksempel iframe til indlejring af 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>
Erstat værdierne for product_sku, cart_item_key og application_key med dine dynamiske værdier.
application_key- unik nøgle til godkendelse til integrations-API'en.product_sku- SKU'en for produktvarianten, hentet fra integrations-API'en.- .
cart_item_key- en unik vare-tilknyttet værdi, der identificerer den indbyggede bil Bruges til at gemme brugertilpasningerne; under ordreoprettelse identificerer den de gemte tilpasninger og tildeler dem til ordren. Se eksempel nedenfor. locale(valgfri) - sproget i Studios brugerflade og fejlmeddelelser, f.eks.de_DEellerde. Uden den åbner Studio på kundens browsersprog, hvis det understøttes, ellers på engelsk.
Studios overskrift viser produktets navn, som det står i din butik - den samme titel, som dine kunder ser - med den valgte variants muligheder nedenunder. Det er din butiks egen kopi af produktet, så et navn, du retter i Fabrixa, vises også i Studio; locale oversætter det ikke.
Anmodning om at oprette en ordre 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": {
"...": "..."
}
}
Håndter studiebegivenheder
Når knappen Tilføj til kurv klikkes inde i iframen, udføres følgende kommando:
window.parent.postMessage('customizationFinished', '*');
På samme måde, når der klikkes på knappen Tilbage:
window.parent.postMessage('closeButtonClicked', '*');
postMessage-metoden letter kommunikation på tværs mellem iframen og dens overordnede vindue, så den kan underrette forælderen om specifikke brugerhandlinger.
Det første argument for postMessage er de data, du vil sende. Strengen 'customizationFinished' angiver, at brugeren har afsluttet tilpasningen og tilføjer produktet til indkøbskurven. 'closeButtonClicked' angiver, at brugeren har valgt at gå tilbage.
I det overordnede vindue skal du lytte efter disse beskeder ved hjælp af message begivenhedslytteren:
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.');
}
}
});
Kontroller altid origin for indgående meddelelser for at sikre, at de kommer fra en pålidelig kilde. Afhængigt af den modtagne besked, udfør de nødvendige handlinger - opdater brugergrænsefladen, bearbejd vognen osv. Validering af origin er afgørende for sikkerheden - det forhindrer uautoriserede scripts i at interagere med din applikation.
Forhåndsvisning af tilpasning
Når tilpasningen er fuldført, skal du vise det endelige design ved hjælp af forhåndsvisnings-URL'en nedenfor. Denne URL returnerer et billede af det tilpassede produkt, egnet som src værdien i et <img> tag. Ideel til at vise det tilpassede produkt i din indkøbskurv, ordreoversigt eller hvor som helst i din butiksgrænseflade.
https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}
Erstat {CART_ITEM_KEY} med den aktuelle nøgle til indkøbskurven og {APPLICATION_KEY} med din gyldige programnøgle.
Eksempel på brug i et billedtag:
<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
Tilpasningseksemplet vises her, når designet er færdigt.
Webhooks
Webhooks bruges af Fabrixa til at underrette dit system om hændelser i realtid - bestil opdateringer eller kreationer. Når en hændelse opstår, sender Fabrixa en webhook til din server, der indeholder de relevante oplysninger. Din server skal eksponere et offentligt POST-slutpunkt for at håndtere indgående webhooks.
Webhook-anmodningsoverskrifter
Webhook-anmodningen indeholder følgende overskrifter for at hjælpe dig med at identificere og validere den indgående anmodning:
{
"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"
}
Overskriftsoversigt
content-type- altid indstillet tilapplication/jsonfor webhooks.x-webhook-signature- HMAC-SHA256 signaturen til anmodningsbekræftelse.x-webhook-topicaf begivenhedstypen eller. For eksempel:order.created- udløses, når en ny ordre oprettes.order.updated- udløses, når en eksisterende ordre opdateres.
Webhooks sendes med User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); hvis dit endpoint filtrerer automatiseret trafik, så tillad den. For at være sikker på, at en anmodning kommer fra Fabrixa, skal du verificere x-webhook-signature.
Webhook-begivenheder
Fabrixa webhooks giver dit system besked om ændringer i ordrestatus eller aktivitet. Hver webhook udløses af en specifik x-webhook-topic værdi. Aktuelt understøttede emner:
| Emne | Beskrivelse |
|---|---|
order.created |
Udløses når en ny ordre afgives i Fabrixa, enten via API-anmodning eller direkte i platformen. |
order.updated |
Udløses, når ordredetaljer såsom ordrestatus eller opfyldelsesstatus opdateres. |
Webhook Payload Eksempel
Et eksempel på nyttelasten sendt med webhook. Denne nyttelast repræsenterer en ordreopdatering:
{
"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 ordren er afsendt, viser shipments hver forsendelse med dens fragtfirma (carrier), forsendelsesmetode (method), status (status: pending, registered, collected, in transit, delivered, failed, returned eller canceled) og sporing: tracking_number og tracking_url, og det samme for hver pakke i packages, når en forsendelse har flere. Der sendes en order.updated webhook, hver gang en forsendelses status eller sporing ændres, og GET /orders/{order_id} returnerer det samme felt.
Bekræft Webhook-signaturer
For at sikre, at webhook-anmodningen er autentisk og umanipuleret, skal du kontrollere x-webhook-signature-headeren. Dette involverer genberegning af HMAC-SHA256-signaturen ved hjælp af den rå anmodningsnyttelast og din hemmelige nøgle, og derefter sammenligne den med den modtagne signatur.
Eksempel 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 eksempel
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...
}
Erstat $yourSecret med din delte hemmelige nøgle. Brug altid hash_equals til at sammenligne signaturer for at afbøde timingangreb.
Webhook forsøger igen
Webhooks er som standard deaktiveret efter 10 mislykkede leveringsforsøg. Hvis dit slutpunkt returnerer en mislykket status såsom 404 eller en 5xx fejl, vil webhook forsøge igen i alt 10 gange. Hvis den fortsætter med at returnere en ikke-2xx eller ikke-3xx svarkode, vil den blive deaktiveret. Vellykkede svar omfatter:
2xx- angiver vellykket behandling, f.eks.200 OK.301og302- omdirigeringssvar, der angiver, at webhook er blevet håndteret eller videresendt.
Webhook-svar
Vi anbefaler på det kraftigste, at dit slutpunkt returnerer en 200 OK statuskode så hurtigt som muligt for at bekræfte vellykket modtagelse af webhook. Selvom ethvert 2xx- eller 3xx-svar anses for at være vellykket, er 200 det mest almindeligt anvendte og pålidelige.
For at undgå leveringstimeouts eller genforsøg skal du returnere 200 OK med det samme og håndtere webhook-nyttelastbehandling asynkront, for eksempel via et baggrundsjob eller kø. Hvis dit endepunkt tager for lang tid at reagere, kan det blive betragtet som en fejl, selvom svaret i sidste ende lykkes.
Svar med statuskoder i området 4xx eller 5xx, eller timeouts, vil udløse genforsøg i henhold til genforsøgsmekanismen.