Pular para o conteúdo principal

Atualizar produtos e seus relacionamentos

Este endpoint é utilizado para atualizar um lote de produtos de uma vez. É ideal para sistemas que precisam sincronizar uma grande quantidade de dados de produtos em uma única requisição.

PUT /v1/batch/products

  • Authorization: Basic Auth contendo a chave pública e secreta disponibilizadas para o cliente.
    • Exemplo: Basic <base64-encoded-credentials>
  • x-contractAccountId: Identificador da conta do contrato do cliente.
    • Exemplo: x-contractAccountId: 9f36a666-acd5-4987-a47f-3de247f65d82

Exemplo de Autorização

Para gerar o valor de Authorization, você precisa codificar suas credenciais (public_key:secret_key) em base64. Por exemplo, se sua chave pública for public_key e sua chave secreta for secret_key, você deve codificar public_key:secret_key em base64.

echo -n 'public_key:secret_key' | base64

Corpo da Requisição

O corpo da requisição deve ser uma lista de objetos de produtos, cada um contendo os seguintes campos:

CampoTipoNullableLimiteDescrição
externalReferencestringNão-Referência externa do produto para rastreabilidade fora dos sistemas Grocers. Obrigatório para identificar o produto
namestringNão120Nome do produto. Máximo 120 caracteres
similarTermsstringSim-Termos similares para facilitar a busca separados por vírgula.
slugstringNão120Slug único do produto. Máximo 120 caracteres
titlestringNão60Texto de exibição do produto. Máximo 60 caracteres
shortDescriptionstringNão160Descrição breve do produto. Máximo 160 caracteres
longDescriptionstringNão-Descrição longa do produto
brandExternalReferencestringSim30Referência externa da marca já cadastrada. Máximo 30 caracteres
categoryExternalReferencestringSim30Referência externa da categoria já cadastrada. Máximo 30 caracteres
displayInSiteboolNão-Define se o produto será exibido no site
displayInSoldOutboolNão-Define se o produto será exibido quando esgotado
fiscalCodestringNão30Código fiscal do produto. Máximo 30 caracteres
EANstringSim48Código de barras EAN. Máximo 48 caracteres
PunctuationintNão-Pontuação do produto (deve ser ≥ 0)
CharacteristicsstringSim-Características descritivas do produto
ActiveboolSim-Produto ativo/inativo
SKUsarrayNão-SKUs do produto a ser cadastrado. Os SKUs não enviados serão removidos

Campos dos SKUs

CampoTipoNullableLimiteDescrição
ProductExternalReferencestringNão-Referência externa do produto pai
externalReferencestringNão-Referência externa do SKU
NamestringNão120Nome do SKU. Máximo 120 caracteres
EANstringNão30Código de barras EAN do SKU. Máximo 30 caracteres
ReferencestringNão30Referência interna do SKU. Máximo 30 caracteres
WeightForFreightdecimalNão-Peso para cálculo de frete (deve ser > 0)
HeightForFreightdecimalNão-Altura para cálculo de frete (deve ser > 0)
WidthForFreightdecimalNão-Largura para cálculo de frete (deve ser > 0)
LengthForFreightdecimalNão-Comprimento para cálculo de frete (deve ser > 0)
WeightRealdecimalNão-Peso real do produto (deve ser > 0)
HeightRealdecimalNão-Altura real do produto (deve ser > 0)
WidthRealdecimalNão-Largura real do produto (deve ser > 0)
LengthRealdecimalNão-Comprimento real do produto (deve ser > 0)
ArrivalDatedateNão-Data de chegada do produto
UnitOfMeasurementintNão-Unidade de medida (ver tabela abaixo)
UnitMultiplierdecimalSim-Multiplicador da unidade (deve ser > 0 se fornecido)
ManufacturerCodestringNão-Código do fabricante
WeightdecimalSim-Peso do produto (deve ser > 0 se fornecido)
MinimumWeightForSaledecimalSim-Peso mínimo para venda (deve ser > 0 se fornecido)
SkuPackageMinAmountintSim-Quantidade mínima do pacote (deve ser > 0 se fornecido)
SkuPackageMaxAmountintSim-Quantidade máxima do pacote (deve ser > 0 se fornecido)
ExhibitionBadge1stringSim15Badge de exibição 1. Máximo 15 caracteres
ExhibitionBadge2stringSim15Badge de exibição 2. Máximo 15 caracteres
ExhibitionBadge3stringSim15Badge de exibição 3. Máximo 15 caracteres

Possiveis valores para UnitOfMeasure

O campo UnitOfMeasure dentro de SKUs aceita os seguintes valores:

ValorDescrição
1Unidade (Un)
2Quilograma (Kg)
3Grama (g)
4Miligrama (Mg)

Exemplo de Corpo da Requisição

[
{
"externalReference": "1",
"name": "Arroz branco",
"similarTerms": "arroz, branco",
"slug": "arroz-branco-prato-fino-1kg-431150",
"title": "Arroz Branco Prato Fino 1kg",
"shortDescription": "ARROZ B PRATO FINO 1KG",
"longDescription": "Arroz Branco Prato Fino 1kg",
"displayInSite": false,
"displayInSoldOut": false,
"fiscalCode": "1111111",
"EAN": "7896891504153",
"Punctuation": 1,
"Characteristics": "Arroz branco tipo 1, grãos selecionados, pacote de 1kg, fácil preparo, ideal para acompanhamentos e pratos do dia a dia",
"Active": false,
"brandExternalReference": null,
"categoryExternalReference": "4",
"SKUs": [
{
"externalReference": "10",
"Name": "Sample Product",
"EAN": "1234567890123",
"Reference": "REF12345",
"WeightForFreight": 1.5,
"HeightForFreight": 10.0,
"WidthForFreight": 5.0,
"LengthForFreight": 20.0,
"WeightReal": 1.4,
"HeightReal": 9.8,
"WidthReal": 4.9,
"LengthReal": 19.8,
"ArrivalDate": "2023-10-01",
"ManufacturerCode": "MFG12345",
"UnitOfMeasure": 2,
"Weight": 1.5,
"ArithmeticFactor": 2,
"MinimumWeightForSale": 1.5,
"SkuPackageMinAmount": 1,
"SkuPackageMaxAmount": 3,
"ExhibitionBadge1": "Promoção",
"ExhibitionBadge2": "Novidade",
"ExhibitionBadge3": "Frete Grátis"
}
]
}
]

Respostas

  • 200: Retorna sucesso da operação. A resposta incluirá detalhes sobre o processamento da lista de produtos.
  • 400: Retorna erro de requisição inválida. Isso geralmente ocorre devido a dados de entrada mal formatados, limites de caracteres excedidos ou campos obrigatórios faltando.
  • 404: Produto não encontrado pela referência externa fornecida.
  • 500: Retorna erro interno do servidor. Indica problemas no processamento da requisição no servidor.

Exemplo de Resposta para Sucesso (200)

{ "operationId": "402fe685-2060-432b-ac57-223eb2e680f3" }

Exemplo de Resposta para Erro (400) - Validação

{
"title": "Erro de validação",
"detail": "Um ou mais produtos contêm dados inválidos",
"status": 400,
"errors": {
"ValidationErrors": [
"Produto 1: Nome deve ter no máximo 120 caracteres",
"Produto 1: Título deve ter no máximo 60 caracteres",
"Produto 1: SKU 'Nome do SKU' deve ter no máximo 120 caracteres"
]
}
}

Validações Implementadas

O sistema implementa as mesmas validações rigorosas da criação de produtos:

Validações de Produto:

  • Nome: Obrigatório, mínimo 5 caracteres, máximo 120 caracteres
  • Slug: Obrigatório, máximo 120 caracteres
  • Título: Obrigatório, mínimo 3 caracteres, máximo 60 caracteres
  • Descrição Curta: Obrigatório, mínimo 3 caracteres, máximo 160 caracteres
  • Descrição Longa: Obrigatório, mínimo 3 caracteres
  • Código Fiscal: Obrigatório, mínimo 3 caracteres, máximo 30 caracteres
  • EAN: Máximo 48 caracteres
  • Pontuação: Obrigatório, deve ser ≥ 0
  • Referência Externa da Marca: Máximo 30 caracteres
  • Referência Externa da Categoria: Máximo 30 caracteres

Validações de SKU:

  • Nome: Obrigatório, máximo 120 caracteres
  • EAN: Obrigatório, máximo 30 caracteres
  • Reference: Obrigatório, máximo 30 caracteres
  • Dimensões e Pesos: Todos devem ser > 0
  • Data de Chegada: Obrigatório
  • Código do Fabricante: Obrigatório
  • Unidade de Medida: Deve ser um valor válido do enum
  • Badges de Exibição: Máximo 15 caracteres cada

Mensagem de notificação webhook

Quando a operação é processada, uma mensagem é enviada para os endpoints de notificação registrados pelo webhook. A mensagem contém o ID, o status da operação e detalhes do retorno.

Webhook de Sucesso

{
"operationId": "54d6a979-5f62-4e17-9d4c-dbd9f5ede403",
"relatedEntity": "Product",
"eventType": 2,
"data": {
"name": "Granola Tradicional com Castanhas Mãe Terra 800g - Atualizada",
"similarTerms": "granola,castanhas,mãe terra,atualizada",
"slug": "granola-tradicional-castanhas-mae-terra-800g-v2",
"title": "Granola Tradicional com Castanhas Mãe Terra 800g",
"shortDescription": "Granola Tradicional com Castanhas Mãe Terra 800g",
"longDescription": "Granola Tradicional com Castanhas Mãe Terra 800g - Versão atualizada",
"brandId": "e7b8a9d4-3f4b-4c8e-9d2e-1f5a6b7c8d9e",
"categoryId": "c9b1d5e4-2f3a-4b8e-9d1e-7f6a8b9c0d1f",
"commercialPoliticId": "b6a2f813-9952-4f35-fbc5-08dcf2bc3756",
"displayInSite": true,
"displayInSoldOut": false,
"fiscalCode": "11111",
"EAN": "7891150075443",
"punctuation": 1,
"externalReference": "103928"
},
"contractAccountId": "E9A2FCA6-198F-4B4A-A183-2356EF6562F5"
}

Webhook de Erro

{
"operationId": "bb067d1e-5388-4794-95cb-188b417dc280",
"relatedEntity": "Product",
"eventType": 110,
"data": {
"externalReference": "103928",
"name": "Nome muito longo que excede o limite de 120 caracteres permitidos pelo sistema de validação implementado",
"title": "Título muito longo que excede o limite de 60 caracteres"
},
"contractAccountId": "E9A2FCA6-198F-4B4A-A183-2356EF6562F5",
"error": {
"statusCode": 400,
"message": "Erro de validação",
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Erro de validação",
"detail": "Um ou mais produtos contêm dados inválidos",
"instance": "/v1/batch/products",
"traceId": "00-42bf4652eeb9c657161c4d7e92ec7cd7-27a5fd389fba4dbf-00",
"validationErrors": [
{ "id": 1, "validation": "Nome deve ter no máximo 120 caracteres", "key": "Name" },
{ "id": 2, "validation": "Título deve ter no máximo 60 caracteres", "key": "Title" }
]
}
}

Tipos de Eventos

Tipos de eventos para atualização de produtos:

  • Product_Updated = 2: Produto atualizado com sucesso
  • Product_UpdateFailed = 110: Falha na atualização do produto
  • SKU_Updated = 5: SKU atualizado com sucesso
  • SKU_UpdateFailed = 111: Falha na atualização do SKU

IMPORTANTE: Para receber notificações de erro, você deve explicitamente incluir os tipos de eventos de erro (como Product_UpdateFailed) na configuração do seu webhook.

Comportamento Especial para SKUs

⚠️ ATENÇÃO: Durante a atualização de produtos, os SKUs são tratados de forma especial:

  • SKUs enviados: Serão criados ou atualizados conforme necessário
  • SKUs não enviados: Serão removidos do produto
  • SKUs com erro: Gerarão webhooks de erro específicos (SKU_UpdateFailed = 111)

Esta abordagem garante que o estado final dos SKUs no sistema corresponda exatamente ao que foi enviado na requisição de atualização.