DESENVOLVEDORES · Referência da API de integração

Referência da API Fabrixa Integration

36 min de leitura Última atualização: 06-11-2026 119 visualizações

A API Integration ajuda a criar e gerir encomendas Fabrixa, iniciar o Fabrixa Studio e manter o estado de produção e fulfillment sincronizado através de webhooks. A API segue convenções REST e usa JSON em todos os corpos de pedido e resposta.

URL BÁSICO

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

Envie todos os pedidos para este URL base seguido do caminho endpoint específico. O URL base é o ponto de partida para interagir com a Fabrixa API: obter, criar, atualizar ou eliminar recursos.

ANTES DO SEU PRIMEIRO PEDIDO

Autenticação

Para aceder à API Integration, autentique os pedidos usando um Application Access Token e uma Application Key:

Cabeçalho de autorização
Authorization: Bearer APPLICATION_ACCESS_TOKEN
Cabeçalho da chave do aplicativo
X-Application-Key: APPLICATION_KEY
Exemplo 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'

Substitua APPLICATION_ACCESS_TOKEN pelo seu token de acesso real e APPLICATION_KEY pela sua chave de aplicativo real.

COMO AS RESPOSTAS SÃO ESTRUTURADAS

Terminais e solicitações

Os endpoints da API Integration são organizados por tipo de recurso e seguem o estilo REST. Cada endpoint representa um recurso, e as ações são executadas com métodos HTTP padrão.

Todos os pedidos e respostas da API Integration usam JSON, oferecendo uma interface consistente e simples.

Para obter detalhes completos sobre cada endpoint, incluindo exemplos de solicitação e resposta, consulte nosso Swagger documentation.

Formato de resposta

Todos os endpoints retornam dados em um formato padronizado com estes 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"
    }
  ]
}

Descrição dos objetos de resposta

links

Contém links de paginação para navegar pelos resultados.

  • self — o URL da página atual.
  • first_page — o URL da primeira página de resultados.
  • last_page — o URL da última página de resultados.
  • next_page — o URL da próxima página. null se não houver próxima página.
  • prev_page — o URL da página anterior. null se não houver página anterior.

meta

Contém metadados sobre a resposta, como informações de paginação.

  • total — o número total de itens disponíveis em todas as páginas.
  • current_page — o número da página atual dos resultados.
  • per_page — o número de itens por página.

data

O conteúdo principal da resposta. data varia de acordo com o endpoint - pode ser um único objeto, por exemplo, um produto, ou uma matriz de objetos, por exemplo, uma lista de produtos.

QUANDO ALGO DÁ ERRADO

Erros e códigos de estado

Todas as solicitações de API retornam códigos de status HTTP que fornecem informações sobre a resposta.

400 Bad Request

O servidor não pode processar a solicitação devido a erros de validação - parâmetros ausentes ou inválidos.

401 Unauthorized

O cliente não forneceu credenciais de autenticação válidas. Também retornado quando o token de acesso foi revogado.

403 Forbidden

O servidor negou a solicitação devido a direitos de acesso insuficientes, normalmente causados ​​por permissões de acesso incorretas ou ausentes.

404 Not Found

O recurso solicitado não foi encontrado no servidor.

412 Precondition Failed

O pedido não pode ser aplicado no estado atual do recurso, por exemplo, uma encomenda que já não pode ser cancelada.

429 Too Many Requests

O cliente excedeu o número permitido de solicitações em um determinado período. Consulte Rate Limits.

5xx Errors

Ocorreu um erro interno do servidor. Entre em contato com o suporte da Fabrixa com detalhes da solicitação com falha.

Corpo de resposta de erro

Um exemplo de corpo de resposta de erro:

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

errors contém detalhes sobre o que falhou. A matriz messages lista descrições de erros. Para uma solicitação incorreta, você receberá os nomes dos campos que falharam na validação.

CONHEÇA OS LIMITES DO SEU PEDIDO

Limites de pedidos

A API de integração suporta um limite de 30 solicitações por aplicativo por minuto.

Se você exceder esse limite, receberá uma resposta 429 Too Many Requests.

Todas as respostas da API de integração incluem o cabeçalho X-RateLimit-Remaining, quantas solicitações o cliente ainda pode fazer, e o cabeçalho X-RateLimit-Limit, o total permitido por minuto.

TESTE ANTES DE ENTRAR EM PRODUÇÃO

Modo sandbox

O modo sandbox permite testar a sua integração de ponta a ponta antes de qualquer encomenda real ser produzida ou cobrada. Aplica-se a toda a sua conta: as encomendas de todos os canais de venda, incluindo a Integration API e as lojas Shopify e WooCommerce ligadas, não são produzidas nem debitadas do seu saldo. A sua conta está em modo sandbox enquanto o seu estado for a aguardar ativação.

Em modo sandbox, pode:

Para testar encomendas, adicione produtos do catálogo Fabrixa: abra um produto, clique em Vender este produto e escolha variantes e designs. Passam então a aparecer em Os meus produtos.

Para passar a sua conta para o modo sandbox, abra a Platform, vá a Definições → Empresa → Modo sandbox e clique em Passar para o modo sandbox. Também o pode ativar ao adicionar um novo canal de venda, incluindo um canal Integration API, ou escrever para support@fabrixa.com e nós passamos a sua conta para o modo sandbox. O modo sandbox só está disponível para contas ativas.

Quando estiver pronto, ative a conta você mesmo na Platform em Definições → Empresa → Modo sandbox. Também pode escrever para support@fabrixa.com e nós ativamo-la por si. As lojas ligadas e as credenciais da API continuam a funcionar, pelo que não é preciso reconfigurar nada.

Depois da ativação, todas as novas encomendas seguem para produção e são debitadas do seu saldo. As encomendas criadas antes da ativação continuam a ser encomendas de teste: nunca são produzidas nem cobradas, mesmo depois da ativação.

ENCONTRE O QUE VENDER

Produtos

O catálogo é tudo o que a Fabrixa produz. Os seus produtos são os produtos do catálogo que adicionou à sua conta Fabrixa, com os seus próprios nomes, descrições, imagens e SKU. Uma linha de encomenda indica uma variante de produto - um tamanho ou uma versão de um produto - pelo seu sku ou variant_id: uma variante de um dos seus produtos, ou uma variante do catálogo encomendada diretamente.

O QUE A FABRIXA PRODUZ

Explorar o catálogo

Para listar os produtos que a Fabrixa produz, envie um pedido GET para https://api.fabrixa.com/v2/integration/catalog/products com as suas credenciais. Lista os produtos ativos que têm uma variante que um parceiro de impressão produz atualmente, e apenas essas variantes, cada uma com o seu SKU, preço de venda, dimensões e valores de opção.

Parâmetros de consulta

  • page e limit (até 100) - paginam a lista. Sem eles, todo o catálogo é devolvido numa única resposta.
  • search - os produtos cujo nome contém o texto, ou cujo slug ou SKU de variante começa por ele.
  • category_id - os produtos de uma categoria; parent_category_id - os produtos de qualquer subcategoria de uma categoria de primeiro nível. Veja Categorias do catálogo.
  • group_id - os produtos de um grupo do catálogo.
  • sort_by - name, created, updated, type, popular ou sold, na sort_order asc ou desc. Por predefinição, os produtos mais recentes vêm primeiro.

Solicitação de amostra

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'

Exemplo de resposta

{
    "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 da resposta

  • id, name, subtitle, description (HTML), slug, code e HS_code, o código pautal aduaneiro.
  • is_sellable - se o produto está aberto à venda. Um produto fechado continua listado, mas uma encomenda de uma das suas variantes é recusada.
  • variants_min_selling_price e variants_max_selling_price - o intervalo de preços das variantes listadas.
  • type - o tipo de produto, que define as camadas de impressão e a ordem das páginas do PDF; status - no catálogo é sempre Active.
  • categories - as categorias em que o produto está, cada uma com a sua parent_category.
  • images - as imagens do produto, com url, is_main, screen_type_size e sort_number.
  • variants - as versões encomendáveis do produto: id, name, subtitle, SKU, selling_price, as dimensões width, height, length e weight, e options, os valores de opção que definem esta variante, por exemplo o seu tamanho.
ORIENTE-SE NO CATÁLOGO

Categorias do catálogo

Para listar as categorias em que o catálogo está organizado, envie um pedido GET para https://api.fabrixa.com/v2/integration/catalog/categories com as suas credenciais. A resposta contém as categorias de primeiro nível, cada uma com as suas subcategorias aninhadas em sub_categories e o número de produtos do catálogo que contém em products_count. Passe o id de uma categoria como category_id ao explorar o catálogo, ou o id de uma categoria de primeiro nível como parent_category_id para obter de uma vez os produtos de todas as suas subcategorias.

Parâmetros de consulta

  • page e limit (até 100) - paginam a lista. Sem eles, todas as categorias são devolvidas.
  • search - as categorias cujo nome contém o texto.
  • with_products_only - true omite as categorias que não contêm nenhum produto do catálogo, nem diretamente nem numa subcategoria.
  • sort_by - category_name ou category_created, na sort_order asc ou desc. Por predefinição, as categorias vêm pela sua ordem no catálogo.

Solicitação de amostra

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'

Exemplo de resposta

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

Os seus produtos

Para listar os produtos da sua conta, envie um pedido GET para https://api.fabrixa.com/v2/integration/products com as suas credenciais. Os seus produtos são os produtos do catálogo que adicionou à sua conta Fabrixa: têm os nomes, descrições e imagens que lhes deu aí, e as suas variantes os valores de SKU que escolheu. Só são listados os produtos ativos, dez por página a menos que passe limit.

Parâmetros de consulta

  • page e limit (até 100) - a página a devolver e o seu tamanho; por predefinição a primeira página de dez.
  • search - os produtos cujo nome contém o texto, ou cujo slug ou SKU de variante começa por ele.

Solicitação de amostra

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'

Exemplo de resposta

{
    "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 ler um único produto, envie um pedido GET para https://api.fabrixa.com/v2/integration/products/{product_id}, em que {product_id} é o seu id. A resposta tem os mesmos campos da lista. Um produto que não está na sua conta, mesmo um do catálogo, responde 404 Not Found com a mensagem Product not found.

Campos da resposta

  • id, name, subtitle, description (HTML), slug, width, height, length e weight.
  • type - o tipo de produto, que define as camadas de impressão e a ordem das páginas do PDF.
  • available_options - cada opção do produto com todos os seus valores, por exemplo cada tamanho em que existe; cada variante toma um valor por opção.
  • categories e collections - as categorias e coleções em que classificou o produto na sua conta.
  • images - as imagens do produto, com url, is_main, image_size, screen_type_size e sort_number.
  • variants - as versões encomendáveis do produto, veja Variantes de produto: id, name, subtitle, SKU, options, images, e as camadas de impressão em available_source_types e required_source_types.
O QUE UMA LINHA DE ENCOMENDA INDICA

Variantes de produto

Uma variante é uma versão encomendável de um produto - um tamanho, uma cor - e o que uma linha de encomenda indica, por sku ou por variant_id. Para ler uma variante de um dos seus produtos, envie um pedido GET para https://api.fabrixa.com/v2/integration/variants/{variant_id}, em que {variant_id} é o seu id. Uma variante de um produto que não está na sua conta responde 404 Not Found com a mensagem Variant not found.

Solicitação de amostra

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'

Exemplo de resposta

{
    "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 da resposta

  • id, name, subtitle, description, SKU, width, height, length, weight, options, images, e o product a que a variante pertence.
  • available_source_types - as camadas de impressão da variante, com os nomes pelos quais o seu processo de produção as conhece. Além de "file", que toda a variante aceita para um PDF, são os valores que o type de um ficheiro de origem pode ter; um produto com uma única camada de impressão lista "print".
  • required_source_types - as camadas que um ficheiro de impressão tem de cobrir. Um PDF enviado como "file" cobre-as com as suas páginas, na ordem das páginas do tipo de produto. Caso contrário, a linha precisa de um ficheiro JPEG, PNG ou TIFF para cada uma, com o nome da camada como type; uma linha em que falte uma é recusada com 400 Bad Request e os nomes das camadas em falta.

Uma linha de encomenda para esta variante, com um PDF cujas páginas são as suas camadas:

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

Que variantes podem ser encomendadas

  • Uma linha de encomenda pode indicar uma variante de um produto da sua conta, ou diretamente uma variante do catálogo, nunca um produto de outro cliente. A variante é encontrada pelo seu variant_id, ou pelo seu sku independentemente de maiúsculas e minúsculas.
  • A variante tem de estar ativa, e o seu produto ativo e aberto à venda. Para a sua cópia de um produto do catálogo, o produto do catálogo também tem de estar ativo e a variante do catálogo ligada.
  • Caso contrário, a encomenda é recusada com 400 Bad Request e o motivo, para a linha em causa: 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. ou The catalog variant is not active.
CRIAR E RASTREAR PEDIDOS

Pedidos

Crie encomendas na Fabrixa a partir da sua loja ou plataforma, anexe os ficheiros de impressão necessários e acompanhe cada item durante o fulfillment.

PREPARE OS DADOS DO SEU PEDIDO

Criar uma encomenda

Para criar uma encomenda através da Fabrixa Integration API, envie um pedido POST para https://api.fabrixa.com/v2/integration/orders. O request body deve incluir:

Solicitar estrutura corporal

  • number (opcional) - o número do pedido. Se não for fornecido, um número exclusivo será gerado.
  • comments (opcional) - quaisquer comentários ou notas adicionais relacionados ao pedido.
  • purchased_at - data e hora em que o pedido foi adquirido, formatado como YYYY-MM-DD HH:MM:SS.
  • client_ip (opcional) - o endereço IP do cliente.
  • client_user_agent (opcional) - o string user-agent do cliente.
  • rows - array de itens do pedido, cada um contendo:
    • sku - o SKU da variante do produto. Consulte Swagger para obter detalhes.
    • quantity - quantidade da variante do produto solicitada.
    • client_barcode (opcional) - identificador exclusivo do lado do cliente por linha de pedido, formatado como Code 128.
    • cart_item_key (obrigatório sem sources) - identificador exclusivo da incorporação da plataforma Fabrixa Studio, usado para associar personalizações salvas ao pedido.
    • sources (obrigatório sem cart_item_key) - matriz de arquivos de origem associados ao produto, cada um contendo:
      • type - "file" para um PDF, ou "print" para um arquivo JPEG, PNG ou TIFF.
      • url - URL da origem arquivo.
  • customer - detalhes do cliente:
    • first_name, last_name, email, phone.
  • shipping_address - detalhes de envio:
    • 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) - detalhes da etiqueta:
    • method_name - por exemplo, "Postar NL".
    • tracking_number, tracking_url, label_pdf_url.
    • date_created - formatado como YYYY-MM-DD HH:MM:SS.

Solicitação de amostra

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

Exemplo de resposta

{
    "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"
        }
    }
}
ALTERE OS DADOS DA ENCOMENDA

Atualizar uma encomenda

Para atualizar uma encomenda, envie um pedido PATCH para https://api.fabrixa.com/v2/integration/orders/{order_id}, em que {order_id} é o id da encomenda na Fabrixa. Só mudam os campos que enviar, e o estado da encomenda mantém-se. A resposta contém a encomenda atualizada. Pode alterar:

  • number, comments, purchased_at, client_ip, client_user_agent.
  • customer - first_name, last_name, email, phone.
  • shipping_address - os mesmos campos usados ao criar uma encomenda.

Solicitação de amostra

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

Exemplo de resposta

{
    "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"
        }
    }
}
  • As linhas da encomenda não podem ser alteradas: um pedido com rows é rejeitado com 400 Bad Request. Para alterar os artigos, cancele a encomenda e crie uma nova.
  • Uma encomenda no estado on hold não pode ser atualizada; a API responde com 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."
        ]
    }
}
PARE UMA ENCOMENDA

Cancelar uma encomenda

Para cancelar uma encomenda, envie um pedido POST sem body para https://api.fabrixa.com/v2/integration/orders/{order_id}/cancel, em que {order_id} é o id da encomenda na Fabrixa (o campo numérico id da encomenda), não o seu número de encomenda. A resposta contém a encomenda com o estado canceled e é enviado um webhook order.updated.

  • Uma encomenda pode ser cancelada enquanto o seu estado for created, imported, accepted ou on hold e o seu fulfillment_status ainda for unfulfilled. Quando passa a scheduled, a produção começou e a encomenda já não pode ser cancelada.
  • Os encargos de uma encomenda cancelada são reembolsados no seu saldo.
  • Cancelar uma encomenda já cancelada devolve-a inalterada, pelo que o pedido pode ser repetido em segurança.

Exemplo de resposta

{
    "links": {
        "self": "https://api.fabrixa.com/v2/integration/orders/20338/cancel"
    },
    "meta": [],
    "data": {
        "id": 20338,
        "number": "NL2024010201",
        "comments": "Customer agrees with a low resolution file.",
        "is_archived": false,
        "status": "canceled",
        "fulfillment_status": "unfulfilled",
        "purchased_at": "2024-06-26T21:12:22.000000Z",
        "created_at": "2024-06-26T21:15:03.000000Z",
        "updated_at": "2024-06-27T10:02:45.000000Z",
        "rows": [
            {
                "id": 41600,
                "quantity": 1,
                "client_barcode": "1234567890",
                "fulfillment_status": "unfulfilled",
                "variant": {
                    "id": 2705,
                    "name": "Duvet Cover",
                    "subtitle": "140x200",
                    "SKU": "COT864311",
                    "product": {
                        "id": 1305,
                        "name": "Duvet Cover",
                        "subtitle": "Duvet Cover with a pillow"
                    }
                },
                "sources": [
                    {
                        "type": "file",
                        "url": "https://samples-files.com/samples/sample.pdf",
                        "properties": null
                    }
                ]
            }
        ],
        "shipments": [],
        "customer": {
            "email": "3VJtP@example.com",
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678"
        },
        "shipping_address": {
            "address": "Voorbeeldstraat",
            "address2": "17",
            "address3": null,
            "city": "Amsterdam",
            "country": "Netherlands",
            "country_code": "NL",
            "company": null,
            "first_name": "John",
            "last_name": "Doe",
            "phone": "0612345678",
            "state": "North Holland",
            "postal_code": "1012 AB"
        }
    }
}

Se a encomenda não puder ser cancelada, a API responde com 412 Precondition Failed e uma mensagem com o motivo: o seu estado atual não o permite (o estado é indicado na mensagem) ou a produção já começou.

{
    "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)."
        ]
    }
}
DA IMPORTAÇÃO À ENTREGA

Ciclo de vida da encomenda

Uma encomenda é acompanhada através de três estados: o status da encomenda, o seu estado de produção fulfillment_status e o status de cada envio em shipments. Cada alteração é enviada no webhook order.updated e devolvida por GET /orders/{order_id}.

Status do pedido

O status de uma encomenda, pela ordem em que é atingido:

Status de cumprimento

O fulfillment_status de uma encomenda e de cada linha da encomenda, pela ordem em que é atingido. Só avança, nunca recua:

Uma encomenda no seu todo nunca é rejeitada. Um artigo individual pode ser rejeitado no controlo de qualidade durante a produção. É então reimpresso: volta a unfulfilled e passa novamente pela produção, enquanto a encomenda mantém o seu estado e continua assim que o artigo estiver concluído.

Status do envio

O status de cada envio em shipments, pela ordem em que é atingido:

Exceções:

RASTREIE SEUS ITENS DE PEDIDO

Acompanhar fulfillment

Para obter o estado de fulfillment de uma encomenda específica, envie um pedido GET para https://api.fabrixa.com/v2/integration/orders/{order_id}/fulfillments. A resposta fornece os fulfillments associados à encomenda, incluindo estado dos itens, detalhes do produto e progresso das etapas de produção.

Exemplo de resposta

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

A resposta inclui uma lista de cumprimentos, cada um fornecendo:

  • id - identificador único para o cumprimento.
  • barcode - código de barras para rastreamento e identificação interna; também pode ser impresso no produto.
  • status - o status de cumprimento atual: não cumprido ou cumprido.
  • created_at e updated_at - carimbos de data e hora para criação de cumprimento e última atualização.
  • variant - informações detalhadas sobre a variante do produto: nome, subtítulo, SKU.
  • product - detalhes do produto: nome, subtítulo.
  • production_steps - conjunto de etapas de produção. A lista de etapas depende do tipo de produto. Para cada etapa:
    • id - identificador exclusivo para a etapa de produção.
    • name - por exemplo, "Imprimir edredom".
    • description - o que a etapa de produção envolve.
    • status - o status atual:
      • pendente - ainda não iniciado.
      • em andamento - atualmente em andamento.
      • rejeitado - a etapa encontrou um problema e não foi concluída com sucesso.
      • concluído - a etapa foi concluída.
    • notes - quaisquer notas adicionais relacionadas à etapa.
    • updated_at - a última vez que o status da etapa foi atualizado.

Cada registro de atendimento corresponde a um produto específico ou variante de produto no pedido, e cada cópia do produto no pedido tem seu próprio registro de atendimento - cada item é rastreado individualmente durante a produção.

Se nenhum atendimento for retornado para um pedido, o pedido ainda não entrou na fase de processamento.

COMO FORNECER ARQUIVOS DE IMPRESSÃO

Requisitos dos ficheiros fonte

Ao incluir source files na encomenda, confirme que cumprem os seguintes requisitos:

type

O PDF é o formato de origem preferido. Para um produto com uma única camada de impressão, como um cobertor ou uma toalha, também serve um arquivo JPEG, PNG ou TIFF. Para um produto com várias camadas, forneça um arquivo PDF com cada camada numa página separada: durante o processamento cada página é tratada como uma camada própria, pelo que um design com várias camadas é enviado como um único arquivo. Consulte os requisitos do PDF e a ordem das páginas.

Defina o type conforme o formato do arquivo. Para um PDF, use "file": cada página é impressa numa camada do produto, pela ordem de páginas indicada para esse produto. Para um arquivo JPEG, PNG ou TIFF, adequado a um produto com uma única camada de impressão, use "print".

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

Para obter mais detalhes, consulte Swagger documentation.

url

O campo url deve conter um link direto para o arquivo fonte. Certifique-se de que o URL esteja acessível e que o arquivo possa ser baixado sem autenticação. O link deve permanecer acessível durante todo o processo de produção.

Como descarregamos o arquivo

Descarregamos o arquivo do seu servidor duas vezes: um pedido com Range: 0-0 enquanto a encomenda é validada e depois o arquivo completo. Ambos os pedidos enviam o User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#sources; print file fetch); se o seu site filtra tráfego automatizado, permita-o. O URL tem de usar HTTPS na porta 443 e devolver o arquivo diretamente, sem redirecionamentos, com o seu Content-Type real, por exemplo application/pdf. Cada pedido expira ao fim de 60 segundos.

Formato de arquivo

Forneça um arquivo PDF ou, para um produto de uma só camada, um arquivo JPEG, PNG ou TIFF, servido com o seu Content-Type real. As áreas transparentes de um PNG são impressas a branco. Certifique-se de que as imagens têm alta qualidade e são adequadas para impressão.

Dimensões da imagem

As dimensões máximas são 15,000 pixels em ambos os lados. Imagens que excedam esse limite poderão ser redimensionadas ou rejeitadas. A resolução da imagem deve corresponder às dimensões do produto; caso contrário, as imagens poderão ser redimensionadas ou cortadas para caber.

Resolução

Não há requisitos específicos de resolução – apenas garanta que a qualidade da imagem seja suficiente para impressão.

Espaço de cores

As imagens devem estar no espaço de cores RGB para uma representação precisa das cores. Outros espaços de cores serão convertidos durante o processamento, o que poderá resultar em cores incorretas.

Tamanho do arquivo

Cada arquivo de origem pode ter no máximo 200 MB. Um arquivo maior é rejeitado: ao criar a encomenda, se o seu servidor enviar Content-Length, caso contrário ao descarregar o arquivo.

Requisitos PDF e ordem das páginas

A ordem das páginas no PDF é importante. As páginas são combinadas com as camadas do produto por posição, e a ordem esperada das páginas depende do tipo de produto. Certifique-se de que as páginas do seu PDF sigam a sequência correta de camadas do produto que você está enviando.

ProdutoOrdem das páginas do 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 do PDF deve corresponder às dimensões exigidas para sua camada de produto e estar orientada corretamente. Posicione a arte de forma que a parte superior do design fique alinhada com a parte superior da página. O tamanho ou a orientação incorretos da página podem causar problemas de dimensionamento, rotação ou alinhamento na produção.

PLANEIE A ENTREGA

Envio

Saiba quanto custará o envio de uma encomenda e quanto tempo estará a caminho antes de a fazer, calculado pelas mesmas regras que a Fabrixa aplica à própria encomenda.

PARA ONDE É ENVIADO

Países de envio

Para saber para que países uma variante de produto pode ser enviada, envie um pedido GET para https://api.fabrixa.com/v2/integration/shipping/countries com as suas credenciais. A lista, ordenada por nome, contém os países para os quais o local que produz a variante tem uma tarifa de envio, para uma embalagem de envio em que a variante possa ser acondicionada. Um país que não conste da lista não tem tarifa de envio para a variante.

Parâmetros de consulta

  • variant_id ou sku - a variante, indicada como numa linha de encomenda, tal como para uma estimativa.

Solicitação de amostra

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'

Exemplo de resposta

{
    "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 da resposta

  • code e name - o país, com o código ISO 3166-1 alpha-2 a indicar como country_code na estimativa.
  • min_shipping_price e max_shipping_price - o intervalo de preço do envio de um volume para o país, sem IVA, na moeda indicada em currency, considerando as embalagens de envio em que a variante pode ser acondicionada. Uma encomenda de várias unidades pode precisar de vários volumes, pelo que deve pedir uma estimativa para saber o preço de uma dada quantidade.
  • min_eta_days e max_eta_days - o intervalo de dias que um volume está em trânsito depois de entregue à transportadora, sem contar o tempo de produção; null quando as tarifas não têm estimativa de entrega.
ANTES DE ENCOMENDAR

Estimar o envio

Para saber quanto custaria o envio de uma variante de produto e quanto tempo ficaria em trânsito, envie um pedido GET para https://api.fabrixa.com/v2/integration/shipping/estimate com as suas credenciais. A estimativa segue as regras com que é calculado o preço de uma encomenda: as unidades são acondicionadas nas embalagens de envio do local que produz a variante, e o preço de cada volume é calculado para a rota desse local até ao país de destino. Nada é encomendado nem reservado, e o preço de uma encomenda é calculado no momento em que é feita, pelo que os seus portes podem ser diferentes se as tarifas mudarem entretanto.

Parâmetros de consulta

  • variant_id ou sku - a variante, indicada como numa linha de encomenda: uma variante de um dos seus produtos, ou uma variante do catálogo. Tem de ser uma variante que possa encomendar.
  • country_code - o código ISO 3166-1 alpha-2 do país para onde a encomenda é enviada, por exemplo NL.
  • quantity - o número de unidades, de 1 a 1000.

Solicitação de amostra

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'

Exemplo de resposta

{
    "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 da resposta

  • variant_id, sku, quantity e country_code - a variante, a quantidade e o destino a que a estimativa se refere.
  • origin_country - o país de onde a variante é enviada, com o seu code e name.
  • packages_count - o número de volumes em que as unidades são acondicionadas.
  • packages - os próprios volumes, uma entrada por tipo de embalagem: o package_type, o seu length, width e height em cm, a quantity desses volumes, o price de envio de um deles e os seus eta_days. Os preços multiplicados pelas quantidades somam shipping_price.
  • shipping_price - o preço de envio de todos os volumes em conjunto, sem IVA, na moeda indicada em currency. Numa rota sem tarifa de envio, o envio é gratuito, tal como seria numa encomenda, e o preço é 0.00.
  • eta_days - o número de dias que o volume mais lento está em trânsito depois de entregue à transportadora, sem contar o tempo de produção; null quando a rota não tem estimativa de entrega.

Um pedido que não passe a validação recebe a resposta 400 Bad Request com o motivo para cada campo, com as mesmas mensagens que uma linha de encomenda, por exemplo The variant not found. Quando nenhuma embalagem de envio comporta as unidades, a resposta é 400 Bad Request com a mensagem No shipping package can carry the variant.

PERSONALIZAÇÃO DO PRODUTO

Fabrixa Studio

Fabrixa Studio é uma ferramenta que permite aos usuários customizar e personalizar produtos em tempo real com uma interface intuitiva onde os usuários podem criar ou fazer upload de seus próprios designs.

O Fabrixa Studio é ideal para empresas que oferecem produtos personalizados – permitindo que os clientes visualizem seus designs antes de finalizar os pedidos.

ADICIONE ESTÚDIO À SUA LOJA

Incorporar Estúdio Fabrixa

Pode incorporar o Fabrixa Studio no seu site usando um iframe. Isto permite que os clientes personalizem produtos diretamente no site durante o checkout.

Exemplo de iframe para incorporação do 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>

Substitua os valores de product_sku, cart_item_key e application_key pelos seus valores dinâmicos.

O cabeçalho do Studio mostra o nome do produto tal como está na sua loja - o mesmo título que os seus clientes veem - com as opções da variante escolhida por baixo. É a cópia do produto própria da sua loja, por isso um nome que edite na Fabrixa aparece também no Studio; locale não o traduz.

Solicitação para criar um pedido com 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": {
    "...": "..."
  }
}
OUVIR AS AÇÕES DO CLIENTE

Lidar com eventos de estúdio

Quando o botão Adicionar ao carrinho é clicado dentro do iframe, o seguinte comando é executado:

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

Da mesma forma, quando o botão Voltar é clicado:

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

O método postMessage facilita a comunicação de origem cruzada entre o iframe e sua janela pai, permitindo notificar o pai sobre ações específicas do usuário.

O primeiro argumento de postMessage são os dados que você deseja enviar. A string 'customizationFinished' indica que o usuário finalizou a personalização e está adicionando o produto ao carrinho. 'closeButtonClicked' indica que o usuário optou por voltar.

Na janela pai, ouça estas mensagens usando o ouvinte 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.');
        }
    }
});

Sempre verifique o origin das mensagens recebidas para garantir que elas venham de uma fonte confiável. Dependendo da mensagem recebida, execute as ações necessárias - atualize a interface do usuário, processe o carrinho, etc. A validação do origin é crucial para a segurança - evita que scripts não autorizados interajam com seu aplicativo.

MOSTRE O PROJETO ACABADO

Visualização da personalização

Após a conclusão da personalização, exiba o design final usando o URL de visualização abaixo. Este URL retorna uma imagem do produto customizado, adequada como o valor src em uma tag <img>. Ideal para mostrar o produto personalizado no carrinho, no resumo do pedido ou em qualquer lugar da interface da sua loja.

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

Substitua {CART_ITEM_KEY} pela chave real do item do carrinho e {APPLICATION_KEY} pela chave de aplicativo válida.

Exemplo de uso em uma tag de imagem:

<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;" />
EXPERIMENTE COM SEUS VALORES

Demonstração ao vivo

A pré-visualização da personalização aparecerá aqui após a conclusão do design.

Customization preview
RECEBA ATUALIZAÇÕES DO EVENTO

Webhooks da Fabrixa

Webhooks são usados ​​pela Fabrixa para notificar seu sistema sobre eventos em tempo real - atualizações de pedidos ou criações. Quando ocorre um evento, a Fabrixa envia um webhook para o seu servidor contendo as informações relevantes. Seu servidor deve expor um endpoint POST público para lidar com webhooks recebidos.

REVER SEUS CABEÇALHOS DE ENTRADA

Cabeçalhos de solicitação de webhook

O pedido webhook inclui os seguintes headers para ajudar a identificar e validar o pedido recebido:

{
  "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"
}
Detalhamento do cabeçalho

Os webhooks são enviados com o User-Agent Fabrixa/2.0 (+https://api.fabrixa.com/docs/integration#webhooks; webhook); se o seu endpoint filtra tráfego automatizado, permita-o. Para ter a certeza de que um pedido vem da Fabrixa, verifique x-webhook-signature.

ESCOLHA OS TÓPICOS DO SEU EVENTO

Eventos de webhook

Os webhooks da Fabrixa notificam o seu sistema sobre alterações no estado da encomenda ou atividade. Cada webhook é acionado por um valor específico de x-webhook-topic. Topics atualmente suportados:

TópicoDescrição
order.created Acionado quando um novo pedido é realizado na Fabrixa, seja via solicitação de API ou diretamente na plataforma.
order.updated Acionado quando os detalhes do pedido, como o status do pedido ou o status do atendimento, são atualizados.
INSPECIONE A CARGA DO SEU EVENTO

Exemplo de carga útil do webhook

Um exemplo de carga enviada com o webhook. Esta carga representa uma atualização do 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"
    }
  ]
}

Assim que a encomenda é enviada, shipments lista cada envio com a transportadora (carrier), o método de envio (method), o estado (status: pending, registered, collected, in transit, delivered, failed, returned ou canceled) e o seguimento: tracking_number e tracking_url, e o mesmo para cada volume em packages quando um envio tem vários. É enviado um webhook order.updated sempre que o estado ou o seguimento de um envio muda, e GET /orders/{order_id} devolve o mesmo campo.

VERIFIQUE SUA FONTE DO WEBHOOK

Verifique assinaturas de webhook

Para garantir que o pedido webhook é autêntico e não foi alterado, verifique o header x-webhook-signature. Recalcule a signature HMAC-SHA256 usando o raw request payload e a sua secret key, e compare com a signature recebida.

Exemplo de PHP bruto

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

Exemplo 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...
}

Substitua $yourSecret pela sua chave secreta compartilhada. Sempre use hash_equals para comparar assinaturas para mitigar ataques de temporização.

E SE A ENTREGA FALHAR?

Novas tentativas de webhook

Por padrão, os webhooks são desativados após 10 tentativas de entrega malsucedidas. Se o seu endpoint retornar um status de falha, como 404 ou qualquer erro 5xx, o webhook tentará novamente por um total de 10 vezes. Se continuar retornando um código de resposta diferente de 2xx ou não 3xx, ele será desativado. As respostas bem-sucedidas incluem:

RETORNE UMA RESPOSTA CLARA

Resposta do webhook

Recomendamos fortemente que seu endpoint retorne um código de status 200 OK o mais rápido possível para confirmar o recebimento bem-sucedido do webhook. Embora qualquer resposta 2xx ou 3xx seja considerada bem-sucedida, 200 é a mais comumente usada e confiável.

Para evitar tempos limite de entrega ou novas tentativas, retorne 200 OK imediatamente e lide com o processamento de carga útil do webhook de forma assíncrona, por exemplo, por meio de uma tarefa ou fila em segundo plano. Se o seu endpoint demorar muito para responder, ele poderá ser considerado uma falha, mesmo que a resposta seja bem-sucedida.

Respostas com códigos de status no intervalo 4xx ou 5xx, ou tempos limite, acionarão novas tentativas de acordo com o mecanismo de novas tentativas.