Довідник Fabrixa Integration API
30 хв читання Останнє оновлення: 06-11-2026 119 переглядів
Integration API допомагає створювати й керувати замовленнями Fabrixa, запускати Fabrixa Studio та синхронізувати статус виробництва і fulfilment через webhooks. API відповідає REST-підходу та використовує JSON для всіх тіл запитів і відповідей.
БАЗОВИЙ URL
https://api.fabrixa.com/v2/integration
Надсилайте всі requests на цей base URL, додаючи потрібний endpoint path. Base URL є основою для взаємодії з Fabrixa API: отримання, створення, оновлення або видалення resources.
Автентифікація
Щоб користуватися Integration API, автентифікуйте requests за допомогою Application Access Token і Application Key:
Заголовок авторизації
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Заголовок ключа програми
X-Application-Key: APPLICATION_KEY
Приклад команди 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'
Замініть APPLICATION_ACCESS_TOKEN на ваш фактичний маркер доступу, а APPLICATION_KEY на ваш фактичний ключ програми.
Кінцеві точки та запити
Endpoints Integration API організовані за resource type і відповідають REST-підходу. Кожен endpoint представляє resource, а дії виконуються стандартними HTTP methods.
Усі requests і responses Integration API використовують JSON, що забезпечує послідовну та зрозумілу взаємодію з API.
Щоб отримати повну інформацію про кожну кінцеву точку, включаючи приклади запитів і відповідей, перегляньте наш Swagger documentation.
Формат відповіді
Усі кінцеві точки повертають дані в стандартизованому форматі з такими об’єктами:
{
"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"
}
]
}
Опис об'єктів відповіді
links
Містить посилання на сторінки для навігації результатами.
self— URL поточної сторінки.first_page— URL першої сторінки результатів.last_page— URL останньої сторінки результатів.next_page— URL наступної сторінки.null, якщо немає наступної сторінки.prev_page— URL попередньої сторінки.null, якщо попередньої сторінки немає.
meta
Містить метадані про відповідь, наприклад інформацію про розбивку сторінок.
total— загальна кількість елементів, доступних на всіх сторінках.current_page— поточний номер сторінки результатів.per_page— кількість елементів на сторінці.
data
Основний зміст відгуку. data залежить від кінцевої точки – це може бути один об’єкт, наприклад один продукт, або масив об’єктів, наприклад список продуктів.
Помилки та статус-коди
Усі запити API повертають коди статусу HTTP, які дають уявлення про відповідь.
400 Bad Request
Сервер не може обробити запит через помилки перевірки - відсутні або недійсні параметри.
401 Unauthorized
Клієнт не надав дійсні облікові дані для автентифікації. Також повертається, коли маркер доступу було скасовано.
403 Forbidden
Сервер відхилив запит через недостатні права доступу, які зазвичай викликані неправильними або відсутніми дозволами доступу.
404 Not Found
Запитаний ресурс не знайдено на сервері.
412 Precondition Failed
Запит не можна виконати в поточному стані ресурсу, наприклад для замовлення, яке вже не можна скасувати.
429 Too Many Requests
Клієнт перевищив допустиму кількість запитів за заданий проміжок часу. Перегляньте Rate Limits.
5xx Errors
Сталася внутрішня помилка сервера. Зв’яжіться зі службою підтримки Fabrixa, щоб повідомити деталі невдалого запиту.
Тіло відповіді на помилку
Приклад тіла відповіді на помилку:
{
"links": {
"self": "https://api.fabrixa.com/v2/integration/ping"
},
"meta": [],
"errors": {
"messages": [
"Application Key is not specified."
]
}
}
errors містить детальну інформацію про те, що не вдалося. Масив messages містить описи помилок. У разі неправильного запиту ви отримаєте назви полів, які не пройшли перевірку.
Ліміти запитів
Інтеграційний API підтримує ліміт 30 запитів на програму за хвилину.
Якщо ви перевищите цей ліміт, ви отримаєте відповідь 429 Too Many Requests.
Усі відповіді Integration API включають заголовок X-RateLimit-Remaining, скільки запитів ще може зробити клієнт, і заголовок X-RateLimit-Limit, загальну кількість запитів, дозволену за хвилину.
Режим пісочниці
Режим пісочниці дає змогу протестувати інтеграцію від початку до кінця, поки жодне реальне замовлення не виготовляється і не оплачується. Він діє на весь ваш акаунт: замовлення з усіх каналів продажу, зокрема Integration API та підключених магазинів Shopify і WooCommerce, не виготовляються і не списуються з вашого балансу. Акаунт перебуває в режимі пісочниці, поки його статус очікує активації.
У режимі пісочниці ви можете:
- підключити магазин Shopify або WooCommerce чи створити канал Integration API;
- додавати продукти та перевіряти ціни й оцінку вартості доставки;
- імпортувати, створювати, змінювати й скасовувати замовлення;
- переконатися, що жодне з цих замовлень не виготовляється і не списується з вашого балансу;
- перевіряти доставку вебхуків і підписи.
Щоб протестувати замовлення, додайте продукти з каталогу Fabrixa: відкрийте продукт, натисніть Продавати і виберіть варіанти та дизайни. Після цього вони з’являться в розділі Мої продукти.
Щоб перевести акаунт у режим пісочниці, відкрийте Platform, перейдіть до Налаштування → Компанія → Режим пісочниці і натисніть Перевести в режим пісочниці. Також його можна ввімкнути під час додавання нового каналу продажу, зокрема каналу Integration API, або написати на support@fabrixa.com, і ми переведемо ваш акаунт у режим пісочниці. Режим пісочниці доступний лише для активних акаунтів.
Коли будете готові, активуйте акаунт самостійно в Platform у розділі Налаштування → Компанія → Режим пісочниці. Також можна написати на support@fabrixa.com, і ми активуємо його за вас. Підключені магазини та облікові дані API продовжують працювати, тож нічого переналаштовувати не потрібно.
Після активації всі нові замовлення йдуть у виробництво і списуються з вашого балансу. Замовлення, створені до активації, залишаються тестовими: вони ніколи не виготовляються і не оплачуються, навіть після активації.
Продукти
Каталог — це все, що виробляє Fabrixa. Ваші продукти — це каталожні продукти, які ви додали до свого облікового запису Fabrixa, з вашими власними назвами, описами, зображеннями та SKU. Рядок замовлення вказує варіант продукту — один розмір чи одну версію продукту — за його sku або variant_id: варіант одного з ваших продуктів або каталожний варіант, замовлений безпосередньо.
Перегляд каталогу
Щоб отримати перелік продуктів, які виробляє Fabrixa, надішліть запит GET на https://api.fabrixa.com/v2/integration/catalog/products зі своїми обліковими даними. Він містить активні продукти, що мають варіант, який наразі виробляє друкарський партнер, і лише ці варіанти — кожен зі своїм SKU, ціною продажу, розмірами та значеннями опцій.
Параметри запиту
pageіlimit(до 100) — розбивають перелік на сторінки. Без них увесь каталог повертається однією відповіддю.search— продукти, назва яких містить текст або slug чиSKUваріанта яких починається з нього.category_id— продукти категорії;parent_category_id— продукти будь-якої підкатегорії категорії верхнього рівня. Див. Категорії каталогу.group_id— продукти групи каталогу.sort_by—name,created,updated,type,popularабоsold, у порядкуsort_orderascчиdesc. Типово першими йдуть найновіші продукти.
Зразок запиту
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'
Зразок відповіді
{
"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"
}
]
}
]
}
]
}
]
}
Поля відповіді
id,name,subtitle,description(HTML),slug,codeіHS_code— код митного тарифу.is_sellable— чи відкритий продукт для продажу. Закритий продукт усе ще є в переліку, але замовлення одного з його варіантів відхиляється.variants_min_selling_priceіvariants_max_selling_price— діапазон цін серед наведених варіантів.type— тип продукту, який визначає шари друку та порядок сторінок PDF;status— у каталозі завждиActive.categories— категорії, до яких належить продукт, кожна зі своєюparent_category.images— зображення продукту зurl,is_main,screen_type_sizeіsort_number.variants— версії продукту, які можна замовити:id,name,subtitle,SKU,selling_price, розміриwidth,height,lengthіweight, а такожoptions— значення опцій, що визначають цей варіант, наприклад його розмір.
Категорії каталогу
Щоб отримати перелік категорій, за якими впорядковано каталог, надішліть запит GET на https://api.fabrixa.com/v2/integration/catalog/categories зі своїми обліковими даними. Відповідь містить категорії верхнього рівня, кожна з підкатегоріями, вкладеними в sub_categories, і кількістю каталожних продуктів у ній у products_count. Передайте id категорії як category_id під час перегляду каталогу або id категорії верхнього рівня як parent_category_id, щоб отримати продукти всіх її підкатегорій одразу.
Параметри запиту
pageіlimit(до 100) — розбивають перелік на сторінки. Без них повертаються всі категорії.search— категорії, назва яких містить текст.with_products_only—trueприбирає категорії, у яких немає каталожних продуктів ані безпосередньо, ані в підкатегорії.sort_by—category_nameабоcategory_created, у порядкуsort_orderascчиdesc. Типово категорії йдуть у порядку каталогу.
Зразок запиту
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'
Зразок відповіді
{
"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
}
]
}
]
}
Ваші продукти
Щоб отримати перелік продуктів у вашому обліковому записі, надішліть запит GET на https://api.fabrixa.com/v2/integration/products зі своїми обліковими даними. Ваші продукти — це каталожні продукти, які ви додали до свого облікового запису Fabrixa: вони мають назви, описи та зображення, які ви їм там дали, а їхні варіанти — обрані вами значення SKU. У переліку лише активні продукти, по десять на сторінку, якщо не передати limit.
Параметри запиту
pageіlimit(до 100) — яку сторінку повернути та її розмір; типово перша сторінка з десяти продуктів.search— продукти, назва яких містить текст або slug чиSKUваріанта яких починається з нього.
Зразок запиту
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'
Зразок відповіді
{
"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"]
}
]
}
]
}
Щоб прочитати один продукт, надішліть запит GET на https://api.fabrixa.com/v2/integration/products/{product_id}, де {product_id} — його id. Відповідь містить ті самі поля, що й перелік. Продукт, якого немає у вашому обліковому записі, навіть каталожний, відповідає 404 Not Found із повідомленням Product not found.
Поля відповіді
id,name,subtitle,description(HTML),slug,width,height,lengthіweight.type— тип продукту, який визначає шари друку та порядок сторінок PDF.available_options— кожна опція продукту з усіма її значеннями, наприклад усі розміри, у яких він випускається; кожен варіант бере одне значення на опцію.categoriesіcollections— категорії та колекції, до яких ви віднесли продукт у своєму обліковому записі.images— зображення продукту зurl,is_main,image_size,screen_type_sizeіsort_number.variants— версії продукту, які можна замовити, див. Варіанти продуктів:id,name,subtitle,SKU,options,imagesі шари друку вavailable_source_typesтаrequired_source_types.
Варіанти продуктів
Варіант — це одна версія продукту, яку можна замовити, — один розмір, один колір — і саме її вказує рядок замовлення за sku або variant_id. Щоб прочитати варіант одного з ваших продуктів, надішліть запит GET на https://api.fabrixa.com/v2/integration/variants/{variant_id}, де {variant_id} — його id. Варіант продукту, якого немає у вашому обліковому записі, відповідає 404 Not Found із повідомленням Variant not found.
Зразок запиту
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'
Зразок відповіді
{
"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"]
}
}
Поля відповіді
id,name,subtitle,description,SKU,width,height,length,weight,options,imagesіproduct— продукт, до якого належить варіант.available_source_types— шари друку варіанта з назвами, під якими їх знає його виробничий процес. Окрім"file", яке кожен варіант приймає для PDF, це значення, які може матиtypeвихідного файлу; продукт з одним шаром друку містить"print".required_source_types— шари, які має покрити файл друку. PDF, надісланий як"file", покриває їх своїми сторінками в порядку сторінок для цього типу продукту. Інакше рядку потрібен файл JPEG, PNG або TIFF для кожного з них із назвою шару якtype; рядок, у якому бракує шару, відхиляється з400 Bad Requestі назвами відсутніх шарів.
Рядок замовлення для цього варіанта з PDF, сторінки якого є його шарами:
"rows": [
{
"sku": "DDC-140200",
"quantity": 1,
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/duvet-cover.pdf"
}
]
}
]
Які варіанти можна замовити
- Рядок замовлення може вказувати варіант продукту з вашого облікового запису або каталожний варіант безпосередньо, але ніколи — продукт іншого клієнта. Варіант знаходиться за
variant_idабо заskuнезалежно від регістру літер. - Варіант має бути активним, а його продукт — активним і відкритим для продажу. Для вашої копії каталожного продукту каталожний продукт також має бути активним, а каталожний варіант — увімкненим.
- Інакше замовлення відхиляється з
400 Bad Requestі причиною для відповідного рядка: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.абоThe catalog variant is not active.
Замовлення
Створюйте замовлення у Fabrixa зі свого storefront або платформи, додавайте потрібні файли для друку та відстежуйте кожну позицію під час fulfilment.
Створити замовлення
Щоб створити order через Fabrixa Integration API, надішліть POST request на https://api.fabrixa.com/v2/integration/orders. Request body має містити:
Структура тіла запиту
number(необов'язково) - номер замовлення. Якщо не вказано, генерується унікальний номер.comments(необов’язково) – будь-які додаткові коментарі чи примітки, пов’язані із замовленням.purchased_at– дата й час придбання замовлення у форматіYYYY-MM-DD HH:MM:SS.client_ip(необов’язково) – IP-адреса клієнта.client_user_agent(необов’язково) – рядок агента користувача клієнта.rows– масив позицій замовлення, кожна з яких містить:sku– SKU варіанту продукту. Докладніше див. у Swagger.quantity– кількість замовленого варіанту продукту.client_barcode(необов’язково) – унікальний ідентифікатор на стороні клієнта для рядка замовлення, у форматіCode 128.cart_item_key(потрібно безsources) – унікальний ідентифікатор із платформи вбудовування Fabrixa Studio, який використовується для пов’язування збережених налаштувань із замовленням.sources(потрібно безcart_item_key) – масив вихідних файлів, пов’язаних із продуктом, кожен із яких містить:type–"file"для PDF або"print"для файлу JPEG, PNG чи TIFF.url- URL-адреса вихідного файлу.
customer- відомості про клієнта:first_name,last_name,email,phone.
shipping_address- деталі доставки:address,address2(додатково),address3(додатково).city,country_code(ISO 3166-2),country,postal_code,state(необов’язково).first_name,last_name,phone(необов’язково),company(необов’язково).
shipping_label(необов’язково) – деталі етикетки:method_name– напр. "Post NL".tracking_number,tracking_url,label_pdf_url.date_created– у форматіYYYY-MM-DD HH:MM:SS.
Зразок запиту
{
"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"
}
}
Зразок відповіді
{
"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"
}
}
}
Оновити замовлення
Щоб оновити замовлення, надішліть PATCH request на https://api.fabrixa.com/v2/integration/orders/{order_id}, де {order_id} — id замовлення у Fabrixa. Змінюються лише поля, які ви надіслали, а статус замовлення лишається тим самим. Відповідь містить оновлене замовлення. Можна змінити:
number,comments,purchased_at,client_ip,client_user_agent.customer-first_name,last_name,email,phone.shipping_address- ті самі поля, що й під час створення замовлення.
Зразок запиту
{
"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"
}
}
Зразок відповіді
{
"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"
}
}
}
- Позиції замовлення змінювати не можна: запит із
rowsвідхиляється з400 Bad Request. Щоб змінити позиції, скасуйте замовлення і створіть нове. - Замовлення в статусі
on holdоновити не можна; API відповідає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."
]
}
}
Скасувати замовлення
Щоб скасувати замовлення, надішліть POST request без body на https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, де {order_id} — id замовлення у Fabrixa (числове поле id замовлення), а не ваш номер замовлення. Відповідь містить замовлення зі статусом canceled, і надсилається вебхук order.updated.
- Замовлення можна скасувати, поки воно має статус
created,imported,acceptedабоon hold, а йогоfulfillment_statusщеunfulfilled. Щойно він стаєscheduled, виробництво почалося і замовлення вже не можна скасувати. - Списання за скасоване замовлення повертаються на ваш баланс.
- Скасування вже скасованого замовлення повертає його без змін, тож запит можна безпечно повторювати.
Зразок відповіді
{
"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"
}
}
}
Якщо замовлення не можна скасувати, API відповідає 412 Precondition Failed з повідомленням про причину: поточний статус цього не дозволяє (статус вказано в повідомленні) або виробництво вже почалося.
{
"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)."
]
}
}
Життєвий цикл замовлення
Замовлення відстежується за трьома статусами: полем status замовлення, його виробничим статусом fulfillment_status і полем status кожного відправлення в shipments. Кожна зміна надсилається у вебхуку order.updated і повертається в GET /orders/{order_id}.
Статуси замовлень
Значення поля status замовлення в тому порядку, у якому вони настають:
imported- замовлення отримано через API. З цього статусу починається кожне замовлення.on hold- балансу не вистачає, щоб покрити вартість замовлення. Щойно його поповнять, замовлення повертається доimportedі продовжується.accepted- замовлення прийнято й передано у виробництво.completed(фінальний) - усі вироби виготовлено.canceled(фінальний) - замовлення скасовано. Це можливо, поки воно має статусimported,acceptedабоon holdі виробництво ще не почалося.
Статуси виконання
Значення поля fulfillment_status замовлення та кожного його рядка в тому порядку, у якому вони настають. Статус змінюється лише вперед, ніколи не назад:
unfulfilled- виробництво ще не почалося.scheduled- замовлення заплановано у виробничу партію. Відтепер його вже не можна скасувати.processing- триває виробництво.partially fulfilled- частину виробів готово, решта ще у виробництві.fulfilled(фінальний) - усі вироби готові. Після цьогоstatusзамовлення стаєcompleted.
Замовлення в цілому ніколи не відхиляється. Окремий виріб можуть відхилити під час контролю якості на виробництві. Тоді його друкують повторно: він повертається до unfulfilled і ще раз проходить виробництво, а замовлення зберігає свій статус і продовжується, щойно виріб буде готовий.
Статуси відправлень
Значення поля status кожного відправлення в shipments у тому порядку, у якому вони настають:
pending- відправлення готується.registered- етикетку створено в перевізника.collected- перевізник забрав посилку.in transit- посилка в дорозі.delivered(фінальний) - посилку доставлено.
Винятки:
failed- перевізник повідомив про проблему.returned(фінальний) - посилку повернули нам.canceled(фінальний) - відправлення скасовано.
Відстежувати fulfilment
Щоб отримати fulfilment status для конкретного order, надішліть GET request на https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. Response містить fulfillments для order, включно зі статусом item, product details і прогресом production steps.
Зразок відповіді
{
"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
}
}
]
}
]
}
Відповідь містить перелік виконання, кожне з яких містить:
id- унікальний ідентифікатор для виконання.barcode- штрих-код для внутрішнього відстеження та ідентифікації; також можна надрукувати на продукті.status- поточний статус виконання: невиконано або виконано.created_atіupdated_at- мітки часу для створення виконання та останнього оновлення.variant- детальна інформація про варіант продукту: назва, підзаголовок, SKU.product- деталі продукту: назва, підзаголовок.production_steps- набір етапів виробництва. Перелік кроків залежить від типу продукту. Для кожного кроку:id– унікальний ідентифікатор для етапу виробництва.name– напр. «Друкована ковдра».description– що передбачає етап виробництва.status– поточний статус:- очікує – ще не розпочато.
- у процесі – зараз виконується.
- відхилено – етап зіткнувся з проблемою та не був завершений успішно.
- готово - крок завершено.
notes- будь-які додаткові примітки, пов'язані з кроком.updated_at- останній раз оновлено статус кроку.
Кожен запис про виконання відповідає певному продукту або варіанту продукту в замовленні, а кожна копія продукту в замовленні має власний запис про виконання – кожен товар відстежується окремо протягом усього виробництва.
Якщо для замовлення не повернуто виконання, це означає, що замовлення ще не перейшло в стадію обробки.
Вимоги до вихідних файлів
Додаючи source files до order, переконайтеся, що вони відповідають таким вимогам:
type
Бажаний формат вихідного файлу — PDF. Для продукту з одним шаром друку, як-от ковдра чи рушник, підійде й файл JPEG, PNG або TIFF. Для продукту з кількома шарами надайте PDF-файл, де кожен шар — окрема сторінка: під час обробки кожна сторінка вважається окремим шаром, тож багатошаровий дизайн надсилається одним файлом. Дивіться вимоги до PDF і порядок сторінок.
Вказуйте type за форматом файлу. Для PDF використовуйте "file": кожна сторінка друкується на одному шарі продукту в порядку сторінок, указаному для цього продукту. Для файлу JPEG, PNG або TIFF, який підходить для продукту з одним шаром друку, використовуйте "print".
"sources": [
{
"type": "file",
"url": "https://samples-files.com/samples/source.pdf"
}
]
Для отримання додаткової інформації див. Swagger documentation.
url
Поле url має містити пряме посилання на вихідний файл. Переконайтеся, що URL-адреса доступна і файл можна завантажити без автентифікації. Посилання має бути доступним протягом усього процесу виробництва.
Як ми завантажуємо файл
Ми завантажуємо файл з вашого сервера двічі: запитом з Range: 0-0 під час перевірки замовлення, а потім повністю. Обидва запити надсилають User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); якщо ваш сайт фільтрує автоматичний трафік, дозвольте його. URL має використовувати HTTPS на порту 443 і віддавати файл напряму, без редиректів, з його справжнім Content-Type, наприклад application/pdf. Кожен запит обривається через 60 секунд.
Формат файлу
Надайте файл PDF або, для продукту з одним шаром, файл JPEG, PNG чи TIFF, який віддається з його справжнім Content-Type. Прозорі ділянки PNG друкуються білим. Переконайтеся, що зображення якісні й придатні для друку.
Розміри зображення
Максимальні розміри 15,000 pixels з обох сторін. Зображення, розмір яких перевищує це обмеження, можуть бути змінені або відхилені. Роздільна здатність зображення повинна відповідати розмірам товару; інакше зображення можуть бути змінені або обрізані відповідно до розміру.
роздільна здатність
Немає спеціальних вимог до роздільної здатності – просто переконайтеся, що якість зображення достатня для друку.
Колірний простір
Для точного відображення кольорів зображення мають бути в колірному просторі RGB. Інші колірні простори буде перетворено під час обробки, що може призвести до неправильних кольорів.
Розмір файлу
Кожен вихідний файл може мати розмір до 200 MB. Більший файл відхиляється: під час створення замовлення, якщо ваш сервер надсилає Content-Length, інакше під час завантаження файлу.
Вимоги до PDF та порядок сторінок
Порядок сторінок у PDF-файлі важливий. Сторінки зіставляються з шарами продукту за позицією, а очікуваний порядок сторінок залежить від типу продукту. Переконайтеся, що сторінки у вашому PDF відповідають правильній послідовності шарів для продукту, який ви надсилаєте.
| Продукт | Порядок сторінок PDF |
|---|---|
| Duvet Cover |
|
| Curtains |
|
| T-shirt |
|
| Tanktop |
|
| Sweater |
|
| Hoodie |
|
| Sweatpants |
|
| Sweatshorts |
|
Важливо: кожна PDF-сторінка має відповідати необхідним розмірам для свого продукту та бути правильно орієнтована. Розмістіть ілюстрацію так, щоб верхня частина дизайну збігалася з верхньою частиною сторінки. Неправильний розмір або орієнтація сторінки можуть спричинити проблеми з масштабуванням, поворотом або вирівнюванням у виробництві.
Доставка
Дізнайтеся, скільки коштуватиме доставка замовлення і скільки часу воно буде в дорозі, ще до його створення, за тими самими правилами, за якими Fabrixa розраховує саме замовлення.
Країни доставки
Щоб дізнатися, до яких країн можна доставити варіант продукту, надішліть запит GET на https://api.fabrixa.com/v2/integration/shipping/countries зі своїми обліковими даними. Список містить відсортовані за назвою країни, до яких локація, що виробляє варіант, має тариф доставки для одного з пакувань для відправлення, у які можна запакувати варіант. Країна, якої немає в списку, не має тарифу доставки для цього варіанта.
Параметри запиту
variant_idабоsku— варіант, указаний так само, як у рядку замовлення, як і для оцінки.
Зразок запиту
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'
Зразок відповіді
{
"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
}
]
}
Поля відповіді
codeіname— країна з кодом ISO 3166-1 alpha-2, який слід передати якcountry_codeдля оцінки.min_shipping_priceіmax_shipping_price— діапазон вартості доставки однієї посилки до цієї країни, без ПДВ, у валютіcurrency, для різних пакувань, у які можна запакувати варіант. Для замовлення кількох одиниць може знадобитися кілька посилок, тож для ціни певної кількості запросіть оцінку.min_eta_daysіmax_eta_days— діапазон кількості днів, протягом яких посилка перебуває в дорозі після передачі перевізнику, без урахування часу виробництва;null, якщо тарифи не містять оцінки терміну доставки.
Оцінити доставку
Щоб дізнатися, скільки коштуватиме доставка варіанта продукту і скільки часу вона триватиме, надішліть запит GET на https://api.fabrixa.com/v2/integration/shipping/estimate зі своїми обліковими даними. Оцінка розраховується за тими самими правилами, що й ціна замовлення: одиниці розміщуються в пакуваннях для відправлення, які має локація, що виробляє варіант, а вартість кожної посилки визначається за маршрутом від цієї локації до країни призначення. Нічого не замовляється й не резервується, а ціна замовлення розраховується в момент його оформлення, тож вартість доставки може відрізнятися, якщо тарифи тим часом зміняться.
Параметри запиту
variant_idабоsku— варіант, указаний так само, як у рядку замовлення: варіант одного з ваших продуктів або каталожний варіант. Це має бути варіант, який ви можете замовити.country_code— код ISO 3166-1 alpha-2 країни, куди доставляється замовлення, наприкладNL.quantity— кількість одиниць, від 1 до 1000.
Зразок запиту
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'
Зразок відповіді
{
"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
}
}
Поля відповіді
variant_id,sku,quantityіcountry_code— варіант, кількість і країна призначення, для яких зроблено оцінку.origin_country— країна, з якої відправляється варіант, з їїcodeіname.packages_count— кількість посилок, у які пакуються одиниці.packages— самі посилки, по одному запису на тип пакування:package_type, йогоlength,widthіheightу см,quantityтаких посилок,priceдоставки однієї з них і їїeta_days. Ціни, помножені на кількості, разом даютьshipping_price.shipping_price— вартість доставки всіх посилок разом, без ПДВ, у валютіcurrency. Якщо для маршруту немає тарифу доставки, доставка безкоштовна, як і для замовлення, і її вартість —0.00.eta_days— кількість днів, протягом яких найповільніша посилка перебуває в дорозі після передачі перевізнику, без урахування часу виробництва;null, якщо для маршруту немає оцінки терміну доставки.
Запит, який не пройшов перевірку, відхиляється з 400 Bad Request і причиною для кожного поля, з тими самими повідомленнями, що й для рядка замовлення, наприклад The variant not found. Якщо жодне пакування для відправлення не може вмістити одиниці, відповідь — 400 Bad Request із повідомленням No shipping package can carry the variant.
Fabrixa Studio
Fabrixa Studio — це інструмент, який дозволяє користувачам безперешкодно налаштовувати та персоналізувати продукти в реальному часі за допомогою інтуїтивно зрозумілого інтерфейсу, де користувачі можуть створювати або завантажувати власні дизайни.
Fabrixa Studio ідеально підходить для підприємств, які пропонують продукцію на замовлення, дозволяючи клієнтам візуалізувати свої проекти перед завершенням замовлення.
Вставити Fabrixa Studio
Ви можете вбудувати Fabrixa Studio на сайт за допомогою iframe. Це дозволяє клієнтам персоналізувати products безпосередньо на сайті під час checkout.
Приклад iframe для вбудовування 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>
Замініть значення для product_sku, cart_item_key і application_key своїми динамічними значеннями.
application_key– унікальний ключ для автентифікації в API інтеграції.product_sku– SKU варіанта продукту, отриманий з API інтеграції.cart_item_key– унікальне значення з платформи вбудовування, що ідентифікує позицію кошика, пов’язану з продуктом. Використовується для збереження налаштувань користувача; під час створення замовлення він визначає збережені налаштування та призначає їх до замовлення. Див. приклад нижче.locale(необов'язково) – мова інтерфейсу Studio та його повідомлень про помилки, напр.de_DEабоde. Без нього Studio відкривається мовою браузера покупця, якщо вона підтримується, інакше англійською.
У заголовку Studio показано назву товару так, як вона є у вашому магазині, – ту саму, яку бачать ваші клієнти, – а під нею опції вибраного варіанта. Це власна копія товару у вашому магазині, тож назва, яку ви змінили у Fabrixa, показується і в Studio; locale її не перекладає.
Запит на створення замовлення за допомогою 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": {
"...": "..."
}
}
Керуйте подіями студії
Після натискання кнопки Додати до кошика всередині iframe виконується така команда:
window.parent.postMessage('customizationFinished', '*');
Аналогічно, якщо натиснути кнопку Назад:
window.parent.postMessage('closeButtonClicked', '*');
Метод postMessage полегшує перехресний зв’язок між iframe і його батьківським вікном, дозволяючи йому сповіщати батьків про певні дії користувача.
Перший аргумент postMessage — це дані, які ви хочете надіслати. Рядок 'customizationFinished' вказує на те, що користувач завершив налаштування та додає продукт у кошик. 'closeButtonClicked' вказує, що користувач вирішив повернутися.
У батьківському вікні прослухайте ці повідомлення за допомогою прослуховувача подій 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.');
}
}
});
Завжди перевіряйте origin вхідних повідомлень, щоб переконатися, що вони надходять із надійного джерела. Залежно від отриманого повідомлення виконайте необхідні дії — оновіть інтерфейс користувача, обробіть кошик тощо. Перевірка origin має вирішальне значення для безпеки — вона запобігає взаємодії несанкціонованих сценаріїв із вашим додатком.
Попередній перегляд налаштування
Після завершення налаштування відобразіть остаточний дизайн, використовуючи URL попереднього перегляду нижче. Ця URL-адреса повертає зображення налаштованого продукту, яке підходить як значення src у тегу <img>. Ідеально підходить для показу налаштованого продукту у вашому кошику, підсумку замовлення або будь-де в інтерфейсі вашого магазину.
https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}
Замініть {CART_ITEM_KEY} справжнім ключем елемента кошика, а {APPLICATION_KEY} — дійсним ключем програми.
Приклад використання в тегу зображення:
<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;" />
Жива демо
Попередній перегляд customization з’явиться тут після завершення дизайну.
Вебхуки
Webhooks використовуються Fabrixa для сповіщення вашої системи про події в реальному часі - оновлення замовлень або створення. Коли відбувається подія, Fabrixa надсилає на ваш сервер вебхук із відповідною інформацією. Щоб обробляти вхідні веб-перехоплювачі, ваш сервер має відкрити загальнодоступну кінцеву точку POST.
Заголовки запитів Webhook
Webhook request містить такі headers, які допомагають ідентифікувати та перевірити вхідний request:
{
"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"
}
Розбивка заголовка
content-type– завжди встановлено значенняapplication/jsonдля вебхуків.x-webhook-signature– підпис HMAC-SHA256 для перевірки запиту.x-webhook-topic– тип події або тема вебхуку. Наприклад:order.created– активується, коли створюється нове замовлення.order.updated– активується, коли оновлюється існуюче замовлення.
Вебхуки надсилаються з User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); якщо ваш endpoint фільтрує автоматичний трафік, дозвольте його. Щоб переконатися, що запит надійшов від Fabrixa, перевіряйте x-webhook-signature.
Події Webhook
Fabrixa webhooks повідомляють вашу систему про зміни order status або активність. Кожен webhook запускається певним значенням x-webhook-topic. Поточні підтримувані topics:
| Тема | опис |
|---|---|
order.created |
Активується, коли нове замовлення розміщується в Fabrixa через запит API або безпосередньо на платформі. |
order.updated |
Активується, коли оновлюються деталі замовлення, як-от статус замовлення або статус виконання. |
Приклад корисного навантаження Webhook
Приклад корисного навантаження, надісланого з вебхуком. Це корисне навантаження представляє оновлення замовлення:
{
"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"
}
]
}
Щойно замовлення відправлено, shipments містить кожну відправку з перевізником (carrier), способом доставки (method), статусом (status: pending, registered, collected, in transit, delivered, failed, returned або canceled) і трекінгом: tracking_number і tracking_url, а також те саме для кожної посилки в packages, коли їх у відправці кілька. Щоразу, коли змінюється статус або трекінг відправки, надсилається вебхук order.updated, а GET /orders/{order_id} повертає те саме поле.
Перевірте підписи Webhook
Щоб переконатися, що webhook request автентичний і не змінений, перевірте header x-webhook-signature. Повторно обчисліть HMAC-SHA256 signature з raw request payload і вашою secret key, а потім порівняйте її з отриманою signature.
Необроблений приклад PHP
$payload = file_get_contents('php://input');
$yourSecret = 'your-secret-key';
$expectedSignature = base64_encode(hash_hmac('sha256', $payload, $yourSecret, true));
$receivedSignature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
if (!hash_equals($expectedSignature, $receivedSignature)) {
http_response_code(403);
exit('Invalid signature');
}
Приклад Laravel
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...
}
Замініть $yourSecret вашим спільним секретним ключем. Завжди використовуйте hash_equals для порівняння сигнатур, щоб пом’якшити атаки за часом.
Повторні спроби вебхуку
За замовчуванням вебхуки вимикаються після 10 невдалих спроб доставки. Якщо ваша кінцева точка повертає невдалий статус, наприклад 404 або будь-яку помилку 5xx, вебхук повторить спробу загалом 10 разів. Якщо він продовжує повертати код відповіді не 2xx або не 3xx, його буде деактивовано. Серед успішних відповідей:
2xx- вказує на успішну обробку, напр.200 OK.301і302– відповіді на переспрямування, які вказують на те, що вебхук було успішно оброблено або переслано.
Відповідь на вебхук
Ми наполегливо рекомендуємо вашій кінцевій точці якомога швидше повертати код стану 200 OK, щоб підтвердити успішне отримання вебхуку. Хоча будь-яка відповідь 2xx або 3xx вважається успішною, 200 є найпоширенішим і надійним.
Щоб уникнути тайм-аутів доставки або повторних спроб, негайно поверніть 200 OK і обробіть корисне навантаження вебхуку асинхронно, наприклад, через фонове завдання або чергу. Якщо вашій кінцевій точці потрібно занадто багато часу, щоб відповісти, це може вважатися невдачею, навіть якщо відповідь остаточно успішна.
Відповіді з кодами стану в діапазоні 4xx або 5xx або тайм-аути ініціюють повторні спроби відповідно до механізму повторних спроб.