Riferimento API Fabrixa Integration
6 min di lettura Ultimo aggiornamento: 10-06-2026 15:28
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.
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.
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- il tipo di prodotto, utilizzare"file"per impostazione predefinita.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": "0647185332"
},
"shipping_address": {
"address": "Pierre cuypershof",
"address2": "17",
"city": "Amsterdam",
"country_code": "NL",
"country": "Netherlands",
"postal_code": "1012 AB",
"state": "North Holland",
"first_name": "John",
"last_name": "Doe",
"phone": "0647185332"
},
"shipping_label": {
"method_name": "Post NL",
"tracking_number": "3SYZXG1585577",
"tracking_url": "https://postnl.nl/tracktrace/3SYZXG1585577",
"label_pdf_url": "https://api.fabrixa.com/storage/8966630826422f36d822f91680012141.pdf",
"date_created": "2024-01-01 00:00:00"
}
}
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
Devi fornire un file PDF come fonte. Se il tuo progetto contiene più livelli di prodotto, includi ciascun livello come una pagina separata nello stesso PDF. Durante l'elaborazione, ogni pagina viene trattata come un singolo livello, consentendoti di inviare un progetto multistrato come un unico file sorgente. See PDF requirements and page order.
type nell'oggetto di origine deve essere impostato su "file".
"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.
Formato file
Fornire file nel formato PDF. 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
Ciascun file di origine non deve superare 50 MB. File più grandi potrebbero essere rifiutati o causare ritardi nell'elaborazione.
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.
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.
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",
"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.
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. |
Stati degli ordini
- Completato: l'ordine è stato spedito o ritirato e la ricezione è confermata. Per i prodotti digitali, il cliente ha pagato e i file sono disponibili per il download.
- Annullato: pagamento annullato dal cliente; la transazione non è stata completata.
- In sospeso - l'ordine è temporaneamente bloccato.
- Importato - l'ordine è stato importato nella piattaforma.
Stati di adempimento
- Non evaso: l'ordine non è stato ancora preparato o inviato.
- Parzialmente evaso: alcuni articoli sono stati elaborati o spediti, altri sono ancora in sospeso.
- Programmati: l'ordine è pianificato e programmato per l'elaborazione.
- Rifiutato: la richiesta di evasione è stata rifiutata, spesso a causa di dettagli dell'ordine non validi o indisponibilità.
- Evaso: l'ordine è stato completamente elaborato e consegnato o reso disponibile al cliente.
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": "imported",
"fulfillment_status": "unfulfilled",
"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": "unfulfilled",
"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"
}
}
]
}
]
}
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.