Fabrixa Integration API Referenz
33 Min. Lesezeit Zuletzt aktualisiert: 06-11-2026 119 Aufrufe
Die Integration API hilft Ihnen, Fabrixa-Orders zu erstellen und zu verwalten, Fabrixa Studio zu starten und Produktions- sowie Fulfilment-Status per Webhooks synchron zu halten. Die API folgt REST-Konventionen und verwendet JSON für alle Request- und Response-Bodies.
BASIS-URL
https://api.fabrixa.com/v2/integration
Senden Sie alle Requests an diese Basis-URL, gefolgt vom jeweiligen Endpoint-Pfad. Die Basis-URL ist die Grundlage für die Interaktion mit der Fabrixa API: Ressourcen abrufen, erstellen, aktualisieren oder löschen.
Authentifizierung
Für den Zugriff auf die Integration API authentifizieren Sie Requests mit einem Application Access Token und einer Application Key:
Autorisierungsheader
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Anwendungsschlüssel-Header
X-Application-Key: APPLICATION_KEY
Beispiel für einen cURL-Befehl
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'
Ersetzen Sie APPLICATION_ACCESS_TOKEN durch Ihr tatsächliches Zugriffstoken und APPLICATION_KEY durch Ihren tatsächlichen Anwendungsschlüssel.
Endpunkte und Anfragen
Die Endpoints der Integration API sind nach Resource Type organisiert und folgen der REST-Architektur. Jeder Endpoint repräsentiert eine Resource; Aktionen werden mit Standard-HTTP-Methods ausgeführt.
Alle Requests und Responses der Integration API verwenden JSON und bieten damit eine konsistente Schnittstelle.
Ausführliche Informationen zu jedem Endpunkt, einschließlich Anforderungs- und Antwortbeispielen, finden Sie in unserem Swagger documentation.
Antwortformat
Alle Endpunkte geben Daten in einem standardisierten Format mit diesen Objekten zurück:
{
"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"
}
]
}
Beschreibung der Antwortobjekte
links
Enthält Paginierungslinks zum Navigieren durch die Ergebnisse.
self— die URL der aktuellen Seite.first_page— die URL der ersten Ergebnisseite.last_page— die URL der letzten Ergebnisseite.next_page— die URL der nächsten Seite.null, wenn es keine nächste Seite gibt.prev_page— die URL der vorherigen Seite.null, wenn keine vorherige Seite vorhanden ist.
meta
Enthält Metadaten zur Antwort, z. B. Paginierungsinformationen.
total— die Gesamtzahl der auf allen Seiten verfügbaren Elemente.current_page— die aktuelle Seitenzahl der Ergebnisse.per_page— die Anzahl der Elemente pro Seite.
data
Der Hauptinhalt der Antwort. data variiert je nach Endpunkt – es kann sich um ein einzelnes Objekt, beispielsweise ein Produkt, oder um ein Array von Objekten, beispielsweise eine Produktliste, handeln.
Fehler und Statuscodes
Alle API-Anfragen geben HTTP-Statuscodes zurück, die Einblick in die Antwort geben.
400 Bad Request
Der Server kann die Anfrage aufgrund von Validierungsfehlern – fehlenden oder ungültigen Parametern – nicht verarbeiten.
401 Unauthorized
Der Client hat keine gültigen Authentifizierungsdaten angegeben. Wird auch zurückgegeben, wenn das Zugriffstoken widerrufen wurde.
403 Forbidden
Der Server lehnte die Anfrage aufgrund unzureichender Zugriffsrechte ab, was typischerweise durch falsche oder fehlende Zugriffsberechtigungen verursacht wird.
404 Not Found
Die angeforderte Ressource konnte auf dem Server nicht gefunden werden.
412 Precondition Failed
Der Request kann im aktuellen Zustand der Ressource nicht ausgeführt werden, zum Beispiel bei einer Order, die nicht mehr storniert werden kann.
429 Too Many Requests
Der Kunde hat die zulässige Anzahl von Anfragen in einem bestimmten Zeitraum überschritten. Siehe Rate Limits.
5xx Errors
Es ist ein interner Serverfehler aufgetreten. Bitte wenden Sie sich mit Einzelheiten zur fehlgeschlagenen Anfrage an den Fabrixa-Support.
Fehlerantworttext
Ein Beispiel für einen Fehlerantworttext:
{
"links": {
"self": "https://api.fabrixa.com/v2/integration/ping"
},
"meta": [],
"errors": {
"messages": [
"Application Key is not specified."
]
}
}
errors enthält Details darüber, was fehlgeschlagen ist. Das Array messages listet Fehlerbeschreibungen auf. Bei einer fehlerhaften Anfrage erhalten Sie die Namen der Felder, deren Validierung fehlgeschlagen ist.
Ratenbeschränkungen
Die Integrations-API unterstützt ein Limit von 30 Anfragen pro Anwendung und Minute.
Wenn Sie dieses Limit überschreiten, erhalten Sie eine 429 Too Many Requests-Antwort.
Alle Antworten der Integrations-API enthalten den X-RateLimit-Remaining-Header, der angibt, wie viele Anfragen der Client noch stellen kann, und den X-RateLimit-Limit-Header, die insgesamt zulässige Anzahl pro Minute.
Sandbox-Modus
Mit dem Sandbox-Modus testen Sie Ihre Integration von Anfang bis Ende, bevor eine echte Bestellung produziert oder berechnet wird. Er gilt für Ihr gesamtes Konto: Bestellungen aus allen Verkaufskanälen, einschließlich der Integration API und verbundener Shopify- und WooCommerce-Shops, werden weder produziert noch Ihrem Guthaben belastet. Ihr Konto befindet sich im Sandbox-Modus, solange sein Status Aktivierung ausstehend lautet.
Im Sandbox-Modus können Sie:
- Ihren Shopify- oder WooCommerce-Shop verbinden oder einen Integration-API-Kanal erstellen;
- Produkte hinzufügen sowie Preise und Versandschätzungen prüfen;
- Bestellungen importieren, erstellen, aktualisieren und stornieren;
- sehen, dass keine dieser Bestellungen produziert oder Ihrem Guthaben belastet wird;
- die Zustellung von Webhooks und die Signaturen prüfen.
Um Bestellungen zu testen, fügen Sie Produkte aus dem Fabrixa-Katalog hinzu: Öffnen Sie ein Produkt, klicken Sie auf Verkaufen und wählen Sie Varianten und Designs. Sie erscheinen dann unter Meine Produkte.
Um Ihr Konto in den Sandbox-Modus zu schalten, öffnen Sie die Platform, gehen Sie zu Einstellungen → Unternehmen → Sandbox-Modus und klicken Sie auf In den Sandbox-Modus schalten. Sie können ihn auch beim Hinzufügen eines neuen Verkaufskanals aktivieren, auch eines Integration-API-Kanals, oder eine E-Mail an support@fabrixa.com schreiben, dann schalten wir Ihr Konto für Sie um. Der Sandbox-Modus ist nur für aktive Konten verfügbar.
Wenn Sie bereit sind, aktivieren Sie Ihr Konto selbst in der Platform unter Einstellungen → Unternehmen → Sandbox-Modus. Sie können auch eine E-Mail an support@fabrixa.com schreiben, dann aktivieren wir es für Sie. Ihre verbundenen Shops und API-Zugangsdaten funktionieren weiter, Sie müssen also nichts neu konfigurieren.
Nach der Aktivierung gehen alle neuen Bestellungen in die Produktion und werden Ihrem Guthaben belastet. Vor der Aktivierung erstellte Bestellungen bleiben Testbestellungen: Sie werden nie produziert oder berechnet, auch nicht nach der Aktivierung.
Produkte
Der Katalog ist alles, was Fabrixa produziert. Ihre Produkte sind die Katalogprodukte, die Sie zu Ihrem Fabrixa-Konto hinzugefügt haben, mit Ihren eigenen Namen, Beschreibungen, Bildern und SKUs. Eine Order-Zeile nennt eine Produktvariante – eine Größe oder Ausführung eines Produkts – über ihre sku oder variant_id: eine Variante eines Ihrer Produkte oder eine direkt bestellte Katalogvariante.
Katalog durchsuchen
Um die Produkte aufzulisten, die Fabrixa produziert, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/catalog/products mit Ihren Zugangsdaten. Er listet die aktiven Produkte, die eine Variante haben, die ein Druckpartner derzeit produziert, und nur diese Varianten – jede mit ihrer SKU, ihrem Verkaufspreis, ihren Maßen und Optionswerten.
Abfrageparameter
pageundlimit(bis zu 100) – teilen die Liste in Seiten auf. Ohne sie wird der gesamte Katalog in einer Antwort zurückgegeben.search– die Produkte, deren Name den Text enthält oder deren Slug oder Varianten-SKUdamit beginnt.category_id– die Produkte einer Kategorie;parent_category_id– die Produkte aller Unterkategorien einer Kategorie der obersten Ebene. Siehe Katalogkategorien.group_id– die Produkte einer Kataloggruppe.sort_by–name,created,updated,type,popularodersold, in dersort_orderascoderdesc. Standardmäßig kommen die neuesten Produkte zuerst.
Musteranfrage
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'
Beispielantwort
{
"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"
}
]
}
]
}
]
}
]
}
Felder der Antwort
id,name,subtitle,description(HTML),slug,codeundHS_code, die Zolltarifnummer.is_sellable– ob das Produkt zum Verkauf freigegeben ist. Ein gesperrtes Produkt wird weiterhin gelistet, eine Order für eine seiner Varianten wird aber abgelehnt.variants_min_selling_priceundvariants_max_selling_price– die Preisspanne über die gelisteten Varianten.type– der Produkttyp, der die Druckebenen und die PDF-Seitenreihenfolge festlegt;status– im Katalog immerActive.categories– die Kategorien, in denen das Produkt liegt, jede mit ihrerparent_category.images– die Produktbilder miturl,is_main,screen_type_sizeundsort_number.variants– die bestellbaren Ausführungen des Produkts:id,name,subtitle,SKU,selling_price, die Maßewidth,height,lengthundweightsowieoptions, die Optionswerte, die diese Variante ausmachen, zum Beispiel ihre Größe.
Katalogkategorien
Um die Kategorien aufzulisten, in die der Katalog gegliedert ist, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/catalog/categories mit Ihren Zugangsdaten. Die Antwort enthält die Kategorien der obersten Ebene, jede mit ihren Unterkategorien in sub_categories und der Anzahl ihrer Katalogprodukte in products_count. Übergeben Sie die id einer Kategorie als category_id, wenn Sie den Katalog durchsuchen, oder die id einer Kategorie der obersten Ebene als parent_category_id, um die Produkte aller ihrer Unterkategorien auf einmal zu erhalten.
Abfrageparameter
pageundlimit(bis zu 100) – teilen die Liste in Seiten auf. Ohne sie werden alle Kategorien zurückgegeben.search– die Kategorien, deren Name den Text enthält.with_products_only–truelässt die Kategorien weg, die weder direkt noch in einer Unterkategorie ein Katalogprodukt enthalten.sort_by–category_nameodercategory_created, in dersort_orderascoderdesc. Standardmäßig kommen die Kategorien in ihrer Katalogreihenfolge.
Musteranfrage
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'
Beispielantwort
{
"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
}
]
}
]
}
Ihre Produkte
Um die Produkte Ihres Kontos aufzulisten, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/products mit Ihren Zugangsdaten. Ihre Produkte sind die Katalogprodukte, die Sie zu Ihrem Fabrixa-Konto hinzugefügt haben: Sie tragen die Namen, Beschreibungen und Bilder, die Sie ihnen dort gegeben haben, und ihre Varianten die von Ihnen gewählten SKU-Werte. Gelistet werden nur aktive Produkte, zehn pro Seite, sofern Sie kein limit übergeben.
Abfrageparameter
pageundlimit(bis zu 100) – die zurückzugebende Seite und ihre Größe; standardmäßig die erste Seite mit zehn Produkten.search– die Produkte, deren Name den Text enthält oder deren Slug oder Varianten-SKUdamit beginnt.
Musteranfrage
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'
Beispielantwort
{
"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"]
}
]
}
]
}
Um ein einzelnes Produkt zu lesen, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/products/{product_id}, wobei {product_id} seine id ist. Die Antwort enthält dieselben Felder wie die Liste. Ein Produkt, das nicht in Ihrem Konto ist, auch ein Katalogprodukt, antwortet mit 404 Not Found und der Meldung Product not found.
Felder der Antwort
id,name,subtitle,description(HTML),slug,width,height,lengthundweight.type– der Produkttyp, der die Druckebenen und die PDF-Seitenreihenfolge festlegt.available_options– jede Option des Produkts mit allen ihren Werten, zum Beispiel jede Größe, in der es erhältlich ist; jede Variante nimmt einen Wert pro Option.categoriesundcollections– die Kategorien und Kollektionen, in die Sie das Produkt in Ihrem Konto einsortiert haben.images– die Produktbilder miturl,is_main,image_size,screen_type_sizeundsort_number.variants– die bestellbaren Ausführungen des Produkts, siehe Produktvarianten:id,name,subtitle,SKU,options,imagesund die Druckebenen inavailable_source_typesundrequired_source_types.
Produktvarianten
Eine Variante ist eine bestellbare Ausführung eines Produkts – eine Größe, eine Farbe – und das, was eine Order-Zeile nennt, über sku oder variant_id. Um eine Variante eines Ihrer Produkte zu lesen, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/variants/{variant_id}, wobei {variant_id} ihre id ist. Eine Variante eines Produkts, das nicht in Ihrem Konto ist, antwortet mit 404 Not Found und der Meldung Variant not found.
Musteranfrage
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'
Beispielantwort
{
"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"]
}
}
Felder der Antwort
id,name,subtitle,description,SKU,width,height,length,weight,options,imagesund dasproduct, zu dem die Variante gehört.available_source_types– die Druckebenen der Variante, so benannt, wie ihr Produktionsprozess sie kennt. Neben"file", das jede Variante für ein PDF annimmt, sind das die Werte, die dertypeeiner Quelldatei haben darf; ein Produkt mit einer einzigen Druckebene listet"print".required_source_types– die Ebenen, die eine Druckdatei abdecken muss. Ein als"file"gesendetes PDF deckt sie mit seinen Seiten ab, in der Seitenreihenfolge des Produkttyps. Andernfalls braucht die Zeile für jede davon eine JPEG-, PNG- oder TIFF-Datei mit dem Namen der Ebene alstype; eine Zeile, in der eine fehlt, wird mit400 Bad Requestund den Namen der fehlenden Ebenen abgelehnt.
Eine Order-Zeile für diese Variante, mit einem PDF, dessen Seiten ihre Ebenen sind:
"rows": [
{
"sku": "DDC-140200",
"quantity": 1,
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/duvet-cover.pdf"
}
]
}
]
Welche Varianten bestellt werden können
- Eine Order-Zeile darf eine Variante eines Produkts in Ihrem Konto nennen oder direkt eine Katalogvariante, nie ein Produkt eines anderen Kunden. Die Variante wird über ihre
variant_idgefunden oder über ihresku, unabhängig von Groß- und Kleinschreibung. - Die Variante muss aktiv sein und ihr Produkt aktiv und zum Verkauf freigegeben. Bei Ihrer Kopie eines Katalogprodukts müssen außerdem das Katalogprodukt aktiv und die Katalogvariante eingeschaltet sein.
- Andernfalls wird die Order mit
400 Bad Requestund dem Grund für die betreffende Zeile abgelehnt: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.oderThe catalog variant is not active.
Bestellungen
Erstellen Sie Orders in Fabrixa aus Ihrem eigenen Storefront oder Ihrer Plattform, hängen Sie die erforderlichen Druckdateien an und verfolgen Sie jedes Item durch das Fulfilment.
Order erstellen
Um eine Order über die Fabrixa Integration API zu erstellen, senden Sie einen POST Request an https://api.fabrixa.com/v2/integration/orders. Der Request Body muss enthalten:
Körperstruktur anfordern
number(optional) – die Bestellnummer. Wenn nicht angegeben, wird eine eindeutige Nummer generiert.comments(optional) – alle zusätzlichen Kommentare oder Notizen im Zusammenhang mit der Bestellung.purchased_at– Datum und Uhrzeit des Kaufs der Bestellung, formatiert alsYYYY-MM-DD HH:MM:SS.client_ip(optional) – die IP-Adresse des Kunden.client_user_agent(optional) – der Benutzeragent Zeichenfolge des Kunden.rows– Array von Bestellartikeln, die jeweils Folgendes enthalten:sku– die SKU der Produktvariante. Weitere Informationen finden Sie unter Swagger.quantity– Menge der bestellten Produktvariante.client_barcode(optional) – eindeutige clientseitige Kennung pro Bestellzeile, formatiert alsCode 128.cart_item_key(erforderlich ohnesources) – eindeutige Kennung von der Plattform, die Fabrixa Studio einbettet, Wird verwendet, um gespeicherte Anpassungen mit der Bestellung zu verknüpfen.sources(erforderlich ohnecart_item_key) – Array von Quelldateien, die dem Produkt zugeordnet sind und jeweils Folgendes enthalten:type–"file"für ein PDF oder"print"für eine JPEG-, PNG- oder TIFF-Datei.url– URL der Quelle Datei.
customer- Kundendaten:first_name,last_name,email,phone.
shipping_address- Versanddetails:address,address2(optional),address3(optional).city,country_code(ISO 3166-2),country,postal_code,state(optional).first_name,last_name,phone(optional),company(optional).
shipping_label(optional) – Etikettendetails:method_name– z.B. „Post NL“.tracking_number,tracking_url,label_pdf_url.date_created– formatiert alsYYYY-MM-DD HH:MM:SS.
Musteranfrage
{
"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"
}
}
Beispielantwort
{
"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"
}
}
}
Eine Order aktualisieren
Um eine Order zu aktualisieren, senden Sie einen PATCH Request an https://api.fabrixa.com/v2/integration/orders/{order_id}, wobei {order_id} die Fabrixa-Order-ID ist. Nur die gesendeten Felder werden geändert, der Status der Order bleibt unverändert. Die Antwort enthält die aktualisierte Order. Sie können ändern:
number,comments,purchased_at,client_ip,client_user_agent.customer-first_name,last_name,email,phone.shipping_address- dieselben Felder wie beim Erstellen einer Order.
Musteranfrage
{
"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"
}
}
Beispielantwort
{
"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"
}
}
}
- Order-Zeilen können nicht geändert werden: Ein Request mit
rowswird mit400 Bad Requestabgelehnt. Um die Artikel zu ändern, stornieren Sie die Order und erstellen Sie eine neue. - Eine Order im Status
on holdkann nicht aktualisiert werden; die API antwortet mit412 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."
]
}
}
Eine Order stornieren
Um eine Order zu stornieren, senden Sie einen POST Request ohne Body an https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, wobei {order_id} die Fabrixa-Order-ID ist (das numerische Feld id der Order), nicht Ihre Bestellnummer. Die Antwort enthält die Order mit dem Status canceled, und ein order.updated Webhook wird gesendet.
- Eine Order kann storniert werden, solange ihr Status
created,imported,acceptedoderon holdist und ihrfulfillment_statusnochunfulfilledist. Sobald erscheduledwird, hat die Produktion begonnen und die Order kann nicht mehr storniert werden. - Die Gebühren einer stornierten Order werden Ihrem Guthaben gutgeschrieben.
- Das Stornieren einer bereits stornierten Order gibt diese unverändert zurück, der Request kann also gefahrlos wiederholt werden.
Beispielantwort
{
"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"
}
}
}
Kann die Order nicht storniert werden, antwortet die API mit 412 Precondition Failed und einer Meldung mit dem Grund: Der aktuelle Status lässt es nicht zu (der Status wird in der Meldung genannt), oder die Produktion hat bereits begonnen.
{
"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)."
]
}
}
Bestellablauf
Eine Bestellung wird über drei Status verfolgt: den status der Bestellung, ihren Produktionsstatus fulfillment_status und den status jeder Sendung in shipments. Jede Änderung wird im Webhook order.updated gesendet und von GET /orders/{order_id} zurückgegeben.
Bestellstatus
Der status einer Bestellung, in der Reihenfolge, in der er erreicht wird:
imported- die Bestellung ist über die API eingegangen. Jede Bestellung beginnt hier.on hold- das Guthaben deckt die Kosten der Bestellung nicht. Sobald es aufgeladen ist, kehrt die Bestellung zuimportedzurück und wird fortgesetzt.accepted- die Bestellung wurde angenommen und geht in die Produktion.completed(endgültig) - alle Artikel wurden produziert.canceled(endgültig) - die Bestellung wurde storniert. Das ist möglich, solange sieimported,acceptedoderon holdist und die Produktion noch nicht begonnen hat.
Erfüllungsstatus
Der fulfillment_status einer Bestellung und jeder Bestellzeile, in der Reihenfolge, in der er erreicht wird. Er bewegt sich nur vorwärts, nie zurück:
unfulfilled- die Produktion hat noch nicht begonnen.scheduled- die Bestellung ist in einer Produktionscharge eingeplant. Ab hier kann sie nicht mehr storniert werden.processing- die Produktion läuft.partially fulfilled- einige Artikel sind fertig, die übrigen sind noch in Produktion.fulfilled(endgültig) - alle Artikel sind fertig. Derstatusder Bestellung wird dann zucompleted.
Eine Bestellung als Ganzes wird nie abgelehnt. Ein einzelner Artikel kann bei der Qualitätskontrolle in der Produktion abgelehnt werden. Er wird dann erneut gedruckt: Er kehrt zu unfulfilled zurück und durchläuft die Produktion noch einmal, während die Bestellung ihren Status behält und fortgesetzt wird, sobald der Artikel fertig ist.
Versandstatus
Der status jeder Sendung in shipments, in der Reihenfolge, in der er erreicht wird:
pending- die Sendung wird vorbereitet.registered- das Etikett wurde beim Versanddienstleister erstellt.collected- der Versanddienstleister hat das Paket abgeholt.in transit- das Paket ist unterwegs.delivered(endgültig) - das Paket wurde zugestellt.
Ausnahmen:
failed- der Versanddienstleister hat ein Problem gemeldet.returned(endgültig) - das Paket wurde an uns zurückgesendet.canceled(endgültig) - die Sendung wurde storniert.
Fulfilment verfolgen
Um den Fulfilment-Status einer bestimmten Order abzurufen, senden Sie einen GET Request an https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. Die Response enthält Fulfilments zur Order, inklusive Item-Status, Produktdetails und Fortschritt der Produktionsschritte.
Beispielantwort
{
"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
}
}
]
}
]
}
Die Antwort enthält eine Liste der Erfüllungen, die jeweils Folgendes enthalten:
id– eindeutige Kennung für die Erfüllung.barcode– Barcode für interne Nachverfolgung und Identifizierung; kann auch auf das Produkt gedruckt werden.status– der aktuelle Erfüllungsstatus: unerfüllt oder erfüllt.created_atundupdated_at– Zeitstempel für die Erfüllungserstellung und letzte Aktualisierung.variant– detaillierte Informationen zur Produktvariante: Name, Untertitel, SKU.product– Produktdetails: Name, Untertitel.production_steps– Reihe von Produktionsschritten. Die Liste der Schritte hängt vom Produkttyp ab. Für jeden Schritt:id– eindeutige Kennung für den Produktionsschritt.name– z.B. „Druckbettdecke“.description– was der Produktionsschritt beinhaltet.status– der aktuelle Status:- ausstehend – noch nicht gestartet.
- in Bearbeitung – derzeit in Bearbeitung.
- abgelehnt – der Schritt ist auf ein Problem gestoßen und wurde nicht abgeschlossen erfolgreich.
- erledigt – der Schritt wurde abgeschlossen.
notes– alle zusätzlichen Notizen im Zusammenhang mit dem Schritt.updated_at– das letzte Mal, als der Schrittstatus aktualisiert wurde.
Jeder Erfüllungsdatensatz entspricht einem bestimmten Produkt oder einer bestimmten Produktvariante innerhalb der Bestellung, und jedes Exemplar des Produkts in der Bestellung verfügt über einen eigenen Erfüllungsdatensatz – jeder Artikel wird während der gesamten Produktion einzeln verfolgt.
Wenn für eine Bestellung keine Erfüllung zurückgegeben wird, befindet sich die Bestellung noch nicht in der Bearbeitungsphase.
Anforderungen an Quelldateien
Wenn Sie source files in Ihrer Order verwenden, müssen diese die folgenden Anforderungen erfüllen:
type
PDF ist das bevorzugte Quellformat. Für ein Produkt mit nur einer Druckebene, etwa eine Decke oder ein Handtuch, eignet sich auch eine JPEG-, PNG- oder TIFF-Datei. Für ein Produkt mit mehreren Ebenen liefern Sie eine PDF-Datei, in der jede Ebene eine eigene Seite ist: Bei der Verarbeitung wird jede Seite als eigene Ebene behandelt, sodass ein mehrlagiges Design als eine einzige Quelldatei eingereicht wird. Siehe PDF-Anforderungen und Seitenreihenfolge.
Setzen Sie type nach dem Dateiformat. Für ein PDF verwenden Sie "file": Jede Seite wird auf eine Ebene des Produkts gedruckt, in der für dieses Produkt angegebenen Seitenreihenfolge. Für eine JPEG-, PNG- oder TIFF-Datei, die sich für ein Produkt mit nur einer Druckebene eignet, verwenden Sie "print".
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/source.pdf"
}
]
Weitere Einzelheiten finden Sie im Swagger documentation.
url
Das Feld url muss einen direkten Link zur Quelldatei enthalten. Stellen Sie sicher, dass auf die URL zugegriffen werden kann und die Datei ohne Authentifizierung heruntergeladen werden kann. Der Link muss während des gesamten Produktionsprozesses zugänglich bleiben.
So laden wir die Datei herunter
Wir laden die Datei zweimal von Ihrem Server: mit einem Request mit Range: 0-0, während die Order validiert wird, und danach vollständig. Beide Requests senden den User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); wenn Ihre Website automatisierten Traffic filtert, lassen Sie ihn zu. Die URL muss HTTPS auf Port 443 verwenden und die Datei direkt, ohne Weiterleitungen, mit ihrem tatsächlichen Content-Type liefern, z. B. application/pdf. Jeder Request bricht nach 60 Sekunden ab.
Dateiformat
Liefern Sie eine PDF-Datei oder, für ein Produkt mit einer Ebene, eine JPEG-, PNG- oder TIFF-Datei, ausgeliefert mit ihrem tatsächlichen Content-Type. Transparente Bereiche einer PNG werden weiß gedruckt. Achten Sie darauf, dass die Bilder hochwertig und für den Druck geeignet sind.
Bildabmessungen
Die maximalen Abmessungen betragen 15,000 pixels auf beiden Seiten. Bilder, die diese Grenze überschreiten, können in der Größe geändert oder abgelehnt werden. Die Bildauflösung sollte den Produktabmessungen entsprechen. Andernfalls kann es sein, dass die Größe der Bilder angepasst oder sie zugeschnitten werden.
Auflösung
Keine besonderen Anforderungen an die Auflösung – stellen Sie einfach sicher, dass die Bildqualität zum Drucken ausreichend ist.
Farbraum
Für eine genaue Farbdarstellung sollten Bilder im RGB-Farbraum vorliegen. Andere Farbräume werden bei der Verarbeitung konvertiert, was zu falschen Farben führen kann.
Dateigröße
Jede Quelldatei darf höchstens 200 MB groß sein. Eine größere Datei wird abgelehnt: beim Erstellen der Order, wenn Ihr Server eine Content-Length sendet, sonst beim Herunterladen der Datei.
PDF-Anforderungen und Seitenreihenfolge
Die Reihenfolge der Seiten im PDF ist wichtig. Die Seiten werden nach Position den Produktebenen zugeordnet und die erwartete Seitenreihenfolge hängt vom Produkttyp ab. Stellen Sie sicher, dass die Seiten in Ihrer PDF-Datei der richtigen Ebenenreihenfolge für das Produkt entsprechen, das Sie einreichen.
| Produkt | PDF-Seitenreihenfolge |
|---|---|
| Duvet Cover |
|
| Curtains |
|
| T-shirt |
|
| Tanktop |
|
| Sweater |
|
| Hoodie |
|
| Sweatpants |
|
| Sweatshorts |
|
Wichtig: Jede PDF-Seite muss den erforderlichen Abmessungen für ihre Produktebene entsprechen und korrekt ausgerichtet sein. Platzieren Sie das Bildmaterial so, dass der obere Rand des Designs mit dem oberen Rand der Seite übereinstimmt. Eine falsche Seitengröße oder -ausrichtung kann zu Skalierungs-, Rotations- oder Ausrichtungsproblemen in der Produktion führen.
Versand
Erfahren Sie, was der Versand einer Order kostet und wie lange sie unterwegs ist, bevor Sie sie aufgeben, berechnet nach denselben Regeln, nach denen Fabrixa die Order selbst berechnet.
Versandländer
Um herauszufinden, in welche Länder eine Produktvariante versendet werden kann, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/shipping/countries mit Ihren Zugangsdaten. Die Liste enthält, nach Namen sortiert, die Länder, in die der Standort, der die Variante produziert, einen Versandtarif für ein Versandpaket hat, in das sich die Variante verpacken lässt. Ein Land, das nicht aufgeführt ist, hat keinen Versandtarif für die Variante.
Abfrageparameter
variant_idodersku– die Variante, so angegeben wie in einer Order-Zeile, ebenso wie bei der Schätzung.
Musteranfrage
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'
Beispielantwort
{
"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
}
]
}
Felder der Antwort
codeundname– das Land, mit dem ISO 3166-1 alpha-2-Code, den Sie alscountry_codean die Schätzung übergeben.min_shipping_priceundmax_shipping_price– die Spanne dessen, was ein einzelnes Versandpaket in das Land kostet, ohne MwSt., in der Währung auscurrency, über die Pakete hinweg, in die sich die Variante verpacken lässt. Eine Order mit mehreren Einheiten kann mehrere Pakete benötigen; fragen Sie daher für den Preis einer bestimmten Menge eine Schätzung an.min_eta_daysundmax_eta_days– die Spanne der Tage, die ein Paket nach der Übergabe an den Versanddienstleister unterwegs ist, ohne Produktionszeit;null, wenn die Tarife keine Lieferschätzung enthalten.
Versand abschätzen
Um herauszufinden, was der Versand einer Produktvariante kosten würde und wie lange die Sendung unterwegs wäre, senden Sie eine GET-Anfrage an https://api.fabrixa.com/v2/integration/shipping/estimate mit Ihren Zugangsdaten. Die Schätzung folgt den Regeln, nach denen der Preis einer Order berechnet wird: Die Einheiten werden in die Versandpakete des Standorts verpackt, der die Variante produziert, und der Preis jedes Pakets ergibt sich aus der Route von diesem Standort ins Zielland. Es wird nichts bestellt oder reserviert, und der Preis einer Order wird erst bei ihrer Aufgabe berechnet; ihre Versandkosten können daher abweichen, wenn sich die Tarife zwischenzeitlich ändern.
Abfrageparameter
variant_idodersku– die Variante, so angegeben wie in einer Order-Zeile: eine Variante eines Ihrer Produkte oder eine Katalogvariante. Es muss eine Variante sein, die Sie bestellen können.country_code– der ISO 3166-1 alpha-2-Code des Landes, in das die Order versendet wird, zum BeispielNL.quantity– die Anzahl der Einheiten, von 1 bis 1000.
Musteranfrage
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'
Beispielantwort
{
"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
}
}
Felder der Antwort
variant_id,sku,quantityundcountry_code– die Variante, die Menge und das Ziel, für die die Schätzung gilt.origin_country– das Land, aus dem die Variante versendet wird, mit seinemcodeundname.packages_count– die Anzahl der Versandpakete, in die die Einheiten verpackt werden.packages– die Pakete selbst, ein Eintrag je Pakettyp:package_type, seinelength,widthundheightin cm, diequantitysolcher Pakete, derpricefür den Versand eines davon und seineeta_days. Die Preise mal die Mengen ergeben zusammenshipping_price.shipping_price– der Versandpreis aller Pakete zusammen, ohne MwSt., in der Währung auscurrency. Auf einer Route ohne Versandtarif ist der Versand wie bei einer Order kostenlos und wird mit0.00berechnet.eta_days– die Anzahl der Tage, die das langsamste Paket nach der Übergabe an den Versanddienstleister unterwegs ist, ohne Produktionszeit;null, wenn es für die Route keine Lieferschätzung gibt.
Eine Anfrage, die die Validierung nicht besteht, wird mit 400 Bad Request und dem Grund für jedes Feld beantwortet, mit denselben Meldungen wie bei einer Order-Zeile, zum Beispiel The variant not found. Wenn kein Versandpaket die Einheiten aufnehmen kann, lautet die Antwort 400 Bad Request mit der Meldung No shipping package can carry the variant.
Fabrixa Studio
Fabrixa Studio ist ein Tool, mit dem Benutzer Produkte nahtlos in Echtzeit anpassen und personalisieren können, mit einer intuitiven Benutzeroberfläche, über die Benutzer ihre eigenen Designs erstellen oder hochladen können.
Fabrixa Studio ist ideal für Unternehmen, die kundenspezifische Produkte anbieten – so können Kunden ihre Designs visualisieren, bevor sie Bestellungen abschließen.
Fabrixa Studio einbetten
Sie können Fabrixa Studio per iframe in Ihre Website einbetten. Dadurch können Kunden Produkte direkt auf Ihrer Seite während des Checkouts personalisieren.
Beispiel-Iframe zum Einbetten von 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>
Ersetzen Sie die Werte für product_sku, cart_item_key und application_key durch Ihre dynamischen Werte.
application_key– eindeutiger Schlüssel zur Authentifizierung bei der Integrations-API.product_sku– die SKU der Produktvariante, abgerufen von der Integrations-API.cart_item_key– ein eindeutiger Wert von der Einbettungsplattform, der den mit dem Produkt verknüpften Warenkorbartikel identifiziert. Wird zum Speichern der Benutzeranpassungen verwendet; Bei der Auftragserstellung identifiziert es die gespeicherten Anpassungen und ordnet sie der Bestellung zu. Siehe Beispiel unten.locale(optional) – die Sprache der Studio-Oberfläche und ihrer Fehlermeldungen, z. B.de_DEoderde. Ohne diesen Parameter öffnet sich Studio in der Browsersprache des Käufers, sofern sie unterstützt wird, sonst auf Englisch.
Die Kopfzeile von Studio zeigt den Produktnamen so, wie er in Ihrem Shop steht – denselben Titel, den Ihre Kunden sehen –, darunter die Optionen der gewählten Variante. Es ist die eigene Kopie des Produkts in Ihrem Shop: Ein Name, den Sie in Fabrixa ändern, erscheint auch in Studio; locale übersetzt ihn nicht.
Anfrage zum Erstellen einer Bestellung mit 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": {
"...": "..."
}
}
Behandeln Sie Studio-Events
Wenn im Iframe auf die Schaltfläche Zum Warenkorb hinzufügen geklickt wird, wird der folgende Befehl ausgeführt:
window.parent.postMessage('customizationFinished', '*');
Ähnlich verhält es sich, wenn auf die Schaltfläche Zurück geklickt wird:
window.parent.postMessage('closeButtonClicked', '*');
Die postMessage-Methode erleichtert die ursprungsübergreifende Kommunikation zwischen dem Iframe und seinem übergeordneten Fenster und ermöglicht es ihr, das übergeordnete Fenster über bestimmte Benutzeraktionen zu benachrichtigen.
Das erste Argument von postMessage sind die Daten, die Sie senden möchten. Die Zeichenfolge 'customizationFinished' gibt an, dass der Benutzer die Anpassung abgeschlossen hat und das Produkt in den Warenkorb legt. 'closeButtonClicked' zeigt an, dass der Benutzer sich für die Rückkehr entschieden hat.
Warten Sie im übergeordneten Fenster mit dem message-Ereignis-Listener auf diese Nachrichten:
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.');
}
}
});
Überprüfen Sie immer den origin eingehender Nachrichten, um sicherzustellen, dass sie von einer vertrauenswürdigen Quelle stammen. Führen Sie abhängig von der empfangenen Nachricht die erforderlichen Aktionen aus – aktualisieren Sie die Benutzeroberfläche, verarbeiten Sie den Warenkorb usw. Die Validierung von origin ist für die Sicherheit von entscheidender Bedeutung – sie verhindert, dass nicht autorisierte Skripte mit Ihrer Anwendung interagieren.
Anpassungsvorschau
Nachdem die Anpassung abgeschlossen ist, zeigen Sie das endgültige Design über die unten stehende Vorschau-URL an. Diese URL gibt ein Bild des angepassten Produkts zurück, das als src-Wert in einem <img>-Tag geeignet ist. Ideal, um das personalisierte Produkt in Ihrem Warenkorb, in der Bestellübersicht oder an einer beliebigen Stelle in Ihrer Shop-Oberfläche anzuzeigen.
https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}
Ersetzen Sie {CART_ITEM_KEY} durch den tatsächlichen Warenkorbartikelschlüssel und {APPLICATION_KEY} durch Ihren gültigen Anwendungsschlüssel.
Beispielverwendung in einem Bild-Tag:
<img
src="https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}"
alt="Customized Product Preview"
style="max-width: 100%; height: auto;" />
Live-Demo
Die Vorschau der Anpassung erscheint hier, sobald das Design fertiggestellt ist.
Fabrixa Webhooks
Webhooks werden von Fabrixa verwendet, um Ihr System über Echtzeitereignisse zu benachrichtigen – Bestellaktualisierungen oder -kreationen. Wenn ein Ereignis eintritt, sendet Fabrixa einen Webhook mit den relevanten Informationen an Ihren Server. Ihr Server muss einen öffentlichen POST-Endpunkt bereitstellen, um eingehende Webhooks zu verarbeiten.
Webhook-Anforderungsheader
Der Webhook Request enthält die folgenden Headers, damit Sie die eingehende Anfrage identifizieren und validieren können:
{
"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"
}
Header-Aufschlüsselung
content-type– für Webhooks immer aufapplication/jsoneingestellt.x-webhook-signature– die HMAC-SHA256-Signatur zur Anforderungsüberprüfung.x-webhook-topic– der Ereignistyp oder das Thema des Webhooks. Zum Beispiel:order.created– wird ausgelöst, wenn eine neue Bestellung erstellt wird.order.updated– wird ausgelöst, wenn eine bestehende Bestellung aktualisiert wird.
Webhooks werden mit dem User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook) gesendet; wenn Ihr Endpoint automatisierten Traffic filtert, lassen Sie ihn zu. Um sicherzugehen, dass ein Request von Fabrixa stammt, prüfen Sie x-webhook-signature.
Webhook-Ereignisse
Fabrixa Webhooks informieren Ihr System über Änderungen am Order-Status oder an Aktivitäten. Jeder Webhook wird durch einen bestimmten x-webhook-topic Wert ausgelöst. Aktuell unterstützte Topics:
| Thema | Beschreibung |
|---|---|
order.created |
Wird ausgelöst, wenn eine neue Bestellung in Fabrixa aufgegeben wird, entweder per API-Anfrage oder direkt in der Plattform. |
order.updated |
Wird ausgelöst, wenn Bestelldetails wie der Bestellstatus oder der Erfüllungsstatus aktualisiert werden. |
Beispiel für eine Webhook-Nutzlast
Ein Beispiel für die mit dem Webhook gesendete Nutzlast. Diese Nutzlast stellt eine Bestellaktualisierung dar:
{
"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"
}
]
}
Sobald die Order versendet ist, listet shipments jede Sendung mit ihrem Versanddienstleister (carrier), der Versandart (method), dem Status (status: pending, registered, collected, in transit, delivered, failed, returned oder canceled) und der Sendungsverfolgung: tracking_number und tracking_url, sowie dasselbe für jedes Paket in packages, wenn eine Sendung mehrere hat. Ein order.updated Webhook wird gesendet, sobald sich der Status oder die Sendungsverfolgung einer Sendung ändert, und GET /orders/{order_id} liefert dasselbe Feld.
Webhook-Signaturen überprüfen
Um sicherzustellen, dass der Webhook Request authentisch und unverändert ist, prüfen Sie den x-webhook-signature Header. Berechnen Sie die HMAC-SHA256 Signature mit dem raw request payload und Ihrer secret key neu und vergleichen Sie sie mit der empfangenen Signature.
Rohes PHP-Beispiel
$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-Beispiel
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...
}
Ersetzen Sie $yourSecret durch Ihren gemeinsamen geheimen Schlüssel. Verwenden Sie immer hash_equals zum Vergleichen von Signaturen, um Timing-Angriffe abzuwehren.
Webhook-Wiederholungsversuche
Webhooks werden standardmäßig nach 10 erfolglosen Zustellungsversuchen deaktiviert. Wenn Ihr Endpunkt einen fehlgeschlagenen Status wie 404 oder einen 5xx-Fehler zurückgibt, wird der Webhook insgesamt zehnmal erneut versuchen. Wenn weiterhin ein Nicht-2xx- oder Nicht-3xx-Antwortcode zurückgegeben wird, wird es deaktiviert. Zu den erfolgreichen Antworten gehören:
2xx– zeigt erfolgreiche Verarbeitung an, z.B.200 OK.301und302– Umleitungsantworten, die angeben, dass der Webhook erfolgreich verarbeitet oder weitergeleitet wurde.
Webhook-Antwort
Wir empfehlen dringend, dass Ihr Endpunkt so schnell wie möglich einen 200 OK-Statuscode zurückgibt, um den erfolgreichen Empfang des Webhooks zu bestätigen. Während jede 2xx- oder 3xx-Antwort als erfolgreich gilt, ist 200 die am häufigsten verwendete und zuverlässigste.
Um Übermittlungszeitüberschreitungen oder Wiederholungsversuche zu vermeiden, geben Sie 200 OK sofort zurück und verarbeiten Sie die Webhook-Nutzlast asynchron, beispielsweise über einen Hintergrundjob oder eine Warteschlange. Wenn die Antwort Ihres Endpunkts zu lange dauert, kann dies als Fehler betrachtet werden, auch wenn die Antwort letztendlich erfolgreich ist.
Antworten mit Statuscodes im Bereich 4xx oder 5xx oder Zeitüberschreitungen lösen Wiederholungsversuche gemäß dem Wiederholungsmechanismus aus.