Sincronize o catálogo
curl --request PUT \
--url https://api.dev.connect.onbeefapp.com.br/v1/merchantUpdate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"entityType": "<string>"
}
'Merchant
Sincronize o catálogo
Envie categorias, itens e ofertas. Produtos são localizados pelo pdv_external_id: MERCHANT cria e remove, ITEM atualiza o cadastro, ITEM_OFFER atualiza preço e disponibilidade.
PUT
/
v1
/
merchantUpdate
Sincronize o catálogo
curl --request PUT \
--url https://api.dev.connect.onbeefapp.com.br/v1/merchantUpdate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"entityType": "<string>"
}
'Envie o catálogo completo ou atualize itens e ofertas específicos. Escolha o formato de
O que cada
Os três formatos têm alcances diferentes. Use a tabela para escolher:
Recomendação de uso:
Formato de
O conteúdo de
Consulte
updatedObjects pelo campo entityType.
A API responde de forma assíncrona. Depois do envio, consulte GET /v1/merchantStatus para verificar o resultado.
A configuração do webhook de pedidos é opcional para sincronizar o catálogo. Para receber notificações de pedidos, configure
PUT /v1/merchantOnboarding e consulte o guia Webhook de pedidos.Corpo da requisição
Envie um corpoapplication/json.
Campos comuns
string
required
Define o formato de
updatedObjects. Valores aceitos:MERCHANT: sincroniza a loja, as categorias, os itens e as ofertas em uma estrutura aninhada.ITEM: atualiza produtos existentes em uma lista plana.ITEM_OFFER: atualiza preço e disponibilidade de produtos existentes em uma lista plana.
string
Obrigatório quando
entityType é MERCHANT. Valores aceitos: AVAILABLE e UNAVAILABLE.AVAILABLE liga a chave geral de recebimento de pedidos. UNAVAILABLE desliga essa chave e bloqueia novos pedidos no checkout.O campo não representa o horário de funcionamento. Uma loja pode estar AVAILABLE e não receber pedidos fora do horário cadastrado.Com ITEM ou ITEM_OFFER, o campo é aceito e ignorado.boolean
default:"false"
Tem efeito apenas quando
entityType é MERCHANT.true: adiciona ou atualiza os dados enviados sem desassociar produtos nem remover registros do catálogo.false: substitui as associações entre categorias e produtos pelo conteúdo enviado. Também permite remover do catálogo categorias e produtos vinculados ao PDV que não aparecem no payload.
ITEM ou ITEM_OFFER, o campo é ignorado.O que cada entityType atualiza
Os três formatos têm alcances diferentes. Use a tabela para escolher:
MERCHANT | ITEM | ITEM_OFFER | |
|---|---|---|---|
| Cria produtos e categorias | Sim | Não | Não |
| Remove produtos e categorias ausentes | Sim, com onlyAddProducts: false | Não | Não |
| Preço | Sim (itemOffer.price.value) | Não | Sim |
| Disponibilidade | Sim | Sim | Sim |
| Nome e descrição | Apenas na criação | Sim, sobrescreve o painel | Não |
| Imagem | Sim | Sim | Não |
| EAN e código de balança | Sim | Sim | Não |
| Porção e informações nutricionais | Sim | Sim | Não |
Tipo (unit) | Apenas na criação | Apenas se ainda não definido | Não |
MERCHANT: carga inicial e mudanças estruturais (novas categorias, novos produtos, remoções).ITEM: dados cadastrais de produtos existentes.ITEM_OFFER: o dia a dia de preço e disponibilidade.
Estoque não é atualizado por nenhum formato. O campo
stock de GET /v1/merchant é apenas leitura.Formato de updatedObjects
O conteúdo de updatedObjects muda conforme entityType. Não misture os formatos.
- MERCHANT
- ITEM
- ITEM_OFFER
Use
MERCHANT para enviar a estrutura aninhada da loja, com categorias, itens e ofertas.array
required
Lista de objetos de loja. O primeiro objeto precisa conter
id.string
required
Identificador da loja no seu PDV. A Onbeef armazena esse valor como
pdv_external_id.Se o primeiro objeto não tiver id, nada será processado e a sincronização terminará com FAIL.array
Categorias do catálogo.
id(string, obrigatório): identificador estável da categoria no seu PDV.name(string, obrigatório): nome de exibição da categoria.index(integer): posição da categoria. Esse valor é usado apenas na criação.status(string):AVAILABLEouUNAVAILABLE.itemOfferId(array of strings): IDs das ofertas associadas à categoria.
itemOfferId recebe uma lista de IDs.Uma categoria sem id ou name é descartada e reportada como malformada.array
Ofertas que relacionam itens às categorias e definem preço e disponibilidade.
id(string, obrigatório): identificador da oferta. Deve corresponder a um valor presente emcategory.itemOfferId.itemId(string, obrigatório): identificador do item associado. Deve corresponder aitem.id.price.value(number, obrigatório): preço aplicado ao produto.status(string):AVAILABLEouUNAVAILABLE. Este campo define a disponibilidade do produto neste formato.
id não pode ser alcançada pelas categorias. Os produtos relacionados a ela são descartados e reportados como malformados.array
Dados dos produtos referenciados pelas ofertas.
id(string, obrigatório): identificador estável do item no seu PDV. A Onbeef armazena esse valor comopdv_external_iddo produto.name(string, obrigatório): nome de exibição do produto. Usado apenas na criação: em produtos existentes, o nome cadastrado pelo lojista é preservado.description(string): descrição do produto. Usada apenas na criação, como oname.externalCode(string): código de balança do produto, usado pelos recursos de balança do painel. Não é usado para localizar produtos na integração.ean(string): código de barras EAN. Apenas informativo.unit(string):KGouUN. Define o tipo do produto apenas na criação. Depois de definido, o tipo não pode ser alterado e novos valores são ignorados.serving(integer): número de pessoas que a porção serve. Envie um número; texto é convertido para0.nutritionalInfo(object): informações nutricionais.image(object): imagem no formato{ "url": "https://..." }.
itemOffer.price.value e itemOffer.status.O encadeamento segue esta ordem:
category.itemOfferId referencia itemOffer.id, e itemOffer.itemId referencia item.id. Um conjunto sem item correspondente, sem item.name ou sem itemOffer.price.value é descartado e reportado em moreInfo.Quando
onlyAddProducts é false, categorias e produtos vinculados ao PDV que não aparecem no payload podem ser removidos do catálogo. A remoção afeta apenas registros com pdv_external_id. Conteúdos criados manualmente pelo lojista no painel não são removidos.Imagens, cortes e vínculos de categoria associados aos registros removidos também são excluídos.Se qualquer objeto do payload estiver malformado, nenhuma remoção será executada nessa sincronização. O mesmo ocorre quando o payload não contém nenhuma categoria válida. Consulte moreInfo para identificar o problema.Exemplo de payload
{
"merchantStatus": "AVAILABLE",
"entityType": "MERCHANT",
"onlyAddProducts": false,
"updatedObjects": [
{
"id": "LOJA-01",
"categories": [
{
"id": "15",
"name": "Carnes bovinas",
"index": 0,
"status": "AVAILABLE",
"itemOfferId": [
"OF-1001",
"OF-1002"
]
}
],
"itemOffers": [
{
"id": "OF-1001",
"itemId": "1001",
"price": {
"value": 89.9
},
"status": "AVAILABLE"
},
{
"id": "OF-1002",
"itemId": "1002",
"price": {
"value": 24.9
},
"status": "AVAILABLE"
}
],
"items": [
{
"id": "1001",
"name": "Picanha bovina",
"description": "Peça resfriada vendida por peso",
"externalCode": "CARNE-1001",
"ean": "7891234567890",
"unit": "KG",
"serving": 4,
"nutritionalInfo": {},
"image": {
"url": "https://your-pos-system.example.com/images/picanha.jpg"
}
},
{
"id": "1002",
"name": "Linguiça artesanal",
"description": "Pacote com 500 g",
"externalCode": "CARNE-1002",
"ean": "7891234567891",
"unit": "UN",
"image": {
"url": "https://your-pos-system.example.com/images/linguica.jpg"
}
}
]
}
]
}
Use
ITEM para atualizar produtos já sincronizados. updatedObjects recebe uma lista plana, sem categories ou itemOffers.Este formato não cria produtos.array
required
Lista plana de produtos existentes.
string
required
Identificador do produto no seu PDV. Deve corresponder ao
pdv_external_id de um produto já sincronizado.Se o produto não existir no catálogo, o objeto será ignorado e reportado em moreInfo.string
required
Nome de exibição do produto. Diferente do
MERCHANT, aqui o nome sobrescreve o que está cadastrado no painel.string
Descrição do produto. Quando enviada, sobrescreve a descrição cadastrada no painel.
string
Código de balança do produto, usado pelos recursos de balança do painel. Não é usado para localizar produtos na integração.
string
Código de barras EAN. Apenas informativo.
string
Disponibilidade aplicada ao produto. Valores aceitos:
AVAILABLE e UNAVAILABLE.string
Tipo do produto:
KG ou UN. O valor só é aplicado quando o produto ainda não tem um tipo definido. Depois disso, alterações são ignoradas.integer
Número de pessoas que a porção serve. Envie um número; texto é convertido para
0.object
Informações nutricionais.
object
Imagem no formato
{ "url": "https://..." }.ITEM não atualiza preços. Campos de preço enviados neste formato são ignorados. Use ITEM_OFFER para alterar o preço de um produto.Exemplo de payload
{
"entityType": "ITEM",
"updatedObjects": [
{
"id": "1001",
"name": "Picanha bovina premium",
"description": "Peça resfriada vendida por peso",
"externalCode": "CARNE-1001",
"ean": "7891234567890",
"status": "AVAILABLE",
"unit": "KG",
"serving": 4,
"nutritionalInfo": {},
"image": {
"url": "https://your-pos-system.example.com/images/picanha-premium.jpg"
}
},
{
"id": "1002",
"name": "Linguiça artesanal",
"description": "Pacote com 500 g",
"externalCode": "CARNE-1002",
"ean": "7891234567891",
"status": "UNAVAILABLE",
"unit": "UN",
"image": {
"url": "https://your-pos-system.example.com/images/linguica.jpg"
}
}
]
}
Use
ITEM_OFFER para atualizar preço e disponibilidade de produtos já sincronizados. updatedObjects recebe uma lista plana de ofertas.Este formato não cria produtos.array
required
Lista plana de ofertas.
string
required
Identificador do produto no seu PDV. Deve corresponder ao
pdv_external_id de um produto já sincronizado.Se o produto não existir no catálogo, a oferta será ignorada e reportada em moreInfo.number
required
Preço aplicado ao produto.
string
Disponibilidade aplicada ao produto. Valores aceitos:
AVAILABLE e UNAVAILABLE.Se o campo for omitido ou tiver um valor diferente dos aceitos, o produto manterá a disponibilidade atual.string
Campo aceito por compatibilidade, mas ignorado neste formato.
number
Campo aceito, mas ignorado.
string
Campo aceito, mas ignorado.
Produtos configurados pelo lojista como kits de preço aberto não recebem preço nem disponibilidade do PDV. A oferta inteira é ignorada e reportada em
moreInfo.Exemplo de payload
{
"entityType": "ITEM_OFFER",
"updatedObjects": [
{
"itemId": "1001",
"price": {
"value": 94.9
},
"status": "AVAILABLE"
},
{
"itemId": "1002",
"price": {
"value": 26.9
},
"status": "UNAVAILABLE"
}
]
}
Para ocultar temporariamente um produto sem removê-lo, defina o
status da oferta como UNAVAILABLE. Em MERCHANT, use itemOffers[].status. Em ITEM_OFFER, use updatedObjects[].status.Processamento e resultado
O processamento ocorre de forma assíncrona. Depois de receber o payload, a API enfileira a sincronização e responde com204 No Content.
O status HTTP
204 confirma apenas que a requisição foi aceita e enfileirada. Ele não confirma que os dados foram aplicados.GET /v1/merchantStatus até status deixar de ser PROCESSING.
| Status | Significado |
|---|---|
PROCESSING | A sincronização foi enfileirada ou está em processamento. |
SUCCESS | Todos os objetos foram processados sem descartes. |
FAIL | A sincronização falhou por completo ou terminou com objetos descartados. Consulte moreInfo. |
moreInfo informa quantos objetos foram processados e descreve dados descartados ou problemas encontrados.
FAIL também pode representar sucesso parcial. Por exemplo, se 99 de 100 itens forem atualizados, o resultado será FAIL, mas as 99 alterações já terão sido aplicadas.Não reenvie o mesmo payload automaticamente em loop. Leia moreInfo, identifique o que foi aplicado ou descartado e corrija a próxima sincronização.Campos da resposta
204: Sem conteúdo
A requisição foi recebida e enfileirada. A resposta não contém corpo. ConsulteGET /v1/merchantStatus para saber se o processamento terminou com SUCCESS ou FAIL.
400: Requisição inválida
Um campo obrigatório está ausente ou com valor não aceito (por exemplo,entityType fora do enum, ou merchantStatus ausente com entityType: MERCHANT). O corpo informa o campo: { "title": "The merchant status field is required when entity type is MERCHANT.", "status": 400 }.
