Esta rota envia o cadastro dos produtos da loja de um usuário final. O estoque não entra, apenas o cadastro. Com o catálogo, a IA conhece o produto antes da primeira venda, e o usuário pode fazer perguntas como “o que acha da garrafa térmica que acabei de cadastrar?”, “o preço da pochete está bom?”, “quais produtos não venderam nada este mês?” ou “como estão os produtos que lancei?“.
A IA responde com base no cadastro (preço, preço “de”, custo, categoria, descrição e data do cadastro) e, quando o produto já foi vendido, também com base nos pedidos.
Sincronização e webhook
O mesmo endpoint atende aos dois momentos da integração, assim como no PUT /orders:
- Sincronização do catálogo: Pagine todos os produtos do usuário e envie lotes de até 500, respeitando o limite de chamadas.
- Webhook: A cada produto criado ou alterado, envie um lote com 1 produto. Quando um produto for excluído no seu sistema, envie-o com
status: "archived". Não existe rota de exclusão.
A rota responde com o status 202 assim que o lote é validado, e a gravação acontece em segundo plano, como no PUT /orders. Não reenvie um lote que recebeu 202.
Vínculo com os pedidos
O id do produto enviado aqui é o mesmo items[].product_id dos itens do PUT /orders. É esse id que liga as vendas ao produto do catálogo: sem ele nos itens, a IA não sabe quais produtos do catálogo foram vendidos. As duas sincronizações são independentes, e não importa qual chega primeiro.
Cada id corresponde ao que você vende com ele. Se o seu sistema tem variações (tamanho, cor) com id próprio, envie cada variação como um produto, com o variant_name e o parent_id (o produto pai).
O preço do catálogo é o de tabela
O valor efetivamente vendido continua sendo o dos itens do pedido (unit_price_cents e total_cents): a receita, o preço médio e a margem são sempre calculados a partir dos pedidos. O preço do cadastro serve apenas como informação para a IA.
Regras
- Um lote tem de 1 a 500 produtos, sempre do mesmo usuário final (
external_id), e o body tem no máximo 5 MB. Se o usuário final ainda não existir, ele é criado. - Valores em centavos, sempre inteiros. Datas em RFC 3339 com fuso. Datas mais de 1 hora no futuro são recusadas com o status 400
COMMON_002. - Envie sempre o produto completo, com o estado atual. O cadastro é substituído por inteiro a cada envio, e um campo que não for enviado fica vazio.
updated_até obrigatório e deve ser a data da última alteração do produto no seu sistema, e não o horário do envio. A Diligens só grava o produto se essa data for mais recente que a do registro existente; portanto, reenviar não duplica dados. Para corrigir um produto, reenvie-o com umupdated_atmais recente.- Envie sempre o
created_at, a data do cadastro no seu sistema. É com ela que a IA sabe que um produto é novo e ainda não teve tempo de vender. Sem ela, o produto não aparece entre os lançamentos. - Sem
status, o produto entra comoactive. - O lote é tudo ou nada: Se a gravação falhar, nenhum produto do lote é gravado, e a Diligens tenta gravar o lote inteiro de novo. Reenviar também é seguro.
Corpo da requisição
external_id string Obrigatório O identificador do usuário final dono do catálogo, com até 255 caracteres.
products array de objetos Obrigatório De 1 a 500 produtos.
Campos de cada produto
id string Obrigatório O id do produto no seu sistema, com até 255 caracteres. Ele deve ser único por usuário final e é o mesmo product_id dos itens dos pedidos.
name string Obrigatório O nome do produto, com até 500 caracteres.
updated_at string (RFC 3339) Obrigatório A data da última alteração no seu sistema, e não o horário do envio.
status enum padrão: activeactive, inactive, draft ou archived.
product_type enum physical, digital, service, subscription ou other.
parent_id string O produto pai das variações, com até 255 caracteres.
sku string Até 100 caracteres. A IA identifica o produto pelo nome ou pelo sku.
gtin string O EAN (código de barras), apenas com dígitos, até 14.
variant_name string O nome da variação, com até 255 caracteres, por exemplo, "M / Azul".
description string A descrição do produto, com até 5.000 caracteres.
category, brand string Cada campo aceita até 255 caracteres.
unit string A unidade de venda, com até 20 caracteres, por exemplo, un ou kg.
price_cents integer O preço de venda no cadastro, em centavos, ≥ 0.
compare_at_price_cents integer O preço “de” de uma promoção, em centavos, ≥ 0.
cost_cents integer O custo unitário, em centavos, ≥ 0.
url string A URL http(s) da página do produto, com até 2.000 caracteres.
tags array de strings Até 30 tags, com até 100 caracteres cada.
created_at string (RFC 3339) A data do cadastro no seu sistema. É com ela que a IA identifica os lançamentos.
Veja a seguir um exemplo com todos os campos de um produto:
Resposta
batch_id string O identificador do lote. Guarde no seu log: com ele, o suporte localiza o lote se você precisar.
received integer A quantidade de produtos recebidos no lote. Os produtos já registrados com um updated_at igual ou mais recente são ignorados na gravação, sem erro.
Erros
| Status | code | Quando |
|---|---|---|
| 400 | COMMON_001 | JSON ou data malformados |
| 400 | COMMON_002 | Campo inválido, com o caminho em details[].field, por exemplo, products[3].price_cents |
| 413 | COMMON_004 | Body acima de 5 MB (reduza o tamanho do lote) |
| 429 | INGEST_001 | A cota diária de itens da conta acabou, e o lote não entrou (veja Cota diária) |
| 500 | COMMON_003 | Erro interno. Reenvie o lote |
| 503 | COMMON_006 | Serviço indisponível por um momento, e o lote não foi aceito. Aguarde alguns segundos e reenvie |
Um campo inválido rejeita o lote inteiro. Os erros gerais (401, 402, 403, 429) estão descritos em Erros.