Proffer Iconproffer
API Hub

Guias de Integração

Manual profundo para desenvolvedores. Entenda os conceitos arquiteturais, regras de segurança e tratamento de erros para uma integração impecável.

Conceitos Técnicos

Glossário de Dados

EAN, codrede, zonapreco, PMC e termos técnicos cruciais.

Quick Start (5 min)

Faça sua primeira chamada autenticada em minutos.

Infraestrutura & Segurança

Autenticação JWT

Login, refresh token e renovação automática.

Rate Limits

Limites de requisições, backoff exponencial e throughput.

Tratamento de Erros

Códigos HTTP e estratégias robustas de debugging.

Dicionário de Dados

O esquema oficial de dados esperado pela inteligência da Proffer. Válido tanto para o payload da API REST quanto para as colunas dos arquivos SFTP.

Objeto: Produto

CampoTipoObrig.ExemploDescrição
codprodutobigintSim5155Código interno do produto no ERP
codlojabigintSim23Código da loja/filial
eanbigintSim7891058011222EAN principal do produto
descricaotextSimNOVALGINA 1G 4CPRDescrição completa do produto
imprimeetiquetatextSimSImprime etiqueta? (S/N)
custodoubleSim4,82Custo da última entrada (custo unitário)
customediodoubleSim4,83Custo médio do produto
pmcdoubleSim7,00Preço máximo ao consumidor. NULL se não houver.
precoregulardoubleSim5,80Preço regular unitário praticado
estoquebigintSim150Estoque atual do produto em loja
departamentotextNãoETICO OTCAgregação máxima. Omitir se usar o GC da Proffer.
categoriatextNãoDOR E FEBRE OTCSegundo nível. Omitir se usar o GC da Proffer.
subcategoriatextNãoDOR E FEBRE OTCTerceiro nível. Omitir se usar o GC da Proffer.
segmentotextNãoANALGESICO OTCQuarto nível. Omitir se usar o GC da Proffer.
subsegmentotextNãoANALGESICO OTCQuinto nível. Omitir se usar o GC da Proffer.
familiaprecotextNãoNOVALGINA 1G 4CPRFamília de preços. NULL se não houver.
precopromocionaldoubleNão5,30Preço promocional unitário
zonaprecointNão1Código da zona de preço. Sem diferenciação = 1.
zonaprecodescricaotextNãoZONA NORTEDescrição da zona de preço
qtdembalagemintNão6Quantidade de itens na embalagem
unidmedembalagemtextNãoCPRUnidade de medida da embalagem
formulacaotextNãoFormulação do produto
estadotextNãoSPUF da loja
cnpjtextNão06.990.590/0005-57CNPJ da loja

Objeto: Transação (Venda/Devolução)

CampoTipoObrig.ExemploDescrição
codprodutobigintSim5155Código interno do produto
eanbigintSim7891058011222EAN principal do produto
pbmtextSimNÉ PBM? (S/N)
farmaciapopulartextSimNFarmácia Popular? (S/N)
idtipovendabigintSim11=Regular · 2=Promocional · 3=Queimão · 4=Farm. Popular · 5=PBM · 6=Devolução · 7=Convênio · 8=Outros
datavendadateSim2025-03-05Data da venda (YYYY-MM-DD)
codlojabigintSim23Código da loja
custodoubleSim4,82Custo apurado na venda (custo unitário)
pmcdoubleSim7,00PMC na data da venda. NULL se não houver.
precovendadoubleSim5,80Preço unitário efetivo de venda
qtdvendidabigintSim3Quantidade vendida. Negativo para devoluções.
impostosdoubleSim0,43Valor do imposto total cobrado na operação
cidadetextSimSão PauloCidade onde a transação ocorreu
codcidadeintSim3550308Código IBGE da cidade
estadotextSimSPEstado onde a transação ocorreu
idtransacaobigintSim48536678ID único da transação no ERP
desctipovendatextNãoRegularDescrição do tipo de venda
precoregulardoubleNão5,80Preço regular na data da venda
precopromocionaldoubleNão5,30Preço promocional na data
receita_liquidadoubleNão15,47Total da receita (precovenda × qtd − impostos). Calculado automaticamente se omitido.
margembrutadoubleNão0,34Margem bruta. Calculada automaticamente se omitida.
codestadointNão35Código IBGE do estado
canalvendatextNãoLoja_FisicaCanal de venda
zonaprecointNão1Código da zona de preço
zonaprecodescricaotextNãoZona NorteDescrição da zona de preço
estoqueintNão15Estoque remanescente pós-venda
cnpjtextNão06.990.590/0005-57CNPJ da loja vendedora

Conceitos de Negócio (Glossário)

EANEuropean Article Number — código de barras de 13 dígitos que identifica unicamente um produto.
codredeCódigo da rede de farmácias. Agrupa todas as lojas (codloja) de um mesmo grupo.
codlojaCódigo de uma filial/loja individual dentro da rede.
codprodutoID interno do produto no ERP do parceiro. Pode ser diferente do EAN.
zonaprecoAgrupamento geográfico de lojas que compartilham o mesmo preço. Ex: ZONA_SP_CAPITAL.
PMCPreço Máximo ao Consumidor — preço regulatório máximo para medicamentos.
precovendaPreço líquido efetivamente cobrado do cliente na transação.
precosugeridoCampo principal da otimização — preço recomendado pela IA para maximizar margem/competitividade.
D-1Dados do dia anterior. Transações devem ser enviadas com frequência D-1 (ontem).
JWTJSON Web Token — token de autenticação com validade de 1 hora. Use o refresh_token para renovar.

Autenticação JWT

A API utiliza arquitetura robusta via AWS Cognito. A vida útil do access_token é de 1 hora.

1. Handshake Inicial

POST /auth/login com credenciais. Receba tokens de acesso e refresh.

2. Autorização

Adicione o header Authorization: Bearer {token} nas rotas privadas.

3. Renovação (Refresh)

Se o status 401 surgir, chame POST /auth/refresh imediatamente.

4. Validação Proativa

Avalie o tempo de vida (exp) no payload do JWT antes de disparar o request.

Rate Limits e Boas Práticas

Limites definidos para assegurar a alta disponibilidade da infraestrutura (WAF e API Gateway).

Limites Operacionais

  • Operações Leves (Consultas): 50 requests/segundo.
  • Operações Pesadas (Ingestão): 10 requests/segundo.

Estratégia de Retry

Recebeu 429 Too Many Requests? Não derrube a conexão. Implemente Exponential Backoff (aguarde 1s, depois 2s, depois 4s).

Otimização de Lotes

Maximizar throughput: envie matrizes JSON de até 1.000 objetos por request ao invés de requisições isoladas por registro.

Tratamento de Erros

HTTP 400Bad Request

Falha na validação do Payload (ex: campos obrigatórios ausentes ou tipos incorretos).

HTTP 401Unauthorized

Token expirado ou ausente. Requisição barrada no API Gateway.

HTTP 403Forbidden

Credenciais válidas, mas sem autorização de escopo para a codrede enviada.

HTTP 422Unprocessable

Payload com formato JSON correto, mas sem lógica semântica (ex: EAN inválido).

HTTP 429Too Many

Gatilho de proteção ativado. Reduza a concorrência.

HTTP 500Server Error

Falha na nossa nuvem. A operação não foi concluída.

Quick Start Code

O ciclo de vida completo (Auth, Envio e Consumo) em poucas linhas de Python.

Python
# Quick Start — Proffer Parceiros API (Python)
#
# Sandbox e Produção são ambientes distintos:
#   Sandbox: https://sandbox.apiproffer.com/parceiros  ← testes, credenciais sandbox
#   Produção: https://parceiros.apiproffer.com/parceiros ← dados reais, credenciais do parceiro

import requests

BASE = "https://sandbox.apiproffer.com/parceiros"

# 1. Autenticar
response = requests.post(
    f"{BASE}/auth/login",
    json={"email": "erp+sandbox@proffer.com.br", "password": "erpsandbox"}
)
token = response.json()["access_token"]

# 2. Enviar mix de produtos
headers = {"Authorization": f"Bearer {token}"}

produtos = [
    {
        "codproduto": 5155,
        "codloja": 23,
        "ean": 7891058011222,
        "descricao": "NOVALGINA 1G 4CPR",
        "imprimeetiqueta": "S",
        "custo": 4.82,
        "customedio": 4.83,
        "pmc": 7.00,
        "precoregular": 5.80,
        "estoque": 150,
        "estado": "SP"
    }
]

r = requests.post(f"{BASE}/integracao/produto", json=produtos, headers=headers)
print(r.json())

# 3. Ler recomendações de preço
r = requests.get(
    f"{BASE}/otimizacao/recomendacoes",
    headers=headers,
    params={"per_page": 10}
)
for rec in r.json()["data"]:
    print(f"{rec['descricao']}: R$ {rec['precosugerido']}")
Testar rotas no Playground