DESARROLLADORES · Referencia de API de integración

Referencia de la API Fabrixa Integration

36 min de lectura Última actualización: 06-11-2026 119 visitas

La API Integration te ayuda a crear y gestionar pedidos de Fabrixa, iniciar Fabrixa Studio y mantener sincronizado el estado de producción y fulfillment mediante webhooks. La API sigue convenciones REST y usa JSON para todos los cuerpos de solicitud y respuesta.

URL BÁSICA

https://api.fabrixa.com/v2/integration

Envía todas las solicitudes a esta URL base seguida del endpoint path específico. La URL base es el punto de partida para interactuar con la Fabrixa API: obtener, crear, actualizar o eliminar recursos.

ANTES DE TU PRIMERA SOLICITUD

Autenticación

Para acceder a la API Integration, autentica las solicitudes usando un Application Access Token y una Application Key:

Encabezado de autorización
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Encabezado de clave de aplicación
X-Application-Key: APPLICATION_KEY
Ejemplo de 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'

Reemplace APPLICATION_ACCESS_TOKEN con su token de acceso real y APPLICATION_KEY con su clave de aplicación real.

CÓMO SE ESTRUCTURAN LAS RESPUESTAS

Puntos finales y solicitudes

Los endpoints de la API Integration están organizados por tipo de recurso y siguen el estilo REST. Cada endpoint representa un recurso y las acciones se realizan con métodos HTTP estándar.

Todas las solicitudes y respuestas de la API Integration usan JSON, proporcionando una interfaz consistente y fácil de usar.

Para obtener detalles completos sobre cada punto final, incluidos ejemplos de solicitudes y respuestas, consulte nuestro Swagger documentation.

Formato de respuesta

Todos los puntos finales devuelven datos en un formato estandarizado con estos objetos:

{
  "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"
    }
  ]
}

Descripción de los objetos de respuesta

links

Contiene enlaces de paginación para navegar por los resultados.

  • self — la URL de la página actual.
  • first_page — la URL de la primera página de resultados.
  • last_page — la URL de la última página de resultados.
  • next_page — la URL de la página siguiente. null si no hay página siguiente.
  • prev_page — la URL de la página anterior. null si no hay una página anterior.

meta

Contiene metadatos sobre la respuesta, como información de paginación.

  • total — el número total de elementos disponibles en todas las páginas.
  • current_page — el número de página actual de los resultados.
  • per_page — el número de elementos por página.

data

El contenido principal de la respuesta. data varía según el punto final: puede ser un único objeto, por ejemplo, un producto, o una serie de objetos, por ejemplo, una lista de productos.

CUANDO ALGO VA MAL

Errores y códigos de estado

Todas las solicitudes de API devuelven códigos de estado HTTP que brindan información sobre la respuesta.

400 Bad Request

El servidor no puede procesar la solicitud debido a errores de validación: parámetros faltantes o no válidos.

401 Unauthorized

El cliente no ha proporcionado credenciales de autenticación válidas. También se devuelve cuando se revoca el token de acceso.

403 Forbidden

El servidor denegó la solicitud debido a derechos de acceso insuficientes, generalmente causados ​​por permisos de acceso incorrectos o faltantes.

404 Not Found

El recurso solicitado no se pudo encontrar en el servidor.

412 Precondition Failed

La solicitud no se puede aplicar en el estado actual del recurso, por ejemplo, un pedido que ya no se puede cancelar.

429 Too Many Requests

El cliente ha excedido el número permitido de solicitudes en un período de tiempo determinado. Ver Rate Limits.

5xx Errors

Se produjo un error interno del servidor. Comuníquese con el soporte de Fabrixa con los detalles de la solicitud fallida.

Cuerpo de respuesta de error

Un ejemplo de un cuerpo de respuesta de error:

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/ping"
    },
    "meta": [],
    "errors": {
        "messages": [
            "Application Key is not specified."
        ]
    }
}

errors contiene detalles sobre lo que falló. La matriz messages enumera descripciones de errores. Para una solicitud incorrecta, recibirá los nombres de los campos que no superaron la validación.

CONOCE LOS LÍMITES DE TU SOLICITUD

Límites de solicitudes

La API de integración admite un límite de 30 solicitudes por aplicación por minuto.

Si supera este límite recibirá una respuesta 429 Too Many Requests.

Todas las respuestas de la API de integración incluyen el encabezado X-RateLimit-Remaining, cuántas solicitudes aún puede realizar el cliente, y el encabezado X-RateLimit-Limit, el total permitido por minuto.

PRUEBA ANTES DE SALIR EN VIVO

Modo sandbox

El modo sandbox te permite probar tu integración de principio a fin antes de que se produzca o se cobre ningún pedido real. Se aplica a toda tu cuenta: los pedidos de todos los canales de venta, incluidos la Integration API y las tiendas Shopify y WooCommerce conectadas, no se producen ni se cargan a tu saldo. Tu cuenta está en modo sandbox mientras su estado sea pendiente de activación.

En modo sandbox puedes:

Para probar pedidos, añade productos del catálogo de Fabrixa: abre un producto, haz clic en Vender este producto y elige variantes y diseños. Después aparecen en Mis productos.

Para pasar tu cuenta a modo sandbox, abre Platform, ve a Configuración → Empresa → Modo sandbox y haz clic en Pasar a modo sandbox. También puedes activarlo al añadir un nuevo canal de venta, incluido un canal de Integration API, o escribir a support@fabrixa.com y la pasaremos nosotros a modo sandbox. El modo sandbox solo está disponible para cuentas activas.

Cuando estés listo, activa tú mismo la cuenta en Platform en Configuración → Empresa → Modo sandbox. También puedes escribir a support@fabrixa.com y la activaremos por ti. Tus tiendas conectadas y las credenciales de API siguen funcionando, así que no hay que reconfigurar nada.

Tras la activación, todos los pedidos nuevos pasan a producción y se cargan a tu saldo. Los pedidos creados antes de la activación siguen siendo de prueba: nunca se producen ni se cobran, ni siquiera después de la activación.

ENCUENTRA QUÉ VENDER

Productos

El catálogo es todo lo que Fabrixa produce. Tus productos son los productos del catálogo que has añadido a tu cuenta de Fabrixa, con tus propios nombres, descripciones, imágenes y SKU. Una línea de pedido nombra una variante de producto - una talla o versión de un producto - por su sku o variant_id: una variante de uno de tus productos, o una variante del catálogo pedida directamente.

LO QUE FABRIXA PRODUCE

Explorar el catálogo

Para listar los productos que Fabrixa produce, envía una solicitud GET a https://api.fabrixa.com/v2/integration/catalog/products con tus credenciales. Lista los productos activos que tienen una variante que un socio de impresión produce actualmente, y solo esas variantes, cada una con su SKU, precio de venta, dimensiones y valores de opción.

Parámetros de consulta

  • page y limit (hasta 100) - paginan la lista. Sin ellos, todo el catálogo se devuelve en una sola respuesta.
  • search - los productos cuyo nombre contiene el texto, o cuyo slug o SKU de variante empieza por él.
  • category_id - los productos de una categoría; parent_category_id - los productos de cualquier subcategoría de una categoría de primer nivel. Consulta Categorías del catálogo.
  • group_id - los productos de un grupo del catálogo.
  • sort_by - name, created, updated, type, popular o sold, en el sort_order asc o desc. Por defecto, los productos más recientes van primero.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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" } ] } ] } ] } ] }

Campos de la respuesta

  • id, name, subtitle, description (HTML), slug, code y HS_code, el código arancelario aduanero.
  • is_sellable - si el producto está abierto a la venta. Un producto cerrado sigue en la lista, pero un pedido de una de sus variantes se rechaza.
  • variants_min_selling_price y variants_max_selling_price - el rango de precios de las variantes listadas.
  • type - el tipo de producto, que define las capas de impresión y el orden de páginas del PDF; status - siempre Active en el catálogo.
  • categories - las categorías en las que está el producto, cada una con su parent_category.
  • images - las imágenes del producto, con url, is_main, screen_type_size y sort_number.
  • variants - las versiones del producto que se pueden pedir: id, name, subtitle, SKU, selling_price, las dimensiones width, height, length y weight, y options, los valores de opción que definen esta variante, por ejemplo su talla.
ORIÉNTATE EN EL CATÁLOGO

Categorías del catálogo

Para listar las categorías en las que se organiza el catálogo, envía una solicitud GET a https://api.fabrixa.com/v2/integration/catalog/categories con tus credenciales. La respuesta contiene las categorías de primer nivel, cada una con sus subcategorías anidadas en sub_categories y el número de productos del catálogo que contiene en products_count. Pasa el id de una categoría como category_id al explorar el catálogo, o el id de una categoría de primer nivel como parent_category_id para obtener de una vez los productos de todas sus subcategorías.

Parámetros de consulta

  • page y limit (hasta 100) - paginan la lista. Sin ellos, se devuelven todas las categorías.
  • search - las categorías cuyo nombre contiene el texto.
  • with_products_only - true omite las categorías que no contienen ningún producto del catálogo, ni directamente ni en una subcategoría.
  • sort_by - category_name o category_created, en el sort_order asc o desc. Por defecto, las categorías van en su orden del catálogo.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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
                }
            ]
        }
    ]
}
TU CUENTA

Tus productos

Para listar los productos de tu cuenta, envía una solicitud GET a https://api.fabrixa.com/v2/integration/products con tus credenciales. Tus productos son los productos del catálogo que añadiste a tu cuenta de Fabrixa: llevan los nombres, descripciones e imágenes que les diste allí, y sus variantes los valores de SKU que elegiste. Solo se listan los productos activos, diez por página a menos que pases limit.

Parámetros de consulta

  • page y limit (hasta 100) - la página a devolver y su tamaño; por defecto la primera página de diez.
  • search - los productos cuyo nombre contiene el texto, o cuyo slug o SKU de variante empieza por él.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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"] } ] } ] }

Para leer un solo producto, envía una solicitud GET a https://api.fabrixa.com/v2/integration/products/{product_id}, donde {product_id} es su id. La respuesta lleva los mismos campos que la lista. Un producto que no está en tu cuenta, incluso uno del catálogo, responde 404 Not Found con el mensaje Product not found.

Campos de la respuesta

  • id, name, subtitle, description (HTML), slug, width, height, length y weight.
  • type - el tipo de producto, que define las capas de impresión y el orden de páginas del PDF.
  • available_options - cada opción del producto con todos sus valores, por ejemplo cada talla en la que existe; cada variante toma un valor por opción.
  • categories y collections - las categorías y colecciones en las que clasificaste el producto en tu cuenta.
  • images - las imágenes del producto, con url, is_main, image_size, screen_type_size y sort_number.
  • variants - las versiones del producto que se pueden pedir, consulta Variantes de producto: id, name, subtitle, SKU, options, images, y las capas de impresión en available_source_types y required_source_types.
LO QUE NOMBRA UNA LÍNEA DE PEDIDO

Variantes de producto

Una variante es una versión de un producto que se puede pedir - una talla, un color - y lo que nombra una línea de pedido, por sku o por variant_id. Para leer una variante de uno de tus productos, envía una solicitud GET a https://api.fabrixa.com/v2/integration/variants/{variant_id}, donde {variant_id} es su id. Una variante de un producto que no está en tu cuenta responde 404 Not Found con el mensaje Variant not found.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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"] } }

Campos de la respuesta

  • id, name, subtitle, description, SKU, width, height, length, weight, options, images, y el product al que pertenece la variante.
  • available_source_types - las capas de impresión de la variante, con los nombres con que las conoce su proceso de producción. Además de "file", que toda variante acepta para un PDF, son los valores que puede tener el type de un archivo fuente; un producto con una sola capa de impresión lista "print".
  • required_source_types - las capas que un archivo de impresión debe cubrir. Un PDF enviado como "file" las cubre con sus páginas, en el orden de páginas del tipo de producto. De lo contrario, la línea necesita un archivo JPEG, PNG o TIFF para cada una, con el nombre de la capa como type; una línea en la que falta una se rechaza con 400 Bad Request y los nombres de las capas que faltan.

Una línea de pedido para esta variante, con un PDF cuyas páginas son sus capas:

"rows": [
    {
        "sku": "DDC-140200",
        "quantity": 1,
        "sources": [
            {
                "type": "file",
                "url": "https://samples-files.com/samples/duvet-cover.pdf"
            }
        ]
    }
]

Qué variantes se pueden pedir

  • Una línea de pedido puede nombrar una variante de un producto de tu cuenta, o directamente una variante del catálogo, nunca un producto de otro cliente. La variante se localiza por su variant_id, o por su sku sin distinguir mayúsculas de minúsculas.
  • La variante tiene que estar activa, y su producto activo y abierto a la venta. Para tu copia de un producto del catálogo, el producto del catálogo también tiene que estar activo y la variante del catálogo activada.
  • De lo contrario, el pedido se rechaza con 400 Bad Request y el motivo, para la línea en cuestión: 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. o The catalog variant is not active.
CREAR Y SEGUIR PEDIDOS

Órdenes

Crea pedidos en Fabrixa desde tu tienda o plataforma, adjunta los archivos de impresión requeridos y sigue cada artículo durante el fulfillment.

PREPARA LOS DATOS DE TU PEDIDO

Crear un pedido

Para crear un pedido mediante la Fabrixa Integration API, envía una solicitud POST a https://api.fabrixa.com/v2/integration/orders. El request body debe incluir:

Solicitar estructura corporal

  • number (opcional): el número de pedido. Si no se proporciona, se genera un número único.
  • comments (opcional): cualquier comentario o nota adicional relacionada con el pedido.
  • purchased_at: fecha y hora en que se compró el pedido, con el formato YYYY-MM-DD HH:MM:SS.
  • client_ip (opcional): la dirección IP del cliente.
  • client_user_agent (opcional): cadena de agente de usuario del cliente.
  • rows: conjunto de artículos del pedido, cada uno de los cuales contiene:
    • sku: el SKU de la variante del producto. Consulte Swagger para obtener más detalles.
    • quantity: cantidad de la variante del producto solicitada.
    • client_barcode (opcional): identificador único del lado del cliente por línea de pedido, formateado como Code 128.
    • cart_item_key (obligatorio sin sources): identificador único de la integración de la plataforma Fabrixa Studio, utilizado para asociar personalizaciones guardadas con el pedido.
    • sources (obligatorio sin cart_item_key): conjunto de archivos de origen asociados con el producto, cada uno de los cuales contiene:
      • type: "file" para un PDF o "print" para un archivo JPEG, PNG o TIFF.
      • url: URL de la fuente archivo.
  • customer - detalles del cliente:
    • first_name, last_name, email, phone.
  • shipping_address - detalles de envío:
    • address, address2 (opcional), address3 (opcional).
    • city, country_code (ISO 3166-2), country, postal_code, state (opcional).
    • first_name, last_name, phone (opcional), company (opcional).
  • shipping_label (opcional) - detalles de la etiqueta:
    • method_name - p.e. "Publicar NL".
    • tracking_number, tracking_url, label_pdf_url.
    • date_created - formateado como YYYY-MM-DD HH:MM:SS.

Solicitud de muestra

{
  "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"
  }
}

Respuesta de muestra

{
    "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"
        }
    }
}
CAMBIA LOS DATOS DEL PEDIDO

Actualizar un pedido

Para actualizar un pedido, envía una solicitud PATCH a https://api.fabrixa.com/v2/integration/orders/{order_id}, donde {order_id} es el id del pedido en Fabrixa. Solo cambian los campos que envíes y el estado del pedido se mantiene. La respuesta contiene el pedido actualizado. Puedes cambiar:

  • number, comments, purchased_at, client_ip, client_user_agent.
  • customer - first_name, last_name, email, phone.
  • shipping_address - los mismos campos que al crear un pedido.

Solicitud de muestra

{
  "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"
  }
}

Respuesta de muestra

{
    "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"
        }
    }
}
  • Las líneas del pedido no se pueden cambiar: una solicitud con rows se rechaza con 400 Bad Request. Para cambiar los artículos, cancela el pedido y crea uno nuevo.
  • Un pedido en estado on hold no se puede actualizar; la API responde con 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."
        ]
    }
}
DETÉN UN PEDIDO

Cancelar un pedido

Para cancelar un pedido, envía una solicitud POST sin body a https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, donde {order_id} es el id del pedido en Fabrixa (el campo numérico id del pedido), no tu número de pedido. La respuesta contiene el pedido con el estado canceled y se envía un webhook order.updated.

  • Un pedido se puede cancelar mientras su estado sea created, imported, accepted o on hold y su fulfillment_status siga siendo unfulfilled. Cuando pasa a scheduled, la producción ha comenzado y el pedido ya no se puede cancelar.
  • Los cargos de un pedido cancelado se reembolsan a tu saldo.
  • Cancelar un pedido que ya está cancelado lo devuelve sin cambios, por lo que la solicitud se puede repetir sin riesgo.

Respuesta de muestra

{
    "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"
        }
    }
}

Si el pedido no se puede cancelar, la API responde con 412 Precondition Failed y un mensaje con el motivo: su estado actual no lo permite (el estado aparece en el mensaje) o la producción ya ha comenzado.

{
    "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)."
        ]
    }
}
DE LA IMPORTACIÓN A LA ENTREGA

Ciclo de vida del pedido

Un pedido se sigue con tres estados: el status del pedido, su estado de producción fulfillment_status y el status de cada envío en shipments. Cada cambio se envía en el webhook order.updated y lo devuelve GET /orders/{order_id}.

Estados de pedido

El status de un pedido, en el orden en que se alcanza:

Estados de cumplimiento

El fulfillment_status de un pedido y de cada línea del pedido, en el orden en que se alcanza. Solo avanza, nunca retrocede:

Un pedido en su conjunto nunca se rechaza. Un artículo concreto puede rechazarse en el control de calidad durante la producción. Entonces se vuelve a imprimir: vuelve a unfulfilled y pasa de nuevo por producción, mientras el pedido mantiene su estado y continúa cuando el artículo está terminado.

Estados de envío

El status de cada envío en shipments, en el orden en que se alcanza:

Excepciones:

SEGUIMIENTO DE ARTÍCULOS DE SU PEDIDO

Seguir fulfillment

Para obtener el estado de fulfillment de un pedido específico, envía una solicitud GET a https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. La respuesta proporciona los fulfillments asociados al pedido, incluyendo estado de cada artículo, detalles del producto y progreso de producción.

Respuesta de muestra

{
    "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 respuesta incluye una lista de cumplimientos, cada uno de los cuales proporciona:

  • id - identificador único para el cumplimiento.
  • barcode - código de barras para seguimiento e identificación internos; también se puede imprimir en el producto.
  • status: el estado de cumplimiento actual: no cumplido o cumplido.
  • created_at y updated_at: marcas de tiempo para la creación del cumplimiento y la última actualización.
  • variant: información detallada sobre la variante del producto: nombre, subtítulo, SKU.
  • product - detalles del producto: nombre, subtítulo.
  • production_steps - variedad de pasos de producción. La lista de pasos depende del tipo de producto. Para cada paso:
    • id - identificador único para el paso de producción.
    • name - p.e. "Imprimir edredón".
    • description: lo que implica el paso de producción.
    • status: estado actual:
      • pendiente: aún no iniciado.
      • en progreso: actualmente en curso.
      • rechazado: el paso encontró un problema y no se completó correctamente.
      • hecho - el paso se ha completado.
    • notes - cualquier nota adicional relacionada con el paso.
    • updated_at - la última vez que se actualizó el estado del paso.

Cada registro de cumplimiento corresponde a un producto específico o variante de producto dentro del pedido, y cada copia del producto en el pedido tiene su propio registro de cumplimiento: cada artículo se rastrea individualmente durante toda la producción.

Si no se devuelve ningún cumplimiento para un pedido, el pedido aún no ha entrado en la etapa de procesamiento.

CÓMO PROPORCIONAR ARCHIVOS DE IMPRESIÓN

Requisitos de archivos fuente

Al incluir source files en el pedido, asegúrate de que cumplen los siguientes requisitos:

type

PDF es el formato de origen preferido. Para un producto con una sola capa de impresión, como una manta o una toalla, también sirve un archivo JPEG, PNG o TIFF. Para un producto con varias capas, proporciona un archivo PDF con cada capa en una página distinta: durante el procesamiento cada página se trata como una capa independiente, así que un diseño de varias capas se envía como un único archivo. Consulta los requisitos del PDF y el orden de las páginas.

Indica el type según el formato del archivo. Para un PDF, usa "file": cada página se imprime en una capa del producto, en el orden de páginas indicado para ese producto. Para un archivo JPEG, PNG o TIFF, adecuado para un producto con una sola capa de impresión, usa "print".

"sources": [
    {
        "type": "file",
        "url": "https://samples-files.com/samples/source.pdf"
    }
]

Para obtener más detalles, consulte Swagger documentation.

url

El campo url debe contener un enlace directo al archivo fuente. Asegúrese de que la URL sea accesible y que el archivo se pueda descargar sin autenticación. El enlace debe permanecer accesible durante todo el proceso de producción.

Cómo descargamos el archivo

Descargamos el archivo de tu servidor dos veces: una solicitud con Range: 0-0 mientras se valida el pedido y después el archivo completo. Ambas solicitudes envían el User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); si tu sitio filtra el tráfico automatizado, permítelo. La URL debe usar HTTPS en el puerto 443 y devolver el archivo directamente, sin redirecciones, con su Content-Type real, por ejemplo application/pdf. Cada solicitud caduca a los 60 segundos.

Formato de archivo

Proporciona un archivo PDF o, para un producto de una sola capa, un archivo JPEG, PNG o TIFF, servido con su Content-Type real. Las zonas transparentes de un PNG se imprimen en blanco. Asegúrate de que las imágenes sean de alta calidad y aptas para impresión.

Dimensiones de la imagen

Las dimensiones máximas son 15,000 pixels en cada lado. Las imágenes que excedan este límite pueden cambiar de tamaño o rechazarse. La resolución de la imagen debe coincidir con las dimensiones del producto; de lo contrario, es posible cambiar el tamaño de las imágenes o recortarlas para que quepan.

Resolución

No hay requisitos de resolución específicos; solo asegúrese de que la calidad de la imagen sea suficiente para imprimir.

Espacio de color

Las imágenes deben estar en el espacio de color RGB para una representación del color precisa. Otros espacios de color se convertirán durante el procesamiento, lo que puede dar lugar a colores incorrectos.

Tamaño de archivo

Cada archivo fuente puede ocupar como máximo 200 MB. Un archivo más grande se rechaza: al crear el pedido si tu servidor envía Content-Length, o al descargar el archivo en caso contrario.

Requisitos PDF y orden de páginas

El orden de las páginas del PDF es importante. Las páginas se relacionan con las capas de productos por posición y el orden de páginas esperado depende del tipo de producto. Asegúrese de que las páginas de su PDF sigan la secuencia de capas correcta para el producto que está enviando.

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

Importante: cada página PDF debe coincidir con las dimensiones requeridas para su capa de producto y estar orientada correctamente. Coloque la obra de arte de modo que la parte superior del diseño se alinee con la parte superior de la página. El tamaño u orientación de página incorrectos pueden causar problemas de escala, rotación o alineación en producción.

PLANIFICA LA ENTREGA

Envío

Conoce cuánto costará el envío de un pedido y cuánto tiempo estará en camino antes de hacerlo, calculado con las mismas reglas que Fabrixa aplica al propio pedido.

A DÓNDE SE ENVÍA

Países de envío

Para saber a qué países se puede enviar una variante de producto, envía una solicitud GET a https://api.fabrixa.com/v2/integration/shipping/countries con tus credenciales. La lista contiene, ordenados por nombre, los países a los que la ubicación que produce la variante tiene una tarifa de envío para un paquete de envío en el que se puede empaquetar la variante. Un país que no figura en la lista no tiene tarifa de envío para la variante.

Parámetros de consulta

  • variant_id o sku - la variante, nombrada como en una línea de pedido, igual que para una estimación.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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
        }
    ]
}

Campos de la respuesta

  • code y name - el país, con el código ISO 3166-1 alpha-2 que debes pasar como country_code a la estimación.
  • min_shipping_price y max_shipping_price - el rango de lo que cuesta un solo paquete de envío al país, sin IVA, en la moneda de currency, entre los paquetes en los que se puede empaquetar la variante. Un pedido de varias unidades puede necesitar varios paquetes, así que pide una estimación para conocer el precio de una cantidad concreta.
  • min_eta_days y max_eta_days - el rango de días que un paquete está en camino una vez entregado al transportista, sin contar el tiempo de producción; null cuando las tarifas no incluyen estimación de entrega.
ANTES DE HACER TU PEDIDO

Estimar el envío

Para saber cuánto costaría el envío de una variante de producto y cuánto tiempo estaría en camino, envía una solicitud GET a https://api.fabrixa.com/v2/integration/shipping/estimate con tus credenciales. La estimación sigue las reglas con las que se calcula el precio de un pedido: las unidades se empaquetan en los paquetes de envío de la ubicación que produce la variante, y el precio de cada paquete se calcula según la ruta desde esa ubicación hasta el país de destino. No se pide ni se reserva nada, y el precio de un pedido se calcula cuando se realiza, así que su envío puede costar distinto si las tarifas cambian entretanto.

Parámetros de consulta

  • variant_id o sku - la variante, nombrada como en una línea de pedido: una variante de uno de tus productos o una variante del catálogo. Tiene que ser una que puedas pedir.
  • country_code - el código ISO 3166-1 alpha-2 del país al que se envía el pedido, por ejemplo NL.
  • quantity - el número de unidades, de 1 a 1000.

Solicitud de muestra

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'

Respuesta de muestra

{
    "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
    }
}

Campos de la respuesta

  • variant_id, sku, quantity y country_code - la variante, la cantidad y el destino a los que corresponde la estimación.
  • origin_country - el país desde el que se envía la variante, con su code y name.
  • packages_count - el número de paquetes de envío en los que se empaquetan las unidades.
  • packages - los propios paquetes, una entrada por tipo de paquete: el package_type, su length, width y height en cm, la quantity de esos paquetes, el price de enviar uno de ellos y sus eta_days. Los precios multiplicados por las cantidades suman shipping_price.
  • shipping_price - el precio de envío de todos los paquetes juntos, sin IVA, en la moneda de currency. En una ruta sin tarifa de envío, el envío es gratuito, igual que para un pedido, y su precio es 0.00.
  • eta_days - el número de días que el paquete más lento está en camino una vez entregado al transportista, sin contar el tiempo de producción; null cuando la ruta no tiene estimación de entrega.

Una solicitud que no supera la validación se responde con 400 Bad Request y el motivo de cada campo, con los mismos mensajes que una línea de pedido, por ejemplo The variant not found. Cuando ningún paquete de envío puede contener las unidades, la respuesta es 400 Bad Request con el mensaje No shipping package can carry the variant.

PERSONALIZACIÓN DEL PRODUCTO

Fabrixa Studio

Fabrixa Studio es una herramienta que permite a los usuarios personalizar y personalizar productos sin problemas en tiempo real con una interfaz intuitiva donde los usuarios pueden crear o cargar sus propios diseños.

Fabrixa Studio es ideal para empresas que ofrecen productos personalizados, ya que permite a los clientes visualizar sus diseños antes de finalizar los pedidos.

AÑADE ESTUDIO A TU TIENDA

Insertar Fabrixa Studio

Puedes incrustar Fabrixa Studio en tu sitio web usando un iframe. Esto permite a los clientes personalizar productos directamente en tu sitio durante el checkout.

Ejemplo de iframe para incrustar 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>

Reemplace los valores de product_sku, cart_item_key y application_key con sus valores dinámicos.

El encabezado de Studio muestra el nombre del producto tal como está en su tienda, el mismo título que ven sus clientes, con las opciones de la variante elegida debajo. Es la copia propia del producto en su tienda, así que un nombre que edite en Fabrixa también aparece en Studio; locale no lo traduce.

Solicitud para crear un pedido 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": {
    "...": "..."
  }
}
ESCUCHE LAS ACCIONES DE LOS CLIENTES

Manejar eventos de estudio

Cuando se hace clic en el botón Agregar al carrito dentro del iframe, se ejecuta el siguiente comando:

window.parent.postMessage('customizationFinished', '*');

De manera similar, cuando se hace clic en el botón Atrás:

window.parent.postMessage('closeButtonClicked', '*');

El método postMessage facilita la comunicación entre orígenes entre el iframe y su ventana principal, lo que le permite notificar al padre sobre acciones específicas del usuario.

El primer argumento de postMessage son los datos que desea enviar. La cadena 'customizationFinished' indica que el usuario ha finalizado la personalización y está agregando el producto al carrito. 'closeButtonClicked' indica que el usuario ha elegido regresar.

En la ventana principal, escuche estos mensajes usando el detector de eventos 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.');
        }
    }
});

Siempre verifique el origin de los mensajes entrantes para asegurarse de que provengan de una fuente confiable. Dependiendo del mensaje recibido, realice las acciones necesarias: actualice la interfaz de usuario, procese el carrito, etc. Validar origin es crucial para la seguridad: evita que scripts no autorizados interactúen con su aplicación.

MUESTRA EL DISEÑO TERMINADO

Vista previa de personalización

Una vez completada la personalización, muestre el diseño final utilizando la URL de vista previa a continuación. Esta URL devuelve una imagen del producto personalizado, adecuada como valor src en una etiqueta <img>. Ideal para mostrar el producto personalizado en su carrito, resumen de pedido o en cualquier lugar de la interfaz de su tienda.

https://api.fabrixa.com/v2/studio/customizations/{CART_ITEM_KEY}/preview?Application-Key={APPLICATION_KEY}

Reemplace {CART_ITEM_KEY} con la clave de artículo del carrito real y {APPLICATION_KEY} con su clave de aplicación válida.

Uso de ejemplo en una etiqueta de imagen:

<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;" />
PRUÉBALO CON TUS VALORES

Demostración en vivo

La vista previa de la personalización aparecerá aquí cuando el diseño esté terminado.

Customization preview
RECIBIR ACTUALIZACIONES DEL EVENTO

Ganchos web

Fabrixa utiliza webhooks para notificar a su sistema sobre eventos en tiempo real: actualizaciones de pedidos o creaciones. Cuando ocurre un evento, Fabrixa envía un webhook a su servidor que contiene la información relevante. Su servidor debe exponer un punto final POST público para manejar los webhooks entrantes.

REVISA TUS ENCABEZADOS ENTRANTES

Encabezados de solicitud de webhook

La solicitud webhook incluye los siguientes headers para ayudarte a identificar y validar la solicitud entrante:

{
  "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"
}
Desglose del encabezado

Los webhooks se envían con el User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); si tu endpoint filtra el tráfico automatizado, permítelo. Para asegurarte de que una solicitud viene de Fabrixa, verifica x-webhook-signature.

ELIGE LOS TEMAS DE TU EVENTO

Eventos de webhook

Los webhooks de Fabrixa notifican a tu sistema cambios en el estado del pedido o actividad. Cada webhook se activa mediante un valor específico de x-webhook-topic. Topics admitidos actualmente:

TemaDescripción
order.created Se activa cuando se realiza un nuevo pedido en Fabrixa, ya sea mediante solicitud de API o directamente en la plataforma.
order.updated Se activa cuando se actualizan los detalles del pedido, como el estado del pedido o el estado de cumplimiento.
INSPECCIONA LA CARGA ÚTIL DE TU EVENTO

Ejemplo de carga útil de webhook

Un ejemplo de la carga útil enviada con el webhook. Esta carga útil representa una actualización de pedido:

{
  "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"
    }
  ]
}

Cuando el pedido se envía, shipments enumera cada envío con su transportista (carrier), método de envío (method), estado (status: pending, registered, collected, in transit, delivered, failed, returned o canceled) y seguimiento: tracking_number y tracking_url, y lo mismo para cada paquete en packages cuando un envío tiene varios. Se envía un webhook order.updated cada vez que cambia el estado o el seguimiento de un envío, y GET /orders/{order_id} devuelve el mismo campo.

VERIFICA LA FUENTE DE TU WEBHOOK

Verificar firmas de webhooks

Para asegurar que la solicitud webhook es auténtica y no ha sido alterada, verifica el header x-webhook-signature. Recalcula la signature HMAC-SHA256 usando el raw request payload y tu secret key, y compárala con la signature recibida.

Ejemplo de PHP sin formato

$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');
}

Ejemplo de 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...
}

Reemplace $yourSecret con su clave secreta compartida. Utilice siempre hash_equals para comparar firmas y mitigar los ataques de sincronización.

¿Y SI FALLA LA ENTREGA?

Reintentos de webhook

Los webhooks se desactivan de forma predeterminada después de 10 intentos de entrega fallidos. Si su punto final devuelve un estado fallido como 404 o cualquier error de 5xx, el webhook lo volverá a intentar un total de 10 veces. Si continúa devolviendo un código de respuesta que no sea 2xx o 3xx, se desactivará. Las respuestas exitosas incluyen:

DEVOLVER UNA RESPUESTA CLARA

Respuesta de webhook

Recomendamos encarecidamente que su punto final devuelva un código de estado 200 OK lo más rápido posible para acusar recibo del webhook. Si bien cualquier respuesta 2xx o 3xx se considera exitosa, 200 es la más utilizada y confiable.

Para evitar tiempos de espera de entrega o reintentos, devuelva 200 OK inmediatamente y maneje el procesamiento de carga útil del webhook de forma asíncrona, por ejemplo, a través de un trabajo en segundo plano o una cola. Si su punto final tarda demasiado en responder, se puede considerar un error incluso si la respuesta finalmente es exitosa.

Las respuestas con códigos de estado en el rango 4xx o 5xx, o tiempos de espera, activarán reintentos según el mecanismo de reintento.