Riferimento API Fabrixa Integration
36 min di lettura Ultimo aggiornamento: 06-11-2026 119 visualizzazioni
L’API Integration ti aiuta a creare e gestire ordini Fabrixa, avviare Fabrixa Studio e restare sincronizzato con produzione e fulfilment tramite webhook. L’API segue le convenzioni REST e usa JSON per tutti i body di richiesta e risposta.
URL BASE
https://api.fabrixa.com/v2/integration
Invia tutte le richieste a questo URL base seguito dal percorso endpoint specifico. L’URL base è il punto di partenza per interagire con la Fabrixa API: recuperare, creare, aggiornare o eliminare risorse.
Autenticazione
Per accedere all’API Integration, autentica le richieste usando sia un Application Access Token sia una Application Key:
Intestazione dell'autorizzazione
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Intestazione della chiave dell'applicazione
X-Application-Key: APPLICATION_KEY
Esempio di comando cURL
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'
Sostituisci APPLICATION_ACCESS_TOKEN con il tuo token di accesso effettivo e APPLICATION_KEY con la tua chiave di applicazione effettiva.
Endpoint e richieste
Gli endpoint dell’API Integration sono organizzati per tipo di risorsa e seguono lo stile REST. Ogni endpoint rappresenta una risorsa e le azioni sono eseguite con metodi HTTP standard.
Tutte le richieste e risposte dell’API Integration usano JSON, offrendo un’interfaccia coerente e semplice.
Per i dettagli completi su ogni endpoint, inclusi esempi di richieste e risposte, consulta il nostro Swagger documentation.
Formato della risposta
Tutti gli endpoint restituiscono i dati in un formato standardizzato con questi oggetti:
{
"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"
}
]
}
Descrizione degli oggetti di risposta
links
Contiene collegamenti di impaginazione per navigare tra i risultati.
self— l'URL della pagina corrente.first_page— l'URL della prima pagina dei risultati.last_page— l'URL dell'ultima pagina dei risultati.next_page— l'URL della pagina successiva.nullse non è presente la pagina successiva.prev_page— l'URL della pagina precedente.nullse non esiste una pagina precedente.
meta
Contiene metadati sulla risposta, come le informazioni sull'impaginazione.
total— il numero totale di elementi disponibili in tutte le pagine.current_page— il numero di pagina corrente dei risultati.per_page— il numero di elementi per pagina.
data
Il contenuto principale della risposta. data varia in base all'endpoint: può essere un singolo oggetto, ad esempio un prodotto, o una serie di oggetti, ad esempio un elenco di prodotti.
Errori e codici di stato
Tutte le richieste API restituiscono codici di stato HTTP che forniscono informazioni dettagliate sulla risposta.
400 Bad Request
Il server non può elaborare la richiesta a causa di errori di convalida: parametri mancanti o non validi.
401 Unauthorized
Il client non ha fornito credenziali di autenticazione valide. Restituito anche quando il token di accesso è stato revocato.
403 Forbidden
Il server ha rifiutato la richiesta a causa di diritti di accesso insufficienti, generalmente causati da autorizzazioni di accesso errate o mancanti.
404 Not Found
Impossibile trovare la risorsa richiesta sul server.
412 Precondition Failed
La richiesta non può essere applicata nello stato attuale della risorsa, ad esempio un ordine che non può più essere annullato.
429 Too Many Requests
Il client ha superato il numero consentito di richieste in un determinato periodo di tempo. Vedere Rate Limits.
5xx Errors
Si è verificato un errore interno del server. Contatta il supporto Fabrica con i dettagli della richiesta non riuscita.
Corpo della risposta all'errore
Un esempio di corpo della risposta all'errore:
{
"links": {
"self": "https://api.fabrixa.com/v2/integration/ping"
},
"meta": [],
"errors": {
"messages": [
"Application Key is not specified."
]
}
}
errors contiene dettagli su ciò che non è riuscito. L'array messages elenca le descrizioni degli errori. Per una richiesta errata, riceverai i nomi dei campi che non hanno superato la convalida.
Limiti di richiesta
L'API di integrazione supporta un limite di 30 richieste per applicazione al minuto.
Se superi questo limite riceverai una risposta 429 Too Many Requests.
Tutte le risposte dell'API di integrazione includono l'intestazione X-RateLimit-Remaining, il numero di richieste che il client può ancora effettuare e l'intestazione X-RateLimit-Limit, il totale consentito al minuto.
Modalità sandbox
La modalità sandbox ti permette di testare la tua integrazione da cima a fondo prima che qualsiasi ordine reale venga prodotto o addebitato. Si applica all’intero account: gli ordini di tutti i canali di vendita, inclusi l’Integration API e i negozi Shopify e WooCommerce collegati, non vengono prodotti né addebitati sul tuo saldo. Il tuo account è in modalità sandbox finché il suo stato è in attesa di attivazione.
In modalità sandbox puoi:
- collegare il tuo negozio Shopify o WooCommerce oppure creare un canale Integration API;
- aggiungere prodotti e verificare prezzi e stime di spedizione;
- importare, creare, aggiornare e annullare ordini;
- verificare che nessuno di questi ordini venga prodotto o addebitato sul tuo saldo;
- verificare la consegna dei webhook e le firme.
Per testare gli ordini, aggiungi prodotti dal catalogo Fabrixa: apri un prodotto, fai clic su Vendi questo prodotto e scegli varianti e design. Compariranno poi in I miei prodotti.
Per passare il tuo account alla modalità sandbox, apri Platform, vai in Impostazioni → Azienda → Modalità sandbox e fai clic su Passa alla modalità sandbox. Puoi attivarla anche quando aggiungi un nuovo canale di vendita, compreso un canale Integration API, oppure scrivere a support@fabrixa.com e lo passeremo noi alla modalità sandbox. La modalità sandbox è disponibile solo per gli account attivi.
Quando sei pronto, attiva l’account da solo in Platform in Impostazioni → Azienda → Modalità sandbox. Puoi anche scrivere a support@fabrixa.com e lo attiveremo noi per te. I negozi collegati e le credenziali API continuano a funzionare, quindi non serve riconfigurare nulla.
Dopo l’attivazione, tutti i nuovi ordini vanno in produzione e vengono addebitati sul tuo saldo. Gli ordini creati prima dell’attivazione restano ordini di prova: non vengono mai prodotti né addebitati, nemmeno dopo l’attivazione.
Prodotti
Il catalogo è tutto ciò che Fabrixa produce. I tuoi prodotti sono i prodotti del catalogo che hai aggiunto al tuo account Fabrixa, con i tuoi nomi, descrizioni, immagini e SKU. Una riga d'ordine indica una variante di prodotto - una taglia o una versione di un prodotto - tramite il suo sku o variant_id: una variante di uno dei tuoi prodotti, oppure una variante del catalogo ordinata direttamente.
Sfoglia il catalogo
Per elencare i prodotti che Fabrixa produce, invia una richiesta GET a https://api.fabrixa.com/v2/integration/catalog/products con le tue credenziali. Elenca i prodotti attivi che hanno una variante che un partner di stampa produce attualmente, e solo quelle varianti, ciascuna con il suo SKU, prezzo di vendita, dimensioni e valori delle opzioni.
Parametri della query
pageelimit(fino a 100) - paginano l'elenco. Senza di essi l'intero catalogo viene restituito in una sola risposta.search- i prodotti il cui nome contiene il testo, o il cui slug oSKUdi variante inizia con esso.category_id- i prodotti di una categoria;parent_category_id- i prodotti di qualsiasi sottocategoria di una categoria di primo livello. Vedi Categorie del catalogo.group_id- i prodotti di un gruppo del catalogo.sort_by-name,created,updated,type,popularosold, nelsort_orderascodesc. Per impostazione predefinita i prodotti più recenti vengono per primi.
Richiesta di campione
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'
Esempio di risposta
{
"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"
}
]
}
]
}
]
}
]
}
Campi della risposta
id,name,subtitle,description(HTML),slug,codeeHS_code, il codice tariffario doganale.is_sellable- se il prodotto è aperto alla vendita. Un prodotto chiuso resta nell'elenco, ma un ordine per una delle sue varianti viene rifiutato.variants_min_selling_priceevariants_max_selling_price- la fascia di prezzo delle varianti elencate.type- il tipo di prodotto, che stabilisce i livelli di stampa e l'ordine delle pagine del PDF;status- nel catalogo sempreActive.categories- le categorie in cui si trova il prodotto, ciascuna con la suaparent_category.images- le immagini del prodotto, conurl,is_main,screen_type_sizeesort_number.variants- le versioni ordinabili del prodotto:id,name,subtitle,SKU,selling_price, le dimensioniwidth,height,lengtheweight, eoptions, i valori delle opzioni che definiscono questa variante, per esempio la sua taglia.
Categorie del catalogo
Per elencare le categorie in cui è organizzato il catalogo, invia una richiesta GET a https://api.fabrixa.com/v2/integration/catalog/categories con le tue credenziali. La risposta contiene le categorie di primo livello, ciascuna con le sue sottocategorie annidate in sub_categories e il numero di prodotti del catalogo che contiene in products_count. Passa l'id di una categoria come category_id quando sfogli il catalogo, oppure l'id di una categoria di primo livello come parent_category_id per ottenere in una volta i prodotti di tutte le sue sottocategorie.
Parametri della query
pageelimit(fino a 100) - paginano l'elenco. Senza di essi vengono restituite tutte le categorie.search- le categorie il cui nome contiene il testo.with_products_only-trueesclude le categorie che non contengono alcun prodotto del catalogo, né direttamente né in una sottocategoria.sort_by-category_nameocategory_created, nelsort_orderascodesc. Per impostazione predefinita le categorie seguono l'ordine del catalogo.
Richiesta di campione
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'
Esempio di risposta
{
"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
}
]
}
]
}
I tuoi prodotti
Per elencare i prodotti del tuo account, invia una richiesta GET a https://api.fabrixa.com/v2/integration/products con le tue credenziali. I tuoi prodotti sono i prodotti del catalogo che hai aggiunto al tuo account Fabrixa: portano i nomi, le descrizioni e le immagini che hai dato loro lì, e le loro varianti i valori di SKU che hai scelto. Vengono elencati solo i prodotti attivi, dieci per pagina a meno che non passi limit.
Parametri della query
pageelimit(fino a 100) - la pagina da restituire e la sua dimensione; per impostazione predefinita la prima pagina di dieci.search- i prodotti il cui nome contiene il testo, o il cui slug oSKUdi variante inizia con esso.
Richiesta di campione
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'
Esempio di risposta
{
"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"]
}
]
}
]
}
Per leggere un singolo prodotto, invia una richiesta GET a https://api.fabrixa.com/v2/integration/products/{product_id}, dove {product_id} è il suo id. La risposta contiene gli stessi campi dell'elenco. Un prodotto che non è nel tuo account, anche uno del catalogo, risponde 404 Not Found con il messaggio Product not found.
Campi della risposta
id,name,subtitle,description(HTML),slug,width,height,lengtheweight.type- il tipo di prodotto, che stabilisce i livelli di stampa e l'ordine delle pagine del PDF.available_options- ogni opzione del prodotto con tutti i suoi valori, per esempio ogni taglia in cui è disponibile; ogni variante prende un valore per opzione.categoriesecollections- le categorie e le collezioni in cui hai classificato il prodotto nel tuo account.images- le immagini del prodotto, conurl,is_main,image_size,screen_type_sizeesort_number.variants- le versioni ordinabili del prodotto, vedi Varianti di prodotto:id,name,subtitle,SKU,options,images, e i livelli di stampa inavailable_source_typeserequired_source_types.
Varianti di prodotto
Una variante è una versione ordinabile di un prodotto - una taglia, un colore - ed è ciò che indica una riga d'ordine, tramite sku o variant_id. Per leggere una variante di uno dei tuoi prodotti, invia una richiesta GET a https://api.fabrixa.com/v2/integration/variants/{variant_id}, dove {variant_id} è il suo id. Una variante di un prodotto che non è nel tuo account risponde 404 Not Found con il messaggio Variant not found.
Richiesta di campione
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'
Esempio di risposta
{
"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"]
}
}
Campi della risposta
id,name,subtitle,description,SKU,width,height,length,weight,options,images, e ilproducta cui appartiene la variante.available_source_types- i livelli di stampa della variante, con i nomi con cui li conosce il suo processo di produzione. Oltre a"file", che ogni variante accetta per un PDF, sono i valori che può assumere iltypedi un file sorgente; un prodotto con un solo livello di stampa elenca"print".required_source_types- i livelli che un file di stampa deve coprire. Un PDF inviato come"file"li copre con le sue pagine, nell'ordine delle pagine del tipo di prodotto. Altrimenti la riga ha bisogno di un file JPEG, PNG o TIFF per ciascuno di essi, con il nome del livello cometype; una riga in cui ne manca uno viene rifiutata con400 Bad Requeste i nomi dei livelli mancanti.
Una riga d'ordine per questa variante, con un PDF le cui pagine sono i suoi livelli:
"rows": [
{
"sku": "DDC-140200",
"quantity": 1,
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/duvet-cover.pdf"
}
]
}
]
Quali varianti si possono ordinare
- Una riga d'ordine può indicare una variante di un prodotto del tuo account, oppure direttamente una variante del catalogo, mai un prodotto di un altro cliente. La variante viene individuata tramite il suo
variant_id, o tramite il suoskuindipendentemente da maiuscole e minuscole. - La variante deve essere attiva, e il suo prodotto attivo e aperto alla vendita. Per la tua copia di un prodotto del catalogo, anche il prodotto del catalogo deve essere attivo e la variante del catalogo abilitata.
- Altrimenti l'ordine viene rifiutato con
400 Bad Requeste il motivo, per la riga in questione: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.oThe catalog variant is not active.
Ordini
Crea ordini in Fabrixa dal tuo storefront o dalla tua piattaforma, allega i file di stampa richiesti e segui ogni articolo durante il fulfilment.
Crea un ordine
Per creare un ordine tramite la Fabrixa Integration API, invia una richiesta POST a https://api.fabrixa.com/v2/integration/orders. Il request body deve includere:
Richiedi struttura corporea
number(opzionale) - il numero dell'ordine. Se non fornito, viene generato un numero univoco.comments(facoltativo) - eventuali commenti o note aggiuntivi relativi all'ordine.purchased_at- data e ora in cui l'ordine è stato acquistato, formattato comeYYYY-MM-DD HH:MM:SS.client_ip(facoltativo) - l'indirizzo IP del cliente.client_user_agent(facoltativo) - il stringa dell'agente utente del cliente.rows- array di articoli dell'ordine, ciascuno contenente:sku- lo SKU della variante di prodotto. Per i dettagli, vedere Swagger.quantity- quantità della variante di prodotto ordinata.client_barcode(opzionale) - identificatore univoco lato client per riga dell'ordine, formattato comeCode 128.cart_item_key(richiesto senzasources) - identificatore univoco dall'incorporamento della piattaforma Fabrixa Studio, utilizzato per associare le personalizzazioni salvate all'ordine.sources(richiesto senzacart_item_key) - array di file sorgente associati al prodotto, ciascuno contenente:type-"file"per un PDF, oppure"print"per un file JPEG, PNG o TIFF.url- URL della fonte file.
customer- dettagli cliente:first_name,last_name,email,phone.
shipping_address- dettagli spedizione:address,address2(opzionale),address3(opzionale).city,country_code(ISO 3166-2),country,postal_code,state(opzionale).first_name,last_name,phone(opzionale),company(opzionale).
shipping_label(opzionale) - dettagli etichetta:method_name- ad es. "Post NL".tracking_number,tracking_url,label_pdf_url.date_created- formattato comeYYYY-MM-DD HH:MM:SS.
Richiesta di campione
{
"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"
}
}
Esempio di risposta
{
"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"
}
}
}
Aggiornare un ordine
Per aggiornare un ordine, invia una richiesta PATCH a https://api.fabrixa.com/v2/integration/orders/{order_id}, dove {order_id} è l’id Fabrixa dell’ordine. Cambiano solo i campi che invii e lo stato dell’ordine resta invariato. La risposta contiene l’ordine aggiornato. Puoi modificare:
number,comments,purchased_at,client_ip,client_user_agent.customer-first_name,last_name,email,phone.shipping_address- gli stessi campi usati per creare un ordine.
Richiesta di campione
{
"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"
}
}
Esempio di risposta
{
"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"
}
}
}
- Le righe dell’ordine non possono essere modificate: una richiesta con
rowsviene rifiutata con400 Bad Request. Per cambiare gli articoli, annulla l’ordine e creane uno nuovo. - Un ordine nello stato
on holdnon può essere aggiornato; l’API risponde con412 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."
]
}
}
Annullare un ordine
Per annullare un ordine, invia una richiesta POST senza body a https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, dove {order_id} è l’id Fabrixa dell’ordine (il campo numerico id dell’ordine), non il tuo numero d’ordine. La risposta contiene l’ordine con lo stato canceled e viene inviato un webhook order.updated.
- Un ordine può essere annullato finché il suo stato è
created,imported,acceptedoon holde il suofulfillment_statusè ancoraunfulfilled. Quando diventascheduled, la produzione è iniziata e l’ordine non può più essere annullato. - Gli addebiti di un ordine annullato vengono rimborsati sul tuo saldo.
- Annullare un ordine già annullato lo restituisce invariato, quindi la richiesta può essere ripetuta in sicurezza.
Esempio di risposta
{
"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"
}
}
}
Se l’ordine non può essere annullato, l’API risponde con 412 Precondition Failed e un messaggio che ne indica il motivo: il suo stato attuale non lo consente (lo stato è indicato nel messaggio) oppure la produzione è già iniziata.
{
"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)."
]
}
}
Ciclo di vita dell'ordine
Un ordine viene seguito tramite tre stati: lo status dell'ordine, il suo stato di produzione fulfillment_status e lo status di ogni spedizione in shipments. Ogni modifica viene inviata nel webhook order.updated e restituita da GET /orders/{order_id}.
Stati degli ordini
Lo status di un ordine, nell'ordine in cui viene raggiunto:
imported- l'ordine è stato ricevuto tramite l'API. Ogni ordine parte da qui.on hold- il saldo non copre il costo dell'ordine. Una volta ricaricato, l'ordine torna aimportede prosegue.accepted- l'ordine è stato accettato e passa in produzione.completed(definitivo) - tutti gli articoli sono stati prodotti.canceled(definitivo) - l'ordine è stato annullato. È possibile finché èimported,acceptedoon holde la produzione non è ancora iniziata.
Stati di adempimento
Lo fulfillment_status di un ordine e di ogni riga d'ordine, nell'ordine in cui viene raggiunto. Avanza soltanto, non torna mai indietro:
unfulfilled- la produzione non è iniziata.scheduled- l'ordine è pianificato in un lotto di produzione. Da questo momento non può più essere annullato.processing- la produzione è in corso.partially fulfilled- alcuni articoli sono pronti, gli altri sono ancora in produzione.fulfilled(definitivo) - tutti gli articoli sono pronti. Lostatusdell'ordine diventa quindicompleted.
Un ordine nel suo insieme non viene mai rifiutato. Un singolo articolo può essere rifiutato al controllo qualità durante la produzione. Viene quindi ristampato: torna a unfulfilled e ripassa in produzione, mentre l'ordine mantiene il suo stato e prosegue quando l'articolo è pronto.
Stati della spedizione
Lo status di ogni spedizione in shipments, nell'ordine in cui viene raggiunto:
pending- la spedizione è in preparazione.registered- l'etichetta è stata creata presso il corriere.collected- il corriere ha ritirato il pacco.in transit- il pacco è in viaggio.delivered(definitivo) - il pacco è stato consegnato.
Eccezioni:
failed- il corriere ha segnalato un problema.returned(definitivo) - il pacco ci è stato restituito.canceled(definitivo) - la spedizione è stata annullata.
Segui il fulfilment
Per ottenere lo stato fulfilment di un ordine specifico, invia una richiesta GET a https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. La risposta fornisce i fulfilment associati all’ordine, inclusi stato degli articoli, dettagli prodotto e avanzamento degli step di produzione.
Esempio di risposta
{
"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
}
}
]
}
]
}
La risposta include un elenco di adempimenti, ciascuno dei quali prevede:
id- identificatore univoco per l'adempimento.barcode- codice a barre per tracciabilità e identificazione interna; può anche essere stampato sul prodotto.status- lo stato attuale dell'evasione: non evaso o eseguito.created_ateupdated_at- timestamp per la creazione dell'evasione e l'ultimo aggiornamento.variant- informazioni dettagliate sulla variante del prodotto: nome, sottotitolo, SKU.product- dettagli del prodotto: nome, sottotitolo.production_steps- serie di fasi di produzione. L'elenco dei passaggi dipende dal tipo di prodotto. Per ogni fase:id- identificatore univoco per la fase di produzione.name- ad es. "Stampa piumino".description- cosa comporta la fase di produzione.status- lo stato attuale:- in sospeso - non ancora avviato.
- in corso - attualmente in corso.
- rifiutato - il passaggio ha riscontrato un problema e non è stato completato con successo.
- fatto - il passaggio è stato completato.
notes- eventuali note aggiuntive relative al passaggio.updated_at- l'ultima volta che lo stato del passaggio è stato aggiornato.
Ogni record di evasione corrisponde a un prodotto specifico o a una variante di prodotto all'interno dell'ordine e ogni copia del prodotto nell'ordine ha il proprio record di evasione: ogni articolo viene tracciato individualmente durante tutta la produzione.
Se per un ordine non vengono restituiti adempimenti, l'ordine non è ancora entrato nella fase di elaborazione.
Requisiti dei file sorgente
Quando includi source files nell’ordine, assicurati che rispettino i seguenti requisiti:
type
Il PDF è il formato sorgente preferito. Per un prodotto con un solo livello di stampa, come una coperta o un asciugamano, va bene anche un file JPEG, PNG o TIFF. Per un prodotto con più livelli, fornisci un file PDF con ogni livello su una pagina separata: durante l’elaborazione ogni pagina è trattata come un livello a sé, così un design a più livelli viene inviato come un unico file. Vedi i requisiti del PDF e l’ordine delle pagine.
Imposta il type in base al formato del file. Per un PDF, usa "file": ogni pagina viene stampata su un livello del prodotto, nell’ordine di pagine indicato per quel prodotto. Per un file JPEG, PNG o TIFF, adatto a un prodotto con un solo livello di stampa, usa "print".
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/source.pdf"
}
]
Per ulteriori dettagli, vedere Swagger documentation.
url
Il campo url deve contenere un collegamento diretto al file di origine. Assicurati che l'URL sia accessibile e che il file possa essere scaricato senza autenticazione. Il collegamento deve rimanere accessibile durante tutto il processo di produzione.
Come scarichiamo il file
Scarichiamo il file dal tuo server due volte: una richiesta con Range: 0-0 durante la convalida dell’ordine, poi il file completo. Entrambe le richieste inviano lo User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); se il tuo sito filtra il traffico automatizzato, consentilo. L’URL deve usare HTTPS sulla porta 443 e restituire il file direttamente, senza reindirizzamenti, con il suo vero Content-Type, ad esempio application/pdf. Ogni richiesta scade dopo 60 secondi.
Formato file
Fornisci un file PDF oppure, per un prodotto a un solo livello, un file JPEG, PNG o TIFF, servito con il suo vero Content-Type. Le aree trasparenti di un PNG vengono stampate in bianco. Assicurati che le immagini siano di alta qualità e adatte alla stampa.
Dimensioni dell'immagine
Le dimensioni massime sono 15,000 pixels su entrambi i lati. Le immagini che superano questo limite potrebbero essere ridimensionate o rifiutate. La risoluzione dell'immagine deve corrispondere alle dimensioni del prodotto; in caso contrario le immagini potrebbero essere ridimensionate o ritagliate per adattarle.
Risoluzione
Nessun requisito di risoluzione specifico: assicurati solo che la qualità dell'immagine sia sufficiente per la stampa.
Spazio colore
Le immagini devono essere nello spazio colore RGB per una rappresentazione accurata dei colori. Altri spazi colore verranno convertiti durante l'elaborazione, il che potrebbe risultare in colori errati.
Dimensioni del file
Ogni file di origine può essere al massimo di 200 MB. Un file più grande viene rifiutato: alla creazione dell’ordine se il tuo server invia un Content-Length, altrimenti durante il download del file.
Requisiti PDF e ordine delle pagine
L'ordine delle pagine nel PDF è importante. Le pagine vengono abbinate ai livelli del prodotto in base alla posizione e l'ordine delle pagine previsto dipende dal tipo di prodotto. Assicurati che le pagine del tuo PDF seguano la sequenza di livelli corretta per il prodotto che stai inviando.
| Prodotto | Ordine delle pagine PDF |
|---|---|
| Duvet Cover |
|
| Curtains |
|
| T-shirt |
|
| Tanktop |
|
| Sweater |
|
| Hoodie |
|
| Sweatpants |
|
| Sweatshorts |
|
Importante: ogni pagina PDF deve corrispondere alle dimensioni richieste per il relativo livello di prodotto ed essere orientata correttamente. Posiziona il disegno in modo che la parte superiore del disegno sia allineata con la parte superiore della pagina. Dimensioni o orientamento della pagina errati possono causare problemi di ridimensionamento, rotazione o allineamento nella produzione.
Spedizione
Scopri quanto costerà la spedizione di un ordine e per quanto tempo sarà in viaggio prima di effettuarlo, calcolata con le stesse regole che Fabrixa applica all'ordine stesso.
Paesi di spedizione
Per sapere in quali paesi può essere spedita una variante di prodotto, invia una richiesta GET a https://api.fabrixa.com/v2/integration/shipping/countries con le tue credenziali. L'elenco, ordinato per nome, contiene i paesi verso cui la sede che produce la variante ha una tariffa di spedizione per un pacco di spedizione in cui la variante può essere imballata. Un paese che non compare nell'elenco non ha alcuna tariffa di spedizione per la variante.
Parametri della query
variant_idosku- la variante, indicata come in una riga d'ordine, proprio come per una stima.
Richiesta di campione
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'
Esempio di risposta
{
"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
}
]
}
Campi della risposta
codeename- il paese, con il codice ISO 3166-1 alpha-2 da passare comecountry_codealla stima.min_shipping_priceemax_shipping_price- la fascia di prezzo di spedizione di un singolo pacco verso quel paese, IVA esclusa, nella valuta indicata dacurrency, considerando tutti i pacchi di spedizione in cui la variante può essere imballata. Un ordine di più unità può richiedere più pacchi, quindi chiedi una stima per il prezzo di una determinata quantità.min_eta_daysemax_eta_days- l'intervallo del numero di giorni in cui un pacco resta in viaggio dopo la consegna al corriere, esclusi i tempi di produzione;nullquando le tariffe non riportano una stima di consegna.
Stima la spedizione
Per sapere quanto costerebbe spedire una variante di prodotto e per quanto tempo sarebbe in viaggio, invia una richiesta GET a https://api.fabrixa.com/v2/integration/shipping/estimate con le tue credenziali. La stima segue le regole con cui viene calcolato il prezzo di un ordine: le unità vengono imballate nei pacchi di spedizione della sede che produce la variante, e il prezzo di ogni pacco viene calcolato sulla tratta da quella sede al paese di destinazione. Nulla viene ordinato né riservato, e il prezzo di un ordine viene calcolato al momento in cui lo effettui, quindi il costo della sua spedizione può risultare diverso se nel frattempo le tariffe cambiano.
Parametri della query
variant_idosku- la variante, indicata come in una riga d'ordine: una variante di uno dei tuoi prodotti, oppure una variante del catalogo. Deve essere una variante che puoi ordinare.country_code- il codice ISO 3166-1 alpha-2 del paese in cui viene spedito l'ordine, per esempioNL.quantity- il numero di unità, da 1 a 1000.
Richiesta di campione
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'
Esempio di risposta
{
"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
}
}
Campi della risposta
variant_id,sku,quantityecountry_code- la variante, la quantità e la destinazione a cui si riferisce la stima.origin_country- il paese da cui viene spedita la variante, con il suocodee il suoname.packages_count- il numero di pacchi di spedizione in cui vengono imballate le unità.packages- i pacchi stessi, una voce per tipo di pacco: ilpackage_type, la sualength,widtheheightin cm, laquantitydi tali pacchi, ilpricedi spedizione di uno di essi e i suoieta_days. I prezzi moltiplicati per le quantità danno in totaleshipping_price.shipping_price- il prezzo di spedizione di tutti i pacchi insieme, IVA esclusa, nella valuta indicata dacurrency. Su una tratta senza tariffa di spedizione la spedizione è gratuita, come lo sarebbe per un ordine, e il prezzo è0.00.eta_days- il numero di giorni in cui il pacco più lento resta in viaggio dopo la consegna al corriere, esclusi i tempi di produzione;nullquando la tratta non ha una stima di consegna.
Una richiesta che non supera la convalida riceve come risposta 400 Bad Request e il motivo per ciascun campo, con gli stessi messaggi di una riga d'ordine, per esempio The variant not found. Quando nessun pacco di spedizione può contenere le unità, la risposta è 400 Bad Request con il messaggio No shipping package can carry the variant.
Fabrixa Studio
Fabrixa Studio è uno strumento che consente agli utenti di personalizzare e personalizzare facilmente i prodotti in tempo reale con un'interfaccia intuitiva in cui gli utenti possono creare o caricare i propri progetti.
Fabrixa Studio è ideale per le aziende che offrono prodotti personalizzati, consentendo ai clienti di visualizzare i propri progetti prima di finalizzare gli ordini.
Incorpora Fabricxa Studio
Puoi incorporare Fabrixa Studio nel tuo sito usando un iframe. Questo permette ai clienti di personalizzare i prodotti direttamente sul sito durante il checkout.
Esempio di iframe per incorporare 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>
Sostituisci i valori per product_sku, cart_item_key e application_key con i tuoi valori dinamici.
application_key: chiave univoca per l'autenticazione all'API di integrazione.product_sku: lo SKU della variante di prodotto, recuperato dall'API di integrazione.cart_item_key: un valore univoco dalla piattaforma di incorporamento che identifica l'articolo del carrello associato al prodotto. Utilizzato per salvare le personalizzazioni dell'utente; durante la creazione dell'ordine identifica le personalizzazioni salvate e le assegna all'ordine. Vedi l'esempio qui sotto.locale(facoltativo): la lingua dell'interfaccia di Studio e dei suoi messaggi di errore, ad es.de_DEode. Senza di esso, Studio si apre nella lingua del browser dell'acquirente se è supportata, altrimenti in inglese.
L'intestazione di Studio mostra il nome del prodotto così come è nel tuo negozio - lo stesso titolo che vedono i tuoi clienti - con sotto le opzioni della variante scelta. È la copia del prodotto propria del tuo negozio, quindi un nome che modifichi in Fabrixa compare anche in Studio; locale non lo traduce.
Richiesta di creazione di un ordine con 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": {
"...": "..."
}
}
Gestire gli eventi dello Studio
Quando si fa clic sul pulsante Aggiungi al carrello all'interno dell'iframe, viene eseguito il seguente comando:
window.parent.postMessage('customizationFinished', '*');
Allo stesso modo, quando si fa clic sul pulsante Indietro:
window.parent.postMessage('closeButtonClicked', '*');
Il metodo postMessage facilita la comunicazione multiorigine tra l'iframe e la sua finestra principale, consentendogli di notificare al genitore azioni specifiche dell'utente.
Il primo argomento di postMessage sono i dati che desideri inviare. La stringa 'customizationFinished' indica che l'utente ha finalizzato la personalizzazione e sta aggiungendo il prodotto al carrello. 'closeButtonClicked' indica che l'utente ha scelto di tornare indietro.
Nella finestra principale, ascolta questi messaggi utilizzando il listener di eventi message:
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.');
}
}
});
Controlla sempre origin dei messaggi in arrivo per assicurarti che provengano da una fonte attendibile. A seconda del messaggio ricevuto, esegui le azioni necessarie: aggiorna l'interfaccia utente, elabora il carrello, ecc. La convalida di origin è fondamentale per la sicurezza: impedisce agli script non autorizzati di interagire con la tua applicazione.
Anteprima della personalizzazione
Una volta completata la personalizzazione, visualizza il progetto finale utilizzando l'URL di anteprima di seguito. Questo URL restituisce un'immagine del prodotto personalizzato, adatta come valore src in un tag <img>. Ideale per mostrare il prodotto personalizzato nel carrello, nel riepilogo dell'ordine o in qualsiasi punto dell'interfaccia del negozio.
https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}
Sostituisci {CART_ITEM_KEY} con la chiave effettiva dell'articolo del carrello e {APPLICATION_KEY} con la chiave dell'applicazione valida.
Esempio di utilizzo in un tag immagine:
<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;" />
Dimostrazione dal vivo
L’anteprima della personalizzazione apparirà qui al termine del design.
Webhook
I webhook vengono utilizzati da Fabrixa per notificare al tuo sistema eventi in tempo reale: aggiornamenti o creazioni di ordini. Quando si verifica un evento, Fabrixa invia un webhook al tuo server contenente le informazioni rilevanti. Il tuo server deve esporre un endpoint POST pubblico per gestire i webhook in entrata.
Intestazioni delle richieste webhook
La richiesta webhook include i seguenti header per aiutarti a identificare e validare la richiesta in ingresso:
{
"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"
}
Ripartizione dell'intestazione
content-type: impostato sempre suapplication/jsonper i webhook.x-webhook-signature: la firma HMAC-SHA256 per la verifica della richiesta.x-webhook-topic: il tipo di evento o l'argomento del webhook. Ad esempio:order.created: attivato quando viene creato un nuovo ordine.order.updated: attivato quando un ordine esistente viene aggiornato.
I webhook vengono inviati con lo User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); se il tuo endpoint filtra il traffico automatizzato, consentilo. Per essere sicuro che una richiesta provenga da Fabrixa, verifica x-webhook-signature.
Eventi webhook
I webhook Fabrixa notificano al tuo sistema cambiamenti nello stato ordine o nell’attività. Ogni webhook è attivato da uno specifico valore x-webhook-topic. Topic attualmente supportati:
| Argomento | Descrizione |
|---|---|
order.created |
Si attiva quando viene effettuato un nuovo ordine in Fabrixa, tramite richiesta API o direttamente nella piattaforma. |
order.updated |
Attivato quando i dettagli dell'ordine come lo stato dell'ordine o lo stato di evasione vengono aggiornati. |
Esempio di payload del webhook
Un esempio del payload inviato con il webhook. Questo payload rappresenta un aggiornamento dell'ordine:
{
"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"
}
]
}
Una volta spedito l’ordine, shipments elenca ogni spedizione con il corriere (carrier), il metodo di spedizione (method), lo stato (status: pending, registered, collected, in transit, delivered, failed, returned o canceled) e il tracciamento: tracking_number e tracking_url, e lo stesso per ogni pacco in packages quando una spedizione ne ha più di uno. Ogni volta che lo stato o il tracciamento di una spedizione cambia viene inviato un webhook order.updated, e GET /orders/{order_id} restituisce lo stesso campo.
Verifica le firme dei webhook
Per assicurarti che la richiesta webhook sia autentica e non alterata, verifica l’header x-webhook-signature. Ricalcola la signature HMAC-SHA256 usando il raw request payload e la tua secret key, quindi confrontala con la signature ricevuta.
Esempio PHP grezzo
$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');
}
Esempio di Laravel
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...
}
Sostituisci $yourSecret con la tua chiave segreta condivisa. Utilizza sempre hash_equals per confrontare le firme per mitigare gli attacchi temporali.
Tentativi del webhook
Per impostazione predefinita, i webhook vengono disabilitati dopo 10 tentativi di consegna non riusciti. Se l'endpoint restituisce uno stato non riuscito, ad esempio 404 o qualsiasi errore 5xx, il webhook riproverà per un totale di 10 volte. Se continua a restituire un codice di risposta non 2xx o non 3xx, verrà disattivato. Le risposte riuscite includono:
2xx- indica l'elaborazione riuscita, ad es.200 OK.301e302: risposte di reindirizzamento che indicano che il webhook è stato gestito o inoltrato con successo.
Risposta al webhook
Ti consigliamo vivamente che il tuo endpoint restituisca un codice di stato 200 OK il più rapidamente possibile per confermare la corretta ricezione del webhook. Sebbene qualsiasi risposta 2xx o 3xx sia considerata riuscita, 200 è quella più comunemente utilizzata e affidabile.
Per evitare timeout o nuovi tentativi di consegna, restituire 200 OK immediatamente e gestire l'elaborazione del payload del webhook in modo asincrono, ad esempio tramite un processo in background o una coda. Se l'endpoint impiega troppo tempo per rispondere, potrebbe essere considerato un errore anche se alla fine la risposta ha esito positivo.
Le risposte con codici di stato nell'intervallo 4xx o 5xx o timeout attiveranno nuovi tentativi in base al meccanismo di nuovo tentativo.