x-api-key
Integração externa oficial
Conecte ERP, PDV ou sistema de mercado ao repor
Este guia foi feito para o desenvolvedor integrar com o repor de forma segura, objetiva e sem adivinhação. Aqui você encontra os ambientes corretos, o fluxo recomendado, os endpoints disponíveis, exemplos por linguagem e os cuidados operacionais para homologação e produção.
eventId obrigatório
Antes de começar
O que o integrador precisa ter para a integração funcionar
Se você é o programador responsável pela integração, confirme estes pontos primeiro. Isso evita perda de tempo com testes em ambiente certo, payload errado ou expectativa incorreta sobre o que o repor recebe.
Checklist mínimo
- Conta do mercado com Integração Externa ativada no app.
- x-api-key gerada pelo administrador do mercado.
- JWT de administrador para consultar setores e configuração.
- Setores já criados no repor para obter
sectorIdválido. - Sistema do mercado com capacidade de fazer requisições HTTP.
- Venda ou estoque identificado por EAN e quantidade.
Como isso roda na prática
- Terminal, curl e Postman são apenas para homologação técnica.
- A operação real deve rodar no backend, ERP, PDV ou retaguarda do cliente.
- O leitor de código de barras não integra sozinho: quem integra é o sistema que registra a venda.
- O sistema do cliente deve chamar os endpoints de
products/upsert,batches/syncesales.
Leitura rápida para não perder tempo
Se o sistema do mercado não consegue enviar requisições HTTP, não consegue expor o
EAN vendido ou não permite customização/integradores, a integração não
será automática. O repor está pronto para receber os dados; o sistema externo
também precisa estar apto a enviá-los.
Ambientes
Use homologação para testes e produção apenas para operação real
A integração externa do repor possui ambientes separados. Sempre valide a implementação em homologação antes de apontar o sistema para produção.
https://api-hml.repor.app
- Ambiente público para testes técnicos com ERP, PDV e sistemas parceiros.
- Ideal para validar autenticação, payloads, idempotência e cenários de erro.
- Não afeta a operação real do mercado.
- Dados podem ser ajustados ou reiniciados pela equipe do repor.
https://api.repor.app
- Use apenas após homologação concluída e validada.
- Afeta dados reais do mercado e a rotina operacional do app.
- Exige chave e massa de dados próprias de produção.
- Não use payloads de teste ou eventos experimentais neste ambiente.
Regra prática
Se você está ajustando payloads, validando retorno da API ou testando a integração pela primeira vez, use homologação. Produção deve receber apenas tráfego validado.
Arquitetura
Como a integração funciona hoje
O que já funciona
- Receber catálogo de produtos por EAN.
- Receber packs ou lotes com quantidade, validade e setor.
- Receber vendas para baixa automática de quantidade.
- Permitir operação manual no app mesmo com integração ativa.
- Tratar reenvio de eventos com idempotência por
eventId.
O que não faz hoje
- Enviar cadastro manual do repor de volta para o ERP.
- Sincronizar automaticamente setores criados fora do repor.
- Operar como integração bidirecional completa.
Passo a passo
Fluxo recomendado para iniciar uma integração
Ative a integração no repor
No app, acesse Ajustes > Integração Externa e ative a integração do mercado.
Gere a chave
Um administrador do repor deve gerar a chave de integração do mercado.
Consulte os setores do mercado
Use GET /markets/current/integration/sectors com JWT de administrador para descobrir os sectorId válidos.
Valide a conectividade
Faça um GET /integrations/status com x-api-key no ambiente correto.
Sincronize produtos
Envie o catálogo por EAN usando POST /integrations/products/upsert.
Sincronize packs
Envie lotes com externalId, validade, quantidade e sectorId.
Envie vendas
Ao vender no caixa, envie o evento para POST /integrations/sales para baixa automática.
Promova para produção
Após validar tudo em homologação, troque a base URL e a chave para produção.
Autenticação
Há dois tipos de acesso envolvidos
| Tipo | Uso | Como autentica |
|---|---|---|
| Administrador do repor | Ativar integração, consultar configuração e gerar chave. | Authorization: Bearer <jwt-admin> |
| Sistema externo | Enviar produtos, packs e vendas para o repor. | x-api-key: <chave> |
Checklist
Pré-requisitos antes da primeira chamada
1. Mercado com integração ativa
Sem isso, a API externa não deve ser usada como pronta para operação.
2. Chave gerada
A x-api-key deve ficar apenas no backend do integrador.
3. Setores existentes no repor
Os packs exigem sectorId válido. Consulte GET /markets/current/integration/sectors antes do primeiro batches/sync.
4. Estratégia de eventId
Use um identificador único por evento para evitar duplicidade no reenvio.
Endpoints
Use os filtros para focar apenas no que interessa
/markets/current/integrationRetorna a configuração atual da integração do mercado autenticado.
Auth: Authorization: Bearer <jwt-admin>
/markets/current/integrationAtiva ou desativa a integração e ajusta preferências do mercado.
Body: { enabled, realtimeUpdates?, syncIntervalSeconds?, soldOutLabel?, providerName? }
/markets/current/integration/rotate-keyGera uma nova chave de integração para o sistema externo.
Resposta: { apiKey, integration }
/markets/current/integration/sectorsLista os setores válidos do mercado para o integrador obter o sectorId correto.
Auth: Authorization: Bearer <jwt-admin>
Resposta: { sectors: [{ id, name, defaultAlertDays, description }] }
/me/snapshotÚtil para consultar dados internos do mercado, inclusive setores e respectivos IDs, mas o endpoint preferencial para integração é /markets/current/integration/sectors.
/integrations/statusHealthcheck da integração. Use para validar se a chave está correta.
Header: x-api-key
/integrations/products/upsertCria ou atualiza produtos do catálogo do repor por EAN.
Header: x-api-key
Limite: até 500 produtos por chamada.
/integrations/batches/syncCria ou atualiza packs ou lotes do repor.
Header: x-api-key
Chave externa: externalId
/integrations/salesEnvia vendas para o repor dar baixa automática nas quantidades por EAN.
Header: x-api-key
Limite: até 500 itens por chamada.
Payloads
Contratos oficiais
Ativar integração
{
"enabled": true,
"realtimeUpdates": true,
"syncIntervalSeconds": 15,
"soldOutLabel": "Esgotado",
"providerName": "ERP Mercado X"
}
Setores da integração
{
"sectors": [
{
"id": "6264f55f-961f-4c55-8bd0-6678380c7933",
"name": "Mercearia",
"defaultAlertDays": 30,
"description": "Setor principal"
}
]
}
Produtos
{
"eventId": "products-2026-06-20-001",
"products": [
{
"externalId": "PROD-001",
"ean": "7890000000123",
"name": "Iogurte natural 170g",
"brand": "Marca X",
"unit": "un"
}
]
}
Packs ou lotes
{
"eventId": "batches-2026-06-20-001",
"batches": [
{
"externalId": "LOT-0001",
"ean": "7890000000123",
"productName": "Iogurte natural 170g",
"quantity": 12,
"expirationDate": "2026-07-15",
"sectorId": "UUID_DO_SETOR_NO_REPOR",
"alertLeadDays": 30
}
]
}
Vendas
{
"eventId": "sale-2026-06-20-001",
"soldAt": "2026-06-20T14:03:00.000Z",
"items": [
{
"ean": "7890000000123",
"quantity": 2
}
]
}
Exemplos por linguagem
Filtre para ver apenas o exemplo que você precisa
Node.js com fetch
const response = await fetch(
"https://api-hml.repor.app/integrations/products/upsert",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.REPOR_API_KEY
},
body: JSON.stringify({
eventId: "products-2026-06-20-001",
products: [
{
externalId: "PROD-001",
ean: "7890000000123",
name: "Iogurte natural 170g",
brand: "Marca X",
unit: "un"
}
]
})
}
);
const data = await response.json();
console.log(data);
Node.js com Axios
const axios = require("axios");
async function syncProducts() {
const { data } = await axios.post(
"https://api-hml.repor.app/integrations/products/upsert",
{
eventId: "products-2026-06-20-001",
products: [
{
externalId: "PROD-001",
ean: "7890000000123",
name: "Iogurte natural 170g",
brand: "Marca X",
unit: "un"
}
]
},
{
headers: {
"x-api-key": process.env.REPOR_API_KEY
}
}
);
console.log(data);
}
syncProducts();
PHP com cURL
$payload = [
"eventId" => "products-2026-06-20-001",
"products" => [
[
"externalId" => "PROD-001",
"ean" => "7890000000123",
"name" => "Iogurte natural 170g",
"brand" => "Marca X",
"unit" => "un"
]
]
];
$ch = curl_init("https://api-hml.repor.app/integrations/products/upsert");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"x-api-key: " . getenv("REPOR_API_KEY")
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Python com requests
import os
import requests
payload = {
"eventId": "products-2026-06-20-001",
"products": [
{
"externalId": "PROD-001",
"ean": "7890000000123",
"name": "Iogurte natural 170g",
"brand": "Marca X",
"unit": "un"
}
]
}
response = requests.post(
"https://api-hml.repor.app/integrations/products/upsert",
json=payload,
headers={"x-api-key": os.getenv("REPOR_API_KEY")}
)
print(response.status_code)
print(response.json())
Respostas esperadas
Leitura rápida dos retornos da API
| Status | Significado | Como tratar |
|---|---|---|
200 |
Consulta processada com sucesso. | Seguir normalmente. |
202 processed |
Evento recebido e processado. | Marcar como concluído no sistema de origem. |
202 duplicate |
O mesmo eventId já foi processado antes. |
Não reenviar o mesmo evento como se fosse falha crítica. |
202 ignored |
Não havia pack elegível para aplicar a baixa. | Registrar para auditoria e revisar saldo ou EAN de origem. |
401 |
Chave ausente, inválida ou desatualizada. | Revisar x-api-key e o ambiente usado. |
422 |
Payload inválido. | Corrigir os dados antes de reenviar. |
Erros comuns
Os retornos mais frequentes durante a implantação
401 Unauthorized
Acontece quando a x-api-key está ausente, inválida ou pertence a outro ambiente.
422 Unprocessable Entity
Ocorre quando o payload não segue o contrato esperado, como EAN inválido, data fora do formato ou campo obrigatório faltando.
202 duplicate
Não é erro operacional. Significa que o mesmo eventId já foi processado anteriormente.
202 ignored
O evento foi recebido, mas não havia pack compatível para aplicar a baixa automática.
Segurança
Boas práticas para integrar com segurança
Faça
- Armazene a
x-api-keyapenas no backend do integrador. - Use homologação antes de apontar para produção.
- Crie um
eventIdúnico por evento enviado. - Registre logs internos do seu lado para auditoria e retentativa.
- Rotacione a chave se houver qualquer suspeita de exposição.
Não faça
- Não exponha a chave em frontend, app público ou código cliente.
- Não compartilhe a chave em print de tela, issue pública ou repositório.
- Não teste produção com massa artificial ou dados de homologação.
- Não use o mesmo segredo operacional em homologação e produção.
- Não trate
202 duplicatecomo falha crítica.
Transparência importante
Esta documentação foi escrita para ser útil ao integrador sem expor segredos reais, credenciais operacionais ou detalhes internos desnecessários de infraestrutura. Use sempre credenciais próprias, segregação por ambiente e armazenamento seguro do lado servidor.
FAQ técnico
Dúvidas frequentes
Qual ambiente devo usar primeiro?
Homologação: https://api-hml.repor.app.
Quando uso produção?
Somente após validar autenticação, produtos, packs e vendas em homologação.
O repor envia cadastro manual de volta para o ERP?
Não hoje. O fluxo atual é de entrada de dados do sistema externo para o repor.
Qual identificador usar para produtos?
O principal identificador de produto é o EAN.
Qual identificador usar para packs?
O principal identificador externo é o externalId do lote ou pack.