Envio da venda
Envie a venda por loja e código de barras, com o perfil por hora que a ruptura por não venda precisa — uma vez ao dia, a cada intervalo ou em tempo real.
Um envio é um dia de uma loja, no contrato bix.sales.daily/v1, com tudo o que a loja vendeu
naquele dia até o momento do envio.
Quando enviar
Na frequência que o seu sistema permitir. Quanto mais perto do tempo real, mais cedo a ruptura aparece e mais cedo a loja confere a gôndola.
| Frequência | Como | Quando a ruptura aparece |
|---|---|---|
| Tempo real (o ideal) | A cada venda, ou a cada poucos minutos, o acumulado do dia | Logo depois de o produto parar de vender |
| A cada intervalo (ex.: 15 ou 30 minutos) | O acumulado do dia até aquele momento | No envio seguinte ao produto parar de vender |
| Uma vez ao dia | O dia anterior, fechado | No dia seguinte |
Em toda frequência, mande o acumulado do dia com complete: true e o profiles. Cada envio
substitui o anterior daquele dia e o BIX recalcula a ruptura provável na hora. Um envio que só traz
as vendas novas (complete: false) grava a venda, mas não recalcula a ruptura.
Quando a tarefa de auditoria vai para a loja depende da agenda configurada no BIX pelo cliente.
{
"schema": "bix.sales.daily/v1",
"source": "erp",
"sale_date": "2026-11-09",
"location": {"integration_code": "0012"},
"complete": true,
"rows": [
{"product_code": "1001", "gtin": "7891234567890", "on_offer": false, "quantity": 44,
"amount": 1227.6, "full_price_amount": 1227.6, "receipts": 39,
"first_sale_at": "08:12", "last_sale_at": "21:40"}
],
"profiles": [
{"product_code": "1001", "quantity": 44, "receipts": 39,
"hourly_qty": [0,0,0,0,0,0,0,0,2,3,4,5,3,2,3,4,5,6,4,2,1,0,0,0],
"hourly_receipts": [0,0,0,0,0,0,0,0,2,3,4,5,3,2,3,4,5,6,4,2,1,0,0,0],
"sale_moments": 39, "median_gap_minutes": 18, "max_gap_minutes": 95,
"max_gap_start": "14:10", "max_gap_end": "15:45",
"store_open_at": "07:02", "store_close_at": "21:55"}
]
}
rows: a venda
Uma linha por código de barras e por oferta (on_offer). Linhas repetidas no lote são somadas.
receipts é o número de cupons que tiveram o produto, e é ele que diz "vende a cada quantos
minutos". Devolução (quantidade negativa) fica de fora.
profiles: o perfil do dia
Por código interno (soma os códigos de barras do produto). Sem profiles, a ruptura por
não venda não é avaliada: a venda é gravada e serve à rebaixa, mas nenhum sinal sai dela.
Durante o dia, o perfil vai até o momento do envio, e o intervalo que ainda está aberto conta: se o produto não vende desde 14:10 e você envia às 16:00, o maior intervalo sem venda vai de 14:10 a 16:00.
| Campo | O que é |
|---|---|
hourly_qty / hourly_receipts |
Quantidade e cupons em cada hora, 24 posições, da 0h às 23h |
store_open_at / store_close_at |
A janela da loja naquele dia (HH:MM) |
max_gap_minutes, max_gap_start, max_gap_end |
O maior intervalo sem venda dentro da janela |
median_gap_minutes, sale_moments |
O intervalo típico e quantos momentos de venda houve |
Reenviar e corrigir
complete: true(padrão) substitui o dia daquela loja e daquelesource. Reenviar o mesmo lote não duplica, e o lote corrigido corrige.complete: falsesó soma as linhas enviadas, sem substituir o dia. Grava a venda, mas não recalcula a ruptura: para a ruptura, use sempre o acumulado comcomplete: true.- Até 50.000 linhas por envio. Linha inválida volta em
rejected, com a posição, e o resto grava.