{"openapi":"3.0.3","info":{"title":"SysCatálogo","version":"1.0.0","description":"Cadastro de produto por código de barras (GTIN/EAN): descrição, marca, NCM, CEST e foto. O contrato desta v1 é permanente — campo novo entra sempre opcional, e campo em uso nunca é removido nem renomeado."},"servers":[{"url":"https://syscatalogo.wxdev.com.br"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"O token da sua licença."}},"schemas":{"Imagem":{"type":"object","properties":{"thumb":{"type":"string","format":"uri"},"media":{"type":"string","format":"uri"},"grande":{"type":"string","format":"uri"},"licenca":{"type":"string","nullable":true,"description":"Quando preenchido, exibir `atribuicao` é obrigatório."},"atribuicao":{"type":"string","nullable":true}}},"Produto":{"type":"object","properties":{"descricao":{"type":"string","nullable":true},"marca":{"type":"string","nullable":true},"categoria":{"type":"string","nullable":true},"ncm":{"type":"string","nullable":true},"cest":{"type":"string","nullable":true},"unidade":{"type":"string","nullable":true},"peso_liquido":{"type":"number","nullable":true},"fonte":{"type":"string","nullable":true},"confianca":{"type":"integer","nullable":true,"minimum":0,"maximum":100},"imagem":{"allOf":[{"$ref":"#/components/schemas/Imagem"}],"nullable":true}}},"Resposta":{"type":"object","properties":{"gtin":{"type":"string","description":"Normalizado para 14 dígitos."},"origem":{"type":"string","enum":["cache","fonte_externa","produto_sem_imagem","nao_encontrado","codigo_interno"]},"encontrado":{"type":"boolean"},"motivo":{"type":"string","nullable":true},"mensagem":{"type":"string","nullable":true},"produto":{"allOf":[{"$ref":"#/components/schemas/Produto"}],"nullable":true}}},"Erro":{"type":"object","properties":{"erro":{"type":"string"},"motivo":{"type":"string","nullable":true},"mensagem":{"type":"string","nullable":true}}}}},"paths":{"/v1/produtos/{gtin}":{"get":{"summary":"Consulta um produto pelo código de barras","parameters":[{"name":"gtin","in":"path","required":true,"schema":{"type":"string"},"description":"EAN-8, UPC-12, EAN-13 ou GTIN-14, com ou sem zeros à esquerda."}],"responses":{"200":{"description":"Produto encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resposta"}}}},"401":{"description":"Token inválido ou licença inativa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"402":{"description":"Teto de produtos do plano atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}},"404":{"description":"Não temos este produto","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resposta"}}}},"422":{"description":"Código interno da loja: não existe em base externa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resposta"}}}},"429":{"description":"Limite diário ou de requisições atingido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erro"}}}}}}},"/v1/produtos/lote":{"post":{"summary":"Consulta até 100 produtos de uma vez","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["gtins"],"properties":{"gtins":{"type":"array","maxItems":100,"items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Cada item responde por si; um código problemático não derruba os outros.","content":{"application/json":{"schema":{"type":"object","properties":{"itens":{"type":"array","items":{"$ref":"#/components/schemas/Resposta"}},"recusados":{"type":"integer","description":"Quantos não couberam no plano."}}}}}}}}},"/v1/sincronizar":{"post":{"summary":"Baixa o catálogo para a base local do ERP","description":"Sem `desde`, devolve tudo. Com `desde`, só o que mudou. NUNCA consulta fonte externa: lê apenas a base própria.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["gtins"],"properties":{"gtins":{"type":"array","maxItems":5000,"items":{"type":"string"}},"desde":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"200":{"description":"Catálogo, com as quatro situações separadas.","content":{"application/json":{"schema":{"type":"object","properties":{"sincronizado_em":{"type":"string","format":"date-time"},"incremental":{"type":"boolean"},"itens":{"type":"array","items":{"type":"object"}},"nao_encontrados":{"type":"array","items":{"type":"string"},"description":"NÃO TEMOS o produto. Significa isto e só isto."},"recusados":{"type":"array","items":{"type":"string"},"description":"Temos, mas o plano acabou. NÃO apague do catálogo local."},"codigos_internos":{"type":"array","items":{"type":"object"}},"resumo":{"type":"object"}}}}}}}}},"/v1/saude":{"get":{"summary":"Estado do serviço e tamanho do acervo","security":[],"responses":{"200":{"description":"ok"}}}}}}