3. Recebimento de Informações vindas do ERP¶
URL base nos exemplos
O host https://api.retailportal.com é apenas ilustrativo; use o URL base da API fornecido pela EVOT. Detalhes no Guia de Início.
A API ERP do Portal Retail fornece 9 endpoints principais, com grande foco no recebimento de dados em lote (Batch). Essa estruta assíncrona garante alta performance ao receber informações e atualizações massivas diretamente do seu sistema ERP.
3.1 Visão Geral de Todos os Endpoints¶
| Recurso | Criação Individual | Criação Batch | Atualização Individual | Atualização Batch | Consulta Última Data |
|---|---|---|---|---|---|
| Produtos | POST /product |
POST /product/batch |
PUT /product |
PUT /product/batch |
GET /product/get-latest-integration |
| Estoque | POST /stock |
POST /stock/batch |
PUT /stock |
PUT /stock/batch |
GET /stock/get-latest-integration |
| Vendas Diárias | POST /daily-sale |
POST /daily-sale/batch |
PUT /daily-sale |
PUT /daily-sale/batch |
GET /daily-sale/get-latest-integration |
| Vendas Mensais | POST /month-sale |
POST /month-sale/batch |
PUT /month-sale |
PUT /month-sale/batch |
GET /month-sale/get-latest-integration |
| Lojas | POST /store |
POST /store/batch |
PUT /store |
PUT /store/batch |
GET /store/get-latest-integration |
| Fornecedores | POST /supplier |
POST /supplier/batch |
PUT /supplier |
PUT /supplier/batch |
GET /supplier/get-latest-integration |
| Medicamentos (Prescrição) | POST /product-prescriber |
POST /product-prescriber/batch |
PUT /product-prescriber |
PUT /product-prescriber/batch |
GET /product-prescriber/get-latest-integration |
| Grupos de Compra | POST /purchase-group |
POST /purchase-group/batch |
PUT /purchase-group |
PUT /purchase-group/batch |
GET /purchase-group/get-latest-integration |
| Documentos de Loja | POST /store-document |
POST /store-document/batch |
PUT /store-document |
PUT /store-document/batch |
GET /store-document/get-latest-integration |
3.2 Endpoint: PRODUTOS (ErpProduct)¶
3.2.1 Criar Produto (Individual)¶
Endpoint: POST /erp-data/product
Status HTTP:
- Sucesso: 201 Created
- Erro de validação: 400 Bad Request
- Não autorizado: 401 Unauthorized
- Erro interno: 500 Internal Server Error
Descrição: Cria um novo produto individual. Use este endpoint para produtos isolados ou testes.
3.2.1.1 Campos disponíveis (Product)¶
Os endpoints POST /erp-data/product e PUT /erp-data/product usam os mesmos campos, com exceção de id que é obrigatório no PUT.
Nos endpoints em lote (POST /erp-data/product/batch e PUT /erp-data/product/batch), cada item do array products segue exatamente a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpId |
string |
Identificador do produto no ERP. Não enviar vazio/nulo. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
ncmCode |
string |
Código NCM fiscal do produto. |
status |
string |
Status do produto no ERP (ex.: Active, Inactive). |
ean |
string |
Código de barras EAN do produto. |
description |
string |
Descrição principal do produto. |
internalDescription |
string |
Descrição interna/operacional. |
webName |
string |
Nome exibido no canal web. |
specification |
string |
Especificações técnicas/comerciais. |
metaDescription |
string |
Texto de apoio para SEO/metadata. |
weightGr |
decimal |
Peso em gramas (>= 0). |
lengthCm |
decimal |
Comprimento em centímetros (>= 0). |
widthCm |
decimal |
Largura em centímetros (>= 0). |
heightCm |
decimal |
Altura em centímetros (>= 0). |
ipi |
bool |
Indica incidência de IPI. |
dun |
string |
Código DUN (embalagem logística). |
purchaseGroup |
string |
Nome do grupo de compra. |
purchaseGroupId |
string |
Identificador do grupo de compra no ERP. |
purchaseStatus |
string |
Status do fluxo de compras. |
brand |
string |
Marca/fabricante comercial do produto. |
sku |
string |
SKU do produto no ERP. |
taxClassification |
string |
Classificação tributária do produto. |
boxQuantity |
string |
Quantidade por caixa. |
displayQuantity |
string |
Quantidade para exposição/display. |
billingQuantity |
string |
Quantidade usada para faturamento. |
activePrinciple |
string |
Princípio ativo do medicamento. |
healthRegistrationReason |
string |
Motivo/observação do registro sanitário. |
manufacturerCorporateName |
string |
Razão social do fabricante. |
manufacturerName |
string |
Nome fantasia do fabricante. |
manufacturerCnpj |
string |
CNPJ do fabricante. |
keywords |
string |
Palavras-chave de busca. |
embed |
string |
Conteúdo incorporado/referência externa. |
indication |
string |
Indicações de uso. |
contraindication |
string |
Contraindicações do produto. |
minimumPurchaseMultiple |
int |
Múltiplo mínimo de compra. |
healthRegistration |
string |
Número de registro sanitário. |
medicalPrescriptionType |
string |
Tipo de exigência de prescrição médica. |
productSeasonality |
string |
Descrição de sazonalidade do produto. |
productSeasonalityId |
string |
Identificador de sazonalidade no ERP. |
hasRegistration |
bool |
Indica se o produto possui registro regulatório. |
continuousUse |
bool |
Indica se é produto de uso contínuo. |
controlledSale |
bool |
Indica venda controlada. |
retainsMedicalPrescription |
bool |
Indica retenção de prescrição na venda. |
activeIngredient |
string |
Substância/ingrediente ativo principal. |
therapeuticIndicationId |
int |
Identificador da indicação terapêutica. |
taxExempt |
int |
Flag/código de isenção fiscal. |
pisCofinslistId |
int |
Identificador de enquadramento PIS/COFINS. |
seasonalityId |
int |
Identificador numérico da sazonalidade. |
billingQty |
int |
Quantidade usada para regra de faturamento. |
legalBasis |
string |
Base legal/regulatória associada. |
packagingQtyDun |
int |
Quantidade de embalagem para o DUN. |
dcbCode |
string |
Código DCB (Denominação Comum Brasileira). |
keyWord |
string |
Palavra-chave adicional de indexação. |
presentation |
int |
Código da apresentação comercial. |
productPackage |
int |
Código/tipo de embalagem do produto. |
scale |
string |
Escala/categoria de classificação interna. |
intelligenceFamily |
string |
Família de inteligência/categorização analítica. |
webDepartment |
string |
Departamento no canal web. |
section |
string |
Seção de navegação/catálogo. |
filter |
string |
Filtro/categorização complementar. |
Requisição:
POST https://api.retailportal.com/erp-data/product HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpId": "12345",
"ncmCode": "84733090",
"status": "Active",
"ean": "7896045000001",
"description": "Dipirona 500mg Cápsulas",
"internalDescription": "Genérico - Analgésico",
"brand": "Genérico",
"sku": "SKU-DIPO-500-001",
"healthRegistration": "61541"
}
Resposta de Sucesso (201 Created):
{
"success": true,
"id": 98765,
"message": "Produto criado com sucesso",
"description": "Dipirona 500mg Cápsulas"
}
Resposta de Erro (400 Bad Request):
{
"success": false,
"errors": [
"Field 'ncmCode' is required",
"Field 'description' must not be empty"
],
"message": "Validation failed"
}
3.2.2 Criar Produtos em Lote¶
Endpoint: POST /erp-data/product/batch
Status HTTP:
- Sucesso (enfileirado): 202 Accepted
- Erro de validação: 400 Bad Request
- Não autorizado: 401 Unauthorized
- Erro interno: 500 Internal Server Error
Descrição: Enfileira múltiplos produtos para processamento assíncrono. Use para sincronizações periódicas com muitos itens.
Fluxo:
- Validação imediata (< 1 segundo)
- Enfileiramento para processamento assíncrono
- Resposta com jobId
- Processamento em background (até 5 minutos)
- Consulte status com GET /batch-job-report/{jobId}
Requisição:
POST https://api.retailportal.com/erp-data/product/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"products": [
{
"erpId": "12345",
"ncmCode": "84733090",
"status": "Active",
"ean": "7896045000001",
"description": "Dipirona 500mg"
},
{
"erpId": "12346",
"ncmCode": "84733091",
"status": "Active",
"ean": "7896045000002",
"description": "Ibuprofeno 600mg"
}
]
}
Resposta de Sucesso (202 Accepted):
{
"message": "Batch received and will be processed asynchronously",
"jobId": "batch-job-1234567890",
"totalItems": 2
}
Resposta de Erro (400 Bad Request):
{
"message": "Validation failed at item 1",
"totalItems": 2,
"invalidItems": 1,
"itemErrors": [
{
"index": 1,
"errors": ["Field 'ncmCode' is required"]
}
]
}
3.2.3 Atualizar Produto (Individual)¶
Endpoint: PUT /erp-data/product
Status HTTP:
- Sucesso: 200 OK
- Erro de validação: 400 Bad Request
- Produto não encontrado: 404 Not Found
- Não autorizado: 401 Unauthorized
Descrição: Atualiza um produto existente. Requer envio do ErpId.
Requisição:
PUT https://api.retailportal.com/erp-data/product HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpId": "12345",
"description": "Dipirona 500mg - Atualizado",
"status": "Inactive",
"brand": "Genérico Premium"
}
Resposta de Sucesso (200 OK):
{
"success": true,
"id": 98765,
"message": "Produto atualizado com sucesso",
"description": "Dipirona 500mg - Atualizado"
}
3.2.4 Atualizar Produtos em Lote¶
Endpoint: PUT /erp-data/product/batch
Status HTTP:
- Sucesso (enfileirado): 202 Accepted
- Erro de validação: 400 Bad Request
Requisição:
PUT https://api.retailportal.com/erp-data/product/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"products": [
{
"erpId": "12345",
"status": "Inactive"
},
{
"erpId": "12346",
"brand": "Novo Fabricante"
}
]
}
Resposta (202 Accepted):
{
"message": "Batch received and will be processed asynchronously",
"jobId": "batch-job-1234567891",
"totalItems": 2
}
3.2.5 Obter Última Data de Integração¶
Endpoint: GET /erp-data/product/get-latest-integration
Status HTTP:
- Sucesso: 200 OK
- Não autorizado: 401 Unauthorized
Descrição: Retorna a data e hora da última sincronização de produtos bem-sucedida. Use para sincronizar apenas produtos modificados desde a última integração.
Requisição:
GET https://api.retailportal.com/erp-data/product/get-latest-integration HTTP/1.1
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
Resposta (200 OK):
{
"classType": "ErpProduct",
"id": 1,
"erpId": 0,
"lastOperation": "Create",
"lastDateTime": "2024-12-06T15:30:45.123Z"
}
Interpretação:
lastOperation— Última operação realizada (Create, Update)lastDateTime— Data/hora UTC da última integração bem-sucedida- Use para sincronizações incrementais: busque no ERP todos os produtos modificados APÓS este timestamp
3.3 Endpoint: ESTOQUE (ErpStock)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/stock |
| Criar lote | POST /erp-data/stock/batch |
| Atualizar | PUT /erp-data/stock |
| Atualizar lote | PUT /erp-data/stock/batch |
| Última integração | GET /erp-data/stock/get-latest-integration |
3.3.1 Campos disponíveis (Stock)¶
Os endpoints POST /erp-data/stock e PUT /erp-data/stock usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/stock/batch e PUT /erp-data/stock/batch), cada item do array stocks segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpStoreId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
erpProductId |
string |
Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
currentStock |
decimal |
Quantidade atual em estoque. Deve ser maior ou igual a zero. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
warehouseTransit |
decimal |
Quantidade em trânsito no depósito. Opcional; quando enviado deve ser maior ou igual a zero. |
distributionCenterStock |
decimal |
Quantidade disponível no centro de distribuição. Opcional; quando enviado deve ser maior ou igual a zero. |
minimumStock |
decimal |
Estoque mínimo esperado para operação. Opcional; quando enviado deve ser maior ou igual a zero. |
safetyStock |
decimal |
Estoque de segurança para variações de demanda. Opcional; quando enviado deve ser maior ou igual a zero. |
maximumStock |
decimal |
Limite superior de estoque recomendado. Opcional; quando enviado deve ser maior ou igual a zero. |
Exemplo (POST):
POST https://api.retailportal.com/erp-data/stock HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpStoreId": "LOJA-01",
"erpProductId": "SKU-001",
"currentStock": 120,
"warehouseTransit": 15,
"distributionCenterStock": 40,
"minimumStock": 20,
"safetyStock": 30,
"maximumStock": 200
}
3.3.2 Batch (stock) (POST /erp-data/stock/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade **stocks (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.3.1**.
- Nomes em camelCase (
stocks,erpStoreId,currentStock, etc.). - O array
**stocksnão pode sernullnem vazio; caso contrário a API retorna 400**. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/stock/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"stocks": [
{
"erpStoreId": "LOJA-01",
"erpProductId": "SKU-001",
"currentStock": 120,
"warehouseTransit": 15,
"distributionCenterStock": 40
},
{
"erpStoreId": "LOJA-01",
"erpProductId": "SKU-002",
"currentStock": 85,
"minimumStock": 20,
"safetyStock": 25,
"maximumStock": 180
}
]
}
3.4 Endpoint: VENDAS DIÁRIAS (ErpDailySales)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/daily-sale |
| Criar lote | POST /erp-data/daily-sale/batch |
| Atualizar | PUT /erp-data/daily-sale |
| Atualizar lote | PUT /erp-data/daily-sale/batch |
| Última integração | GET /erp-data/daily-sale/get-latest-integration |
3.4.1 Campos disponíveis (Daily sales)¶
Os endpoints POST /erp-data/daily-sale e PUT /erp-data/daily-sale usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/daily-sale/batch e PUT /erp-data/daily-sale/batch), cada item do array dailySales segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpProductId |
string |
Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
erpStoreId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
quantity |
decimal |
Quantidade vendida; deve ser maior que zero. |
totalSellValue |
decimal |
Valor total da venda; deve ser maior ou igual a zero. |
date |
datetime |
Instantâneo da venda em UTC explícito, dentro da faixa válida (não pode ser MinValue/MaxValue). Ver Formato de date abaixo. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Formato de date (obrigatório ler)¶
A API valida que o valor recebido represente um instante em UTC explícito (data/hora com fuso indicado como UTC no payload).
- Não use apenas a data civil no formato
YYYY-MM-DD(ex.:"2026-04-01"). Muitos clientes JSON interpretam isso como instante sem fuso definido (não UTC), e a validação rejeita com a mensagem: Date deve ser uma data válida em UTC (Kind=Utc) e não pode ser MinValue ou MaxValue. - Use data/hora em ISO 8601 com fuso UTC indicado no texto, por exemplo:
- Meia-noite UTC do dia da venda:
"2026-04-01T00:00:00Z"(o sufixo**Z** é obrigatório neste padrão para marcar UTC). - Ou equivalente com offset zero:
"2026-04-01T00:00:00+00:00".
Para um “dia de venda” sem hora de negócio específica, o padrão recomendado é **YYYY-MM-DDTHH:mm:ssZ** com 00:00:00Z no dia desejado.
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
origin |
string |
Origem da venda (ex.: balcão, canal). Opcional; quando informado, máximo 128 caracteres. |
deliveryMethod |
string |
Modalidade ou método de entrega associado à venda. Opcional; quando informado, máximo 64 caracteres. |
Exemplo (POST):
POST https://api.retailportal.com/erp-data/daily-sale HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpProductId": "SKU-001",
"erpStoreId": "LOJA-01",
"quantity": 12.5,
"totalSellValue": 199.9,
"date": "2025-06-15T12:00:00Z",
"origin": "Balcão",
"deliveryMethod": "Retira"
}
3.4.2 Criar vendas diárias em lote (POST /erp-data/daily-sale/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade **dailySales (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.4.1 (campos obrigatórios e opcionais, inclusive regras de date em UTC — ver Formato de date**).
- Nomes em camelCase (
dailySales,erpProductId,totalSellValue, etc.), como no restante da API ERP. - O array
**dailySalesnão pode sernullnem vazio; caso contrário a API retorna 400**. - Tamanho máximo do lote: 1000 itens por requisição. Ultrapassar o limite gera erro de validação.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/daily-sale/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"dailySales": [
{
"erpProductId": "12345",
"erpStoreId": "123456",
"quantity": 5,
"totalSellValue": 1500,
"date": "2026-04-01T00:00:00Z"
},
{
"erpProductId": "12346",
"erpStoreId": "123456",
"quantity": 2,
"totalSellValue": 80.5,
"date": "2026-04-01T00:00:00Z",
"origin": "Balcão",
"deliveryMethod": "Retira"
}
]
}
O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: produtos em 3.2.2).
3.5 Endpoint: VENDAS MENSAIS (ErpMonthlySales)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/month-sale |
| Criar lote | POST /erp-data/month-sale/batch |
| Atualizar | PUT /erp-data/month-sale |
| Atualizar lote | PUT /erp-data/month-sale/batch |
| Última integração | GET /erp-data/month-sale/get-latest-integration |
3.5.1 Campos disponíveis (Month sales)¶
Os endpoints POST /erp-data/month-sale e PUT /erp-data/month-sale usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/month-sale/batch e PUT /erp-data/month-sale/batch), cada item do array monthSales no JSON segue a mesma estrutura abaixo.
Nota: diferente das vendas diárias (3.4), vendas mensais usam **month e **year** (inteiros); não** existe campo date.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpProductId |
string |
Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
erpStoreId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
quantity |
decimal |
Quantidade vendida no período; deve ser maior que zero. |
totalSellValue |
decimal |
Valor total no período; deve ser maior ou igual a zero. |
month |
int |
Mês de referência (1 a 12). |
year |
int |
Ano de referência (deve ser maior que 1900). |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
origin |
string |
Origem da venda (ex.: canal). Opcional; quando informado, máximo 128 caracteres. |
deliveryMethod |
string |
Modalidade ou método de entrega. Opcional; quando informado, máximo 64 caracteres. |
Exemplo (POST):
POST https://api.retailportal.com/erp-data/month-sale HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpProductId": "SKU-001",
"erpStoreId": "LOJA-01",
"quantity": 120,
"totalSellValue": 4500.5,
"month": 4,
"year": 2026,
"origin": "Balcão",
"deliveryMethod": "Retira"
}
3.5.2 Criar vendas mensais em lote (POST /erp-data/month-sale/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade **monthSales (array). Cada elemento segue a mesma estrutura do POST único em 3.5.1**.
- Nomes em camelCase (
monthSales,erpProductId,totalSellValue,month,year, etc.). - O array
**monthSalesnão pode sernullnem vazio; caso contrário a API retorna 400**. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/month-sale/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"monthSales": [
{
"erpProductId": "12345",
"erpStoreId": "123456",
"quantity": 5,
"totalSellValue": 1500,
"month": 4,
"year": 2026
},
{
"erpProductId": "12346",
"erpStoreId": "123456",
"quantity": 2,
"totalSellValue": 800,
"month": 4,
"year": 2026,
"origin": "E-commerce",
"deliveryMethod": "Entrega"
}
]
}
O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: 3.4.2).
3.6 Endpoint: LOJAS (ErpStore)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/store |
| Criar lote | POST /erp-data/store/batch |
| Atualizar | PUT /erp-data/store |
| Atualizar lote | PUT /erp-data/store/batch |
| Última integração | GET /erp-data/store/get-latest-integration |
3.6.1 Campos disponíveis (Store)¶
Os endpoints POST /erp-data/store e PUT /erp-data/store usam os mesmos campos, com exceção de id que é obrigatório no PUT.
Nos endpoints em lote (POST /erp-data/store/batch e PUT /erp-data/store/batch), cada item do array stores segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. |
title |
string |
Nome/título da loja. |
isActive |
bool |
Indica se a loja está ativa. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
taxId |
string |
CNPJ da loja. |
stateRegistration |
string |
Inscrição estadual. |
zipCode |
string |
CEP da loja. |
address |
string |
Endereço da loja. |
number |
string |
Número do endereço. |
complement |
string |
Complemento do endereço. |
performsInjection |
bool |
Indica se a loja realiza aplicação/injeção. |
sellsControlled |
bool |
Indica se a loja vende medicamentos controlados. |
hasPopularFarmacy |
bool |
Indica participação no programa Farmácia Popular. |
latitud |
string |
Latitude geográfica da loja. |
longitud |
string |
Longitude geográfica da loja. |
openingDate |
datetime |
Data de abertura da loja (UTC, dentro da faixa válida). |
storeType |
string |
Tipo/classificação da loja (ex.: Popular, Premium). |
storeSize |
string |
Porte/tamanho da loja (ex.: P, M, G). |
weekdayHours |
string |
Horário de funcionamento em dias úteis. |
saturdayHours |
string |
Horário de funcionamento no sábado. |
sundayHours |
string |
Horário de funcionamento no domingo. |
3.7 Endpoint: FORNECEDORES (ErpSupplier)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/supplier |
| Criar lote | POST /erp-data/supplier/batch |
| Atualizar | PUT /erp-data/supplier |
| Atualizar lote | PUT /erp-data/supplier/batch |
| Última integração | GET /erp-data/supplier/get-latest-integration |
3.7.1 Campos disponíveis (Supplier)¶
Os endpoints POST /erp-data/supplier e PUT /erp-data/supplier usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/supplier/batch e PUT /erp-data/supplier/batch), cada item do array suppliers no JSON segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpSupplierId |
string |
Identificador do fornecedor no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
name |
string |
Nome do fornecedor. Não enviar vazio/nulo. Máximo 256 caracteres. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
type |
string |
Tipo/classificação do fornecedor. Máximo 64 caracteres quando informado. |
taxId |
string |
CNPJ ou documento fiscal principal. Máximo 18 caracteres quando informado. |
stateRegistration |
string |
Inscrição estadual. Máximo 32 caracteres quando informado. |
zipCode |
string |
CEP. Máximo 10 caracteres quando informado. |
address |
string |
Logradouro/endereço. Máximo 512 caracteres quando informado. |
number |
decimal |
Número do endereço; quando informado, deve ser maior ou igual a zero (valor inteiro). |
complement |
string |
Complemento do endereço. Máximo 256 caracteres quando informado. |
neighborhood |
string |
Bairro. Máximo 128 caracteres quando informado. |
city |
string |
Cidade. Máximo 128 caracteres quando informado. |
state |
string |
UF (sigla). Máximo 2 caracteres quando informado. |
Exemplo (POST mínimo):
POST https://api.retailportal.com/erp-data/supplier HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpSupplierId": "FORN-001",
"name": "Distribuidora Exemplo Ltda"
}
3.7.2 Fornecedores em lote (POST /erp-data/supplier/batch / PUT /erp-data/supplier/batch)¶
Formato do corpo (JSON): objeto raiz com a propriedade **suppliers (array de itens no mesmo formato de 3.7.1**).
- O array
**suppliersnão pode sernullnem vazio em operações de lote válidas; caso contrário, 400**. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo — POST batch):
POST https://api.retailportal.com/erp-data/supplier/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"suppliers": [
{
"erpSupplierId": "FORN-001",
"name": "Distribuidora Exemplo Ltda",
"taxId": "12345678000199",
"zipCode": "01310100",
"address": "Av. Paulista",
"number": 1000,
"city": "São Paulo",
"state": "SP"
}
]
}
O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: 3.4.2).
3.8 Endpoint: MEDICAMENTOS COM PRESCRIÇÃO (ErpProductPrescriber)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/product-prescriber |
| Criar lote | POST /erp-data/product-prescriber/batch |
| Atualizar | PUT /erp-data/product-prescriber |
| Atualizar lote | PUT /erp-data/product-prescriber/batch |
| Última integração | GET /erp-data/product-prescriber/get-latest-integration |
3.8.1 Campos disponíveis (Product Prescriber)¶
Os endpoints POST /erp-data/product-prescriber e PUT /erp-data/product-prescriber usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/product-prescriber/batch e PUT /erp-data/product-prescriber/batch), cada item do array productPrescribers segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpProductId |
string |
Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
quantity |
int |
Quantidade do item prescrito. Deve ser maior que zero. |
checkoutDateTime |
datetime |
Data/hora do checkout. Obrigatória, em UTC explícito (Kind=Utc) e dentro de faixa temporal válida. |
prescriberMedicalLicense |
string |
Registro profissional do prescritor. Não enviar vazio/nulo. Máximo 20 caracteres. |
erpStoreId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 128 caracteres. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
prescriberName |
string |
Nome do prescritor. Opcional; quando informado, máximo 128 caracteres. |
state |
string |
UF do prescritor. Opcional; quando informado, máximo 4 caracteres. |
Formato de checkoutDateTime¶
A API valida que checkoutDateTime seja DateTime com Kind = Utc.
- Use ISO 8601 com UTC explícito, por exemplo:
"2026-04-01T00:00:00Z""2026-04-01T00:00:00+00:00"- O valor também precisa cair em uma faixa temporal razoável validada pela API.
Exemplo (POST):
POST https://api.retailportal.com/erp-data/product-prescriber HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpProductId": "12345",
"quantity": 2,
"checkoutDateTime": "2026-04-01T12:00:00Z",
"prescriberMedicalLicense": "CRM123456",
"erpStoreId": "LOJA-001",
"prescriberName": "Dra. Maria",
"state": "SP"
}
3.8.2 Batch (product prescriber) (POST /erp-data/product-prescriber/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade productPrescribers (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.8.1.
- Nomes em camelCase (
productPrescribers,erpProductId,checkoutDateTime, etc.). - O array
productPrescribersnão pode sernullnem vazio; caso contrário a API retorna 400. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/product-prescriber/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"productPrescribers": [
{
"erpProductId": "12345",
"quantity": 2,
"checkoutDateTime": "2026-04-01T12:00:00Z",
"prescriberMedicalLicense": "CRM123456",
"erpStoreId": "LOJA-001",
"prescriberName": "Dra. Maria",
"state": "SP"
},
{
"erpProductId": "12346",
"quantity": 1,
"checkoutDateTime": "2026-04-01T13:00:00Z",
"prescriberMedicalLicense": "CRM654321",
"erpStoreId": "LOJA-002"
}
]
}
3.9 Endpoint: GRUPOS DE COMPRA (ErpPurchaseGroup)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/purchase-group |
| Criar lote | POST /erp-data/purchase-group/batch |
| Atualizar | PUT /erp-data/purchase-group |
| Atualizar lote | PUT /erp-data/purchase-group/batch |
| Última integração | GET /erp-data/purchase-group/get-latest-integration |
3.9.1 Campos disponíveis (Purchase Group)¶
Os endpoints POST /erp-data/purchase-group e PUT /erp-data/purchase-group usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/purchase-group/batch e PUT /erp-data/purchase-group/batch), cada item do array purchaseGroups segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpId |
string |
Identificador do grupo de compra no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. Deve ser único no contexto da integração. |
name |
string |
Nome do grupo de compra. Não enviar vazio/nulo. Máximo 200 caracteres. |
erpSupplierId |
string |
Identificador do fornecedor no ERP associado ao grupo. Não enviar vazio/nulo. Máximo 64 caracteres. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
description |
string |
Descrição complementar do grupo de compra. Opcional; quando informado, máximo 500 caracteres. |
Exemplo (POST):
POST https://api.retailportal.com/erp-data/purchase-group HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpId": "PG-001",
"name": "Grupo de Higiene",
"description": "Grupo para itens de higiene pessoal",
"erpSupplierId": "SUP-0001"
}
3.9.2 Batch (purchase group) (POST /erp-data/purchase-group/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade **purchaseGroups (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.9.1**.
- Nomes em camelCase (
purchaseGroups,erpId,erpSupplierId, etc.). - O array
**purchaseGroupsnão pode sernullnem vazio; caso contrário a API retorna 400**. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/purchase-group/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"purchaseGroups": [
{
"erpId": "PG-001",
"name": "Grupo de Higiene",
"description": "Itens de higiene pessoal",
"erpSupplierId": "SUP-0001"
},
{
"erpId": "PG-002",
"name": "Grupo Dermocosméticos",
"erpSupplierId": "SUP-0002"
}
]
}
3.10 Endpoint: DOCUMENTOS DE LOJA (ErpStoreDocument)¶
| Operação | URL |
|---|---|
| Criar | POST /erp-data/store-document |
| Criar lote | POST /erp-data/store-document/batch |
| Atualizar | PUT /erp-data/store-document |
| Atualizar lote | PUT /erp-data/store-document/batch |
| Última integração | GET /erp-data/store-document/get-latest-integration |
3.10.1 Campos disponíveis (Store Document)¶
Os endpoints POST /erp-data/store-document e PUT /erp-data/store-document usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).
Nos endpoints em lote (POST /erp-data/store-document/batch e PUT /erp-data/store-document/batch), cada item do array storeDocuments segue a mesma estrutura abaixo.
Campos obrigatórios¶
| Campo | Tipo | Descrição |
|---|---|---|
erpStoreId |
string |
Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. |
fileUrl |
string |
URL/identificador do arquivo do documento no ERP. Não enviar vazio/nulo. Máximo 4096 caracteres. |
documentType |
string |
Tipo do documento (ex.: alvará, licença, certificado). Não enviar vazio/nulo. Máximo 128 caracteres. |
id |
long |
Obrigatório apenas no PUT; identifica o registro interno para atualização. |
Campos opcionais¶
| Campo | Tipo | Descrição |
|---|---|---|
issueDate |
datetime |
Data de emissão do documento. Opcional; quando informada, deve estar em UTC explícito (Kind=Utc) e dentro de faixa temporal válida. |
expirationDate |
datetime |
Data de validade do documento. Opcional; quando informada, deve estar em UTC explícito (Kind=Utc) e dentro de faixa temporal válida. Se issueDate também for informado, expirationDate deve ser maior que issueDate. |
Formato de issueDate e expirationDate¶
A API valida que ambas as datas sejam DateTime com Kind = Utc.
- Não use apenas data civil (
YYYY-MM-DD), pois tende a desserializar comoKind=Unspecifiede pode ser rejeitada. - Use ISO 8601 com UTC explícito, por exemplo:
"2026-04-01T00:00:00Z""2026-04-01T00:00:00+00:00"
Além disso:
expirationDatedeve ser estritamente maior queissueDatequando ambas as datas forem informadas.- As datas devem estar dentro da faixa temporal validada pela API.
Exemplo (POST):
POST https://api.retailportal.com/erp-data/store-document HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"erpStoreId": "LOJA-01",
"fileUrl": "https://erp.exemplo.com/documentos/alvara-loja-01.pdf",
"documentType": "ALVARA_FUNCIONAMENTO",
"issueDate": "2026-01-01T00:00:00Z",
"expirationDate": "2027-01-01T00:00:00Z"
}
3.10.2 Batch (store document) (POST /erp-data/store-document/batch)¶
Formato do corpo (JSON): um único objeto raiz com a propriedade storeDocuments (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.10.1.
- Nomes em camelCase (
storeDocuments,erpStoreId,fileUrl, etc.). - O array
storeDocumentsnão pode sernullnem vazio; caso contrário a API retorna 400. - Tamanho máximo do lote: 1000 itens por requisição.
Status HTTP (referência):
- Sucesso (enfileirado): 202 Accepted
- Erro de validação / corpo inválido: 400 Bad Request
- Não autorizado: 401 Unauthorized
Requisição (exemplo):
POST https://api.retailportal.com/erp-data/store-document/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
{
"storeDocuments": [
{
"erpStoreId": "LOJA-01",
"fileUrl": "https://erp.exemplo.com/documentos/alvara-loja-01.pdf",
"documentType": "ALVARA_FUNCIONAMENTO",
"issueDate": "2026-01-01T00:00:00Z",
"expirationDate": "2027-01-01T00:00:00Z"
},
{
"erpStoreId": "LOJA-02",
"fileUrl": "https://erp.exemplo.com/documentos/licenca-loja-02.pdf",
"documentType": "LICENCA_SANITARIA",
"issueDate": "2026-02-01T00:00:00Z",
"expirationDate": "2027-02-01T00:00:00Z"
}
]
}
3.11 Endpoint: RELATÓRIO DE BATCH¶
Endpoint: GET /erp-data/batch-job-report/{jobId}
Status HTTP:
- Sucesso: 200 OK
- Job não encontrado: 404 Not Found
- Não autorizado: 401 Unauthorized
Descrição: Consulta o progresso e status de um trabalho enfileirado. Use após receber HTTP 202 Accepted.
Requisição:
GET https://api.retailportal.com/erp-data/batch-job-report/batch-job-1234567890 HTTP/1.1
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123
Resposta (200 OK) — Em Processamento:
{
"jobId": "batch-job-1234567890",
"entityType": "ErpProduct",
"state": "Processing",
"isComplete": false,
"createdAt": "2024-12-06T10:30:00Z",
"startedAt": "2024-12-06T10:30:02Z",
"completedAt": null,
"duration": null,
"totalItems": 100,
"successCount": 45,
"failureCount": 0,
"retryAttempt": 0,
"hasPartialData": false,
"errorMessage": null
}
Resposta (200 OK) — Concluído com Sucesso:
{
"jobId": "batch-job-1234567890",
"entityType": "ErpProduct",
"state": "Finished",
"isComplete": true,
"createdAt": "2024-12-06T10:30:00Z",
"startedAt": "2024-12-06T10:30:02Z",
"completedAt": "2024-12-06T10:35:15Z",
"duration": "00:05:13",
"totalItems": 100,
"successCount": 100,
"failureCount": 0,
"retryAttempt": 0,
"hasPartialData": false,
"errorMessage": null,
"exceptionDetails": null
}
Resposta (404 Not Found):
Fluxo Típico de Integração¶
1. POST /product/batch com 100 produtos
↓
2. Recebe 202 Accepted + jobId
↓
3. GET /batch-job-report/{jobId} a cada 10 segundos
↓
4. Estado: Enqueued → Processing → Finished
↓
5. Verifica: successCount, failureCount, errorMessage
↓
6. Se sucesso: Próxima sincronização
Se parcial: Analisa erros e reenvia com dados corrigidos
Se falha: Aguarda 5 min e reenviar