ENTWICKLER · Referenz zur Integrations-API

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.

VOR IHRER ERSTEN ANFRAGE

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.

WIE ANTWORTEN STRUKTURIERT SIND

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.

WENN ETWAS schief geht

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.

KENNEN SIE IHRE ANFRAGEGRENZEN

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.

TESTEN, BEVOR SIE LIVE GEHEN

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:

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.

FINDEN SIE, WAS SIE VERKAUFEN

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.

WAS FABRIXA PRODUZIERT

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

  • page und limit (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-SKU damit 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, popular oder sold, in der sort_order asc oder desc. 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, code und HS_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_price und variants_max_selling_price – die Preisspanne über die gelisteten Varianten.
  • type – der Produkttyp, der die Druckebenen und die PDF-Seitenreihenfolge festlegt; status – im Katalog immer Active.
  • categories – die Kategorien, in denen das Produkt liegt, jede mit ihrer parent_category.
  • images – die Produktbilder mit url, is_main, screen_type_size und sort_number.
  • variants – die bestellbaren Ausführungen des Produkts: id, name, subtitle, SKU, selling_price, die Maße width, height, length und weight sowie options, die Optionswerte, die diese Variante ausmachen, zum Beispiel ihre Größe.
FINDEN SIE SICH ZURECHT

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

  • page und limit (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 – true lässt die Kategorien weg, die weder direkt noch in einer Unterkategorie ein Katalogprodukt enthalten.
  • sort_by – category_name oder category_created, in der sort_order asc oder desc. 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
                }
            ]
        }
    ]
}
IHR KONTO

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

  • page und limit (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-SKU damit 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, length und weight.
  • 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.
  • categories und collections – die Kategorien und Kollektionen, in die Sie das Produkt in Ihrem Konto einsortiert haben.
  • images – die Produktbilder mit url, is_main, image_size, screen_type_size und sort_number.
  • variants – die bestellbaren Ausführungen des Produkts, siehe Produktvarianten: id, name, subtitle, SKU, options, images und die Druckebenen in available_source_types und required_source_types.
WAS EINE ORDER-ZEILE NENNT

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, images und das product, 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 der type einer 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 als type; eine Zeile, in der eine fehlt, wird mit 400 Bad Request und 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_id gefunden oder über ihre sku, 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 Request und 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. oder The catalog variant is not active.
Bestellungen erstellen und verfolgen

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.

Bereiten Sie Ihre Bestelldaten vor

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 als YYYY-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 als Code 128.
    • cart_item_key (erforderlich ohne sources) – eindeutige Kennung von der Plattform, die Fabrixa Studio einbettet, Wird verwendet, um gespeicherte Anpassungen mit der Bestellung zu verknüpfen.
    • sources (erforderlich ohne cart_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 als YYYY-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"
        }
    }
}
Ändern Sie die Orderdaten

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 rows wird mit 400 Bad Request abgelehnt. Um die Artikel zu ändern, stornieren Sie die Order und erstellen Sie eine neue.
  • Eine Order im Status on hold kann nicht aktualisiert werden; die API antwortet mit 412 Precondition Failed.
{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338"
    },
    "meta": [],
    "errors": {
        "rows": [
            "Order rows cannot be changed. Cancel the order and create a new one."
        ]
    }
}
Stoppen Sie eine Order

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, accepted oder on hold ist und ihr fulfillment_status noch unfulfilled ist. Sobald er scheduled wird, 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)."
        ]
    }
}
VOM IMPORT BIS ZUR ZUSTELLUNG

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:

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:

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:

Ausnahmen:

Verfolgen Sie Ihre Bestellartikel

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_at und updated_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.

SO BEREITSTELLEN SIE DRUCKDATEIEN

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.

ProduktPDF-Seitenreihenfolge
Duvet Cover
  1. Duvet cover
  2. Pillow front
  3. Pillow back
Curtains
  1. Left curtain
  2. Right curtain
T-shirt
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Collar
Tanktop
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Collar
Sweater
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Left cuff
  6. Right cuff
  7. Collar
  8. Waistband
Hoodie
  1. Front
  2. Back
  3. Left sleeve
  4. Right sleeve
  5. Left cuff
  6. Right cuff
  7. Hood inside left
  8. Hood inside right
  9. Hood outside left
  10. Hood outside right
  11. Waistband
  12. Pocket lower left
  13. Pocket lower right
  14. Pocket upper right
  15. Pocket upper left
Sweatpants
  1. Front right
  2. Front left
  3. Back left
  4. Back right
  5. Left cuff
  6. Right cuff
  7. Waistband
  8. Right pocket
  9. Left pocket
  10. Back pocket
  11. Back pocket interfacing
Sweatshorts
  1. Front right
  2. Front left
  3. Back left
  4. Back right
  5. Waistband
  6. Right pocket
  7. Left pocket

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.

LIEFERUNG PLANEN

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.

WOHIN VERSENDET WIRD

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_id oder sku – 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

  • code und name – das Land, mit dem ISO 3166-1 alpha-2-Code, den Sie als country_code an die Schätzung übergeben.
  • min_shipping_price und max_shipping_price – die Spanne dessen, was ein einzelnes Versandpaket in das Land kostet, ohne MwSt., in der Währung aus currency, ü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_days und max_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.
BEVOR SIE BESTELLEN

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_id oder sku – 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 Beispiel NL.
  • 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, quantity und country_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 seinem code und name.
  • packages_count – die Anzahl der Versandpakete, in die die Einheiten verpackt werden.
  • packages – die Pakete selbst, ein Eintrag je Pakettyp: package_type, seine length, width und height in cm, die quantity solcher Pakete, der price für den Versand eines davon und seine eta_days. Die Preise mal die Mengen ergeben zusammen shipping_price.
  • shipping_price – der Versandpreis aller Pakete zusammen, ohne MwSt., in der Währung aus currency. Auf einer Route ohne Versandtarif ist der Versand wie bei einer Order kostenlos und wird mit 0.00 berechnet.
  • 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.

PRODUKTANPASSUNG

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.

Fügen Sie Studio zu Ihrem Shop hinzu

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.

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": {
    "...": "..."
  }
}
Achten Sie auf die Aktionen der Kunden

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.

ZEIGEN SIE DAS FERTIGE DESIGN

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;" />
VERSUCHEN SIE ES MIT IHREN WERTEN

Live-Demo

Die Vorschau der Anpassung erscheint hier, sobald das Design fertiggestellt ist.

Customization preview
ERHALTEN SIE VERANSTALTUNGS-UPDATES

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.

Überprüfen Sie Ihre eingehenden Header

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

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.

WÄHLEN SIE DIE THEMEN IHRER VERANSTALTUNG

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:

ThemaBeschreibung
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.
Überprüfen Sie die Nutzlast Ihrer Veranstaltung

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.

ÜBERPRÜFEN SIE IHRE WEBHOOK-QUELLE

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.

Was passiert, wenn die Lieferung scheitert?

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:

Geben Sie eine klare Antwort zurück

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.