API do ERP Connect Mobile
Tudo o que o seu sistema precisa para ler e gravar produtos, estoque, pedidos e notas — e ser avisado quando algo muda.
Visão geral
A API do ERP Connect Mobile liga o seu sistema (ERP, WMS, loja virtual, app de delivery, balança, planilha) ao estoque, aos produtos e aos pedidos da sua empresa no ERP Connect. Ela recebe dados (criar produto, mandar fotos, dar entrada e saída de estoque, criar pedido) e manda dados (listas, avisos automáticos quando algo muda).
- REST + JSON, em português, com HTTPS. Listas também em CSV.
- 69 rotas, 60 campos de produto (cada um com rota própria), até 12 fotos por produto.
- Estoque com lote, validade e local — e funciona com sistemas que só têm "quantidade".
- Avisos automáticos (webhooks) assinados, ou feed de eventos para quem não recebe aviso.
- OpenAPI 3.1 para importar no Postman, Insomnia ou gerar código.
https://app.erpconnectmobile.com.br/api/v1Endereço direto (mesma API): https://aylmiszdvdlpdugkwzql.supabase.co/functions/v1/catalogo-api/v1Primeiros passos
- Gere a chave no app (passo a passo com prints logo abaixo).
- Teste com
GET /v1/status:
curl https://app.erpconnectmobile.com.br/api/v1/status \
-H "Authorization: Bearer erpk_SUA_CHAVE"
const r = await fetch('https://app.erpconnectmobile.com.br/api/v1/produtos?por_pagina=50', {
headers: { Authorization: 'Bearer ' + process.env.ERP_CHAVE },
});
const { dados, paginacao } = await r.json();
import os, requests
r = requests.get('https://app.erpconnectmobile.com.br/api/v1/produtos', params={'por_pagina': 50},
headers={'Authorization': 'Bearer ' + os.environ['ERP_CHAVE']}, timeout=30)
dados = r.json()['dados']
$ch = curl_init('https://app.erpconnectmobile.com.br/api/v1/produtos?por_pagina=50');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('ERP_CHAVE')]]);
$dados = json_decode(curl_exec($ch), true)['dados'];
Gerar a chave no app
Só o dono (administrador) da empresa gera chaves. Cada chave vale para uma empresa e só faz o que você marcar.
- No app, abra Painel › Integrações (ou Minha conta › Integrações).
- Desça até API para outros sistemas, dê um nome (ex.: "Bling" ou "Balança do açougue") e marque as permissões.
- Toque em Gerar chave. A chave aparece uma vez só: copie e guarde num lugar seguro.
- Perdeu ou vazou? Toque em Revogar e gere outra. A antiga para na hora.



Escrita de estoque (estoque:ajustar) e custos (custos:read) vêm desmarcados: marque só se o outro sistema realmente precisa.
Autenticação
Mande a chave em todo pedido, num destes cabeçalhos:
Authorization: Bearer erpk_0123…
X-Api-Key: erpk_0123…
A chave nunca vai na URL (ela ficaria gravada em histórico e logs). Sem chave: 401 sem_chave. Chave errada ou revogada: 401 chave_invalida.
Permissões (escopos)
| Permissão | Nome no app | O que libera |
|---|---|---|
produtos:read | Ler produtos | Cadastro, fotos, códigos de barras, categorias, preços, etiquetas e balança. |
produtos:write escrita | Alterar produtos | Criar e alterar produtos, categorias e códigos de barras. |
fotos:write escrita | Alterar fotos | Enviar, ordenar, trocar a capa e apagar as fotos (até 12 por produto). |
custos:read sensível | Ver custo e margem | Inclui custo médio, último custo e margens nas respostas. Dado sensível. |
estoque:read | Ler estoque | Saldo, reservado, disponível, por local, por lote e validade, movimentos e locais. |
estoque:write escrita | Dar entrada no estoque | Só soma: cria lote novo (com validade, se vier). |
estoque:ajustar escrita sensível | Tirar e acertar estoque | Saída, saldo absoluto e balanço. Tira pela validade mais próxima. |
pedidos:read | Ler pedidos | Pedidos, itens, histórico, cupom, envio e etiqueta de envio. |
pedidos:write escrita | Criar pedidos | Pedido de outro sistema entra em Processados (como venda de marketplace). |
clientes:read | Ler clientes | Cadastro de clientes. |
clientes:write escrita | Alterar clientes | Criar e alterar clientes. |
fornecedores:read | Ler fornecedores | Cadastro de fornecedores. |
fornecedores:write escrita | Alterar fornecedores | Criar e alterar fornecedores. |
notas:read | Ler notas fiscais | NF-e/NFC-e emitidas: dados, chave, XML autorizado. |
financeiro:read sensível | Ler financeiro | Contas a receber. |
pdv:read | Ler vendas do caixa | Vendas do PDV e cardápio. |
eventos:read | Ler eventos | Feed de eventos para quem não recebe aviso automático. |
webhooks:write escrita | Gerir avisos automáticos | Cadastrar, testar e remover endereços de aviso (webhooks). |
Rota pedida sem a permissão: 403 sem_permissao com permissao_necessaria.
Limites e erros
120 chamadas por minuto por chave. Toda resposta traz:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1762554180 (segundos Unix: quando o minuto vira)
Passou do limite: 429 com Retry-After (segundos). Espere e repita.
Todo erro tem o mesmo formato:
{ "erro": { "codigo": "dado_invalido", "mensagem": "NCM tem 8 dígitos", "campo": "ncm" },
"documentacao": "https://www.erpconnectmobile.com.br/desenvolvedores/" }
| HTTP | Quando |
|---|---|
| 200 / 201 | Deu certo (201 = criou). |
| 207 | Lista com resultado por item: alguns deram certo, outros não (veja resultados). |
| 400 | Parâmetro ou JSON errado. |
| 401 / 403 | Chave ausente/inválida · sem a permissão. |
| 402 | Licença da empresa vencida: leitura continua, escrita para. |
| 404 | Não existe nesta empresa (a chave nunca enxerga outra empresa). |
| 409 | Conflito: código repetido, saldo insuficiente, estado não permite. |
| 422 | Campo inválido (o nome vem em campo). |
| 429 | Limite por minuto. |
| 5xx | Problema nosso: repita com a mesma Idempotency-Key. Se continuar, chame no WhatsApp. |
Paginação e sincronização
Listas usam ?pagina=1&por_pagina=100 (até 500) e devolvem:
"paginacao": { "pagina": 1, "por_pagina": 100, "total": 3848, "total_paginas": 39 }
Sincronizar só a diferença: guarde a hora da última leitura e peça ?alterado_desde=2026-11-07T10:00:00-03:00. Com alterado_desde a lista vem em ordem de alteração. Melhor ainda: assine os avisos automáticos.
Repetir sem duplicar (Idempotency-Key)
Internet cai. Para repetir uma escrita sem medo, mande um cabeçalho Idempotency-Key único por operação (ex.: o id do lançamento no seu sistema). Repetiu com a mesma chave em até 48 h: devolvemos a mesma resposta, sem gravar de novo (cabeçalho Idempotent-Replayed: true).
Pedidos também nunca duplicam por id_externo.
Lote, validade e local
O ERP Connect guarda estoque em lotes (com validade e local). Outros sistemas quase sempre guardam só um número. A API faz a ponte:
| Situação | O que acontece |
|---|---|
| Você lê o estoque | GET /estoque dá um número por produto. Para anunciar ou vender, use vendavel (já na unidade de venda: caixa inteira, cartela lacrada, kit que dá para montar). saldo/disponivel são a soma dos lotes em unidade de estoque. Quer o detalhe? GET /estoque/{produto} mostra por local e por lote. |
| Você manda entrada sem local | Vai para o local que você mandar → o local onde o produto já está → o local padrão da empresa. No controle por lote a mercadoria nunca fica sem endereço: se nenhum desses existir, a entrada é recusada com estoque_sem_local e você manda o local_id (lista em GET /locais). No modo simples não precisa de local. Validade e lote são opcionais. |
| Você manda saída sem lote | Tiramos pela validade mais próxima (FEFO), de qualquer local (ou só do local mandado). Falta saldo = recusa inteira. |
| Você manda o saldo ("tem 65") | Calculamos a diferença: subiu = lote novo; desceu = tira só a diferença, pela validade. Os outros locais e lotes ficam como estão — o seu número nunca "apaga" o resto. Mande "previa": true antes para ver o que mudaria. |
| Você vendeu algo que aqui está zerado | Mande o pedido assim mesmo (POST /pedidos): ele entra, e o que faltou vira pendência do cliente no app (aparece em quantidade_pendente do item, em GET /pedidos/{pedido}). O vendavel continua 0 — nunca negativo — e, quando a mercadoria chegar, as unidades prometidas a esse cliente não aparecem como livres para ninguém vender de novo. Se o seu sistema guardou −1 localmente, o próximo número que mandarmos substitui. |
| Seu sistema não deixa vender sem estoque | Ótimo: com vendavel 0 ele recusa a venda do lado dele e nada chega aqui. |
| Seu sistema conta em caixa | Mande "unidade": "venda" na entrada, saída ou saldo: 2 caixas de 12 viram 24 unidades aqui. |
| Cartela e kit virtual | Veja Cartela de fornecedor e kit virtual. |
Toda mudança fica no histórico do app com o nome da chave (ex.: "Saída (integração Bling)").
Cartela de fornecedor e kit virtual
Muitos produtos chegam numa cartela do fornecedor (ex.: cartela com 12 cadeados) e são vendidos de dois jeitos: a cartela lacrada inteira, ou unidades pelo kit virtual (ex.: "Cadeado 20mm avulso", "Kit 3 colheres"). Quando uma cartela é aberta, as peças viram unidades soltas — que só se vendem pelo kit virtual, nunca como cartela. Os dois produtos usam as mesmas peças: vender um muda o que sobra para o outro.
| Exemplo: 1 cartela lacrada de 12 + 3 soltas | O que a API mostra |
|---|---|
| A cartela (SKU da cartela) | vendavel: 1, cartelas_lacradas: 1, soltas_da_cartela: 3. Nunca "15" nem "4": solta não vira cartela. |
| O kit virtual de 1 peça | vendavel: 15 (as 3 soltas + as 12 da cartela, que o app abre na hora da venda), com prontos e da_para_montar. |
| Uma peça mudou (venda, entrada, conferência) | Sai estoque.alterado da cartela e de cada kit virtual que usa a peça, já com o vendavel novo. |
Vendeu o kit virtual além do que estava pronto? Mande o pedido normalmente. O app usa primeiro as unidades soltas e, se faltar, abre uma cartela lacrada: ela vira unidades soltas de cada tamanho, e o pedido consome dessas soltas. Nada é "lançado no kit para depois sair" — o kit virtual não tem estoque próprio, ele usa as peças.
Não é furo: a cartela diminui sem ninguém ter vendido cartela. Exemplo: você tinha 1 cartela de 12 e 3 soltas, e vendeu 5 unidades pelo kit virtual. O app usa as 3 soltas, abre a cartela e usa mais 2. Fica: cartela vendavel: 0 (não há mais lacrada), kit virtual vendavel: 10 (as 10 soltas que sobraram). No seu sistema isso aparece como a cartela caindo de 1 para 0 sem venda de cartela — é a abertura. Por isso:
- Trate o
vendavelcomo número absoluto: ao receberestoque.alterado(ou ao lerGET /estoque), substitua o estoque do produto no seu sistema por ele. Não tente descontar a cartela por conta própria quando vender o kit, nem o kit quando vender a cartela: o app faz essa conta e avisa os dois. - Quer o porquê? Em
GET /estoque/movimentosa abertura aparece comotipo: "abertura_cartela", com o motivo ("1 cartela aberta: 12 unidades soltas…") e o pedido que causou. Cancelamento antes de separar pode devolver a cartela lacrada (fechamento_cartela). - Sistema que guarda estoque por movimento (entrada/saída): lance a diferença como ajuste de balanço, com a observação "abertura de cartela para kit virtual". Os conectores de Bling, Tiny, Omie e Mercos já fazem assim: mandam o saldo absoluto (balanço), nunca uma "venda" de cartela.
- Faltou peça de verdade (vendeu mais do que tinha): o pedido entra assim mesmo e o que faltou fica como pendência no app; o
vendavelvai a 0 e não fica negativo.
Para não vender a mesma peça duas vezes: anuncie os dois, mas mande a venda como pedido (POST /pedidos). Venda de fora que ainda não teve baixa já sai descontada do vendavel (vendido_fora_sem_baixa), e o app decide qual cartela abrir.
Escrita: cartela entra só lacrada (múltiplo do tamanho, ou "unidade": "venda" com o número de cartelas); senão cartela_incompleta. Unidade solta entra pela conferência no app. Kit virtual, produto base e cartela não aceitam saída nem saldo pela API (produto_sem_estoque_proprio): um número cru rasgaria cartela ou apagaria solta — a venda entra como pedido.
Compatibilidade com qualquer sistema
- Ache o produto do jeito que o seu sistema conhece: id, código numérico (
1234),sku:REF,ean:CODIGO(inclui códigos secundários, como o da caixa) oubalanca:PLU. Cliente: id oudoc:CNPJ. Pedido: id,n:NUMEROouext:SEU_ID. - Dados de demonstração não saem: toda conta nova nasce com produtos e clientes de exemplo para o lojista aprender. Eles nunca aparecem na API, nos avisos nem nos conectores — e quando a empresa limpa a demonstração, nenhum aviso de "inativado" sai, porque o seu sistema nunca recebeu esses cadastros.
- CSV em toda lista (
?formato=csv, separador;, abre no Excel). Para planilhas e sistemas antigos. - Sem webhook? Leia
GET /eventos?depois=IDde tempos em tempos. - Datas ISO 8601 com fuso. Dinheiro em reais com ponto decimal (
13.19). Quantidade na unidade de estoque (ou"unidade": "venda"para caixa/cartela inteira). - Sem programador? n8n, Make, Zapier e Power Automate falam com esta API pelo nó HTTP.
- Balança recebe arquivo pronto (Toledo e Filizola); impressora recebe ZPL e cupom em texto.
Segurança
- Cada chave só enxerga a própria empresa. Id de outra empresa responde 404, como se não existisse.
- A chave é guardada só como hash (não conseguimos ler a sua chave). Revogar vale na hora.
- Permissão mínima: cada chave só faz o que foi marcado. Custo e margem só com
custos:read. - Toda chamada fica registrada (rota, resposta, hora, IP).
- Avisos automáticos só vão para https com nome de domínio público e levam assinatura HMAC-SHA256.
- Fotos por URL: só https público, até 10 MB, e conferimos pelo conteúdo que é mesmo JPG, PNG ou WebP.
- Nunca coloque a chave em app de celular, site ou JavaScript do navegador: ela é para servidor.
Conectar com outros sistemas
Três jeitos de ligar outro sistema: integrado no app (você só conecta a conta), pela nossa API (o outro sistema ou um integrador chama esta API) e por arquivo (CSV, XML, carga de balança). Os conectores marcados como planejado ainda não existem: até lá, use a API.
Marketplaces
| Sistema | Situação | Como |
|---|---|---|
| Mercado Livre | Integrado no app | Integrações › Mercado Livre (login seguro). Anúncio, estoque, preço, fotos, pedidos, etiqueta, NF-e e perguntas. |
| Shopee | Integrado no app | Integrações › Shopee. Anúncio, estoque, pedidos e etiqueta. |
| Magalu | Integrado no app | Integrações › Magalu. Anúncio, estoque, pedidos e perguntas. |
| TikTok Shop | Em teste / homologação | Integrações › TikTok Shop (app em avaliação na TikTok). |
| KaBuM! (Mirakl) | Em teste / homologação | Integrações › KaBuM: cole a chave de API do painel do vendedor. Mesmo motor de Carrefour, Leroy Merlin, Centauro e Decathlon. |
| Casas Bahia | Integrado no app | Integrações › Casas Bahia (cole o token do portal do lojista). Anúncio, estoque, preço, pedidos, enviado e entregue. |
ERPs
| Sistema | Situação | Como |
|---|---|---|
| Bling (API v3) | Em teste / homologação | Conector pronto: Integrações › Bling (login seguro). Manda o saldo de cada produto (balanço no depósito padrão) a cada 5 minutos e, se ligado, traz os pedidos. Casa o produto pelo SKU ou código de barras. Aguardando o 1º teste com conta real. |
| Tiny / Olist ERP (API v3) | Em teste / homologação | Conector pronto: Integrações › Tiny (login seguro). Manda o saldo (balanço) a cada 5 minutos e, se ligado, traz os pedidos. O Tiny não tem lote: recebe o total. Aguardando o 1º teste com conta real. |
| Omie | Em teste / homologação | Conector pronto: Integrações › Omie (cole app_key e app_secret). Manda o saldo (ajuste SLD) a cada 5 minutos e, se ligado, traz os pedidos. Aguardando o 1º teste com conta real. |
| Conta Azul | Conector planejado | Sem webhooks: sincronize por alterado_desde. Estoque só pelo cadastro: mande o saldo total. |
| Mercos | Em teste / homologação | Conector pronto: Integrações › Mercos (cole o CompanyToken). Manda o saldo (novo_saldo) e, se ligado, traz os pedidos. Precisa do token de integrador do Mercos no servidor. Aguardando o 1º teste com conta real. |
| PedidoOK | Integrado no app | Integrações › Sistema de pedidos (ERP). Produtos, clientes e pedidos; estoque absoluto, sem lote (mandamos o saldo total). |
| vhsys | Conector planejado | Estoque só por lançamento (entrada/saída): use /estoque/entradas e /estoque/saidas. |
| Sankhya | Conector planejado | Estoque por empresa/local/controle (lote) e só por movimento: casa com entradas e saídas com lote. |
| Odoo | Conecta pela nossa API | O Odoo chama APIs REST externas (módulo ou automação): use esta API com a chave da empresa. |
| SAP Business One | Conecta pela nossa API | Pelo Service Layer com um integrador: ele lê/grava nesta API. |
| TOTVS Protheus / Senior / Linx | Conecta pela nossa API | Pela camada de integração do próprio ERP (REST): use esta API e os avisos automáticos. |
| Sistema próprio ou sob medida | Conecta pela nossa API | Qualquer linguagem que faça HTTPS + JSON (ou CSV). Comece por GET /v1/status. |
Lojas virtuais e hubs
| Sistema | Situação | Como |
|---|---|---|
| Nuvemshop | Conecta pela nossa API | Estoque replace (absoluto) ou variation (soma/subtrai): /estoque/{p}/saldo ou entradas/saídas. |
| Tray | Conecta pela nossa API | Use a lista de produtos com fotos (12 URLs) e o saldo total. |
| Shopify | Conecta pela nossa API | Aplicativo/automação lê /produtos e /estoque e assina estoque.alterado. |
| VTEX | Conecta pela nossa API | Catálogo, preço e estoque por depósito: mande o saldo total por SKU. |
| ANYMARKET / Plugg.to / Hub2b | Conecta pela nossa API | O hub lê o catálogo e o estoque desta API e devolve os pedidos em POST /pedidos. |
| n8n, Make, Zapier, Power Automate | Conecta pela nossa API | Nó HTTP com a chave no cabeçalho + gatilho por aviso automático (webhook) assinado. |
WMS e logística
| Sistema | Situação | Como |
|---|---|---|
| Melhor Envio | Integrado no app | Frete integrado no app: cotação, etiqueta e rastreio. Leia por /pedidos/{p}/envio. |
| Senior WMS | Conecta pela nossa API | Saldo por lote e endereço: /estoque/{produto} devolve lote, validade e local no mesmo formato. |
| Intelipost / Frenet | Conecta pela nossa API | Use o pedido (/pedidos/{p}), o envio e o XML da nota (/notas/{n}/xml). |
| WMS de terceiros (Infor, Manhattan, Linx WMS) | Conecta pela nossa API | Recebimento = /estoque/entradas com lote e validade; expedição = pedidos + avisos pedido.*. |
Apps de comida e delivery
| Sistema | Situação | Como |
|---|---|---|
| iFood | Em teste / homologação | Conector em construção no app (homologação do iFood exige CNPJ). Cardápio e disponibilidade por /cardapio. |
| Padrão Open Delivery (Abrasel): Keeta, aiqfome, Cardápio Web | Conector planejado | O padrão manda só disponível sim/não por item: /cardapio já devolve disponivel e complementos. |
| Rappi | Conector planejado | Disponibilidade por SKU (até 100 por chamada): use /cardapio ou /estoque. |
| Anota AI, Goomer, Saipos, OlaClick | Conecta pela nossa API | Sem documentação pública: só por parceria com cada empresa. Eles podem ler /cardapio e criar pedidos em POST /pedidos. |
Mercado, balança e PDV
| Sistema | Situação | Como |
|---|---|---|
| Balança Toledo (MGV) | Por arquivo (exportar/importar) | GET /balanca/itens?formato=toledo devolve o ITENSMGV.TXT para o MGV importar. |
| Balança Filizola | Por arquivo (exportar/importar) | GET /balanca/itens?formato=filizola devolve o CADTXT.TXT. |
| Etiqueta de balança (EAN-13 prefixo 2) | Integrado no app | O caixa e o coletor do app já leem a etiqueta com preço ou peso (configurável por empresa). |
| PDV de supermercado (Consinco, VR, RP Info, Zanthus, Arius, SysPDV) | Por arquivo (exportar/importar) | Quase todos integram por arquivo/layout, não por REST: use os CSV desta API (?formato=csv). |
Pagamentos e contabilidade
| Sistema | Situação | Como |
|---|---|---|
| Asaas | Integrado no app | Boleto e Pix no app; parcelas em /contas-receber. |
| Mercado Pago, PagBank, Stone, Cielo | Conecta pela nossa API | Conciliação: leia /contas-receber e /pdv/vendas. |
| Contador (Domínio, Omie, Nibo e outros) | Por arquivo (exportar/importar) | XML autorizado de cada nota em /notas/{n}/xml; listas em CSV. |
Usa um sistema que não está aqui? Fale com o desenvolvedor.
Conexão
Teste a chave e veja o que ela pode fazer.
Testar a chave
GET/v1/status
qualquer chave
Confirma que a chave funciona e diz a empresa, as permissões e quanto do limite do minuto já foi usado. Use como primeiro teste.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/status" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"ok": true,
"empresa": {
"id": "uuid",
"nome": "Minha Empresa"
},
"chave": {
"nome": "Integração Bling",
"escopos": [
"produtos:read",
"estoque:read"
]
},
"limite": {
"por_minuto": 120,
"usadas": 3
},
"versao": "1.2.2",
"hora_servidor": "2026-11-07T22:22:00Z"
}
Especificação OpenAPI 3.1
GET/v1/openapi.json
sem chave
A API inteira em OpenAPI 3.1 (JSON). Importe no Postman, Insomnia, Swagger ou no gerador de código da sua linguagem. Não precisa de chave.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/openapi.json"
Produtos
Cadastro completo do produto.
Listar produtos
GET/v1/produtos
permissão produtos:read?formato=csv
Lista paginada com todos os campos do produto, as URLs das fotos (até 12) e o saldo. Produto base (componente) só aparece com incluir_base=1.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
busca | texto | consulta | Procura no nome, referência e código de barras. |
ativo | true/false | consulta | true (padrão), false ou todos. |
categoria_id | id (uuid) | consulta | Só desta categoria. |
incluir_base | true/false | consulta | Inclui produtos base (componentes de kit). |
campos | texto | consulta | Só estes campos, separados por vírgula (resposta menor). Ex.: id,referencia,preco_venda,estoque |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "072f458d-…",
"erp_id": 1234,
"referencia": "CP-01",
"codigo_barras": "7890000000017",
"nome": "Coador de pano nº 3",
"marca": "Mesa Posta",
"unidade": "UN",
"preco_venda": 13.19,
"estoque": 70,
"estoque_reservado": 2,
"disponivel": 68,
"ncm": "63079090",
"peso_kg": 0.12,
"ativo": true,
"categoria": "Utilidades",
"tipo_produto": "venda",
"foto_principal_url": "https://…/produto-1234-capa.jpg",
"fotos": [
"https://…/1.jpg",
"https://…/2.jpg"
],
"updated_at": "2026-11-07T19:22:00-03:00"
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Ler um produto
GET/v1/produtos/{produto}
permissão produtos:read
Todos os campos do produto + fotos (ordem, capa), códigos de barras, variações, composição (kit) e saldo.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": {
"id": "072f458d-…",
"erp_id": 1234,
"referencia": "CP-01",
"codigo_barras": "7890000000017",
"nome": "Coador de pano nº 3",
"marca": "Mesa Posta",
"unidade": "UN",
"preco_venda": 13.19,
"estoque": 70,
"estoque_reservado": 2,
"disponivel": 68,
"ncm": "63079090",
"peso_kg": 0.12,
"ativo": true,
"categoria": "Utilidades",
"tipo_produto": "venda",
"foto_principal_url": "https://…/produto-1234-capa.jpg",
"fotos": [
"https://…/1.jpg",
"https://…/2.jpg"
],
"updated_at": "2026-11-07T19:22:00-03:00",
"codigos_barras": [
{
"codigo": "7890000000017",
"principal": true
}
],
"variacoes": [],
"composicao": []
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
Criar produto
POST/v1/produtos
permissão produtos:writeaceita Idempotency-Key
Cria um produto de venda com o código numérico seguinte da empresa. Aceita qualquer campo gravável (ver Campos do produto). Estoque inicial: use POST /estoque/entradas depois. Se a referência ou o código de barras já existir, devolve 409 com o id do produto existente.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
nome obrigatório | texto | corpo | Nome do produto. |
… | texto | corpo | Qualquer campo gravável da lista "Campos do produto". |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/produtos" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"nome":"Coador de pano nº 3","referencia":"CP-01","codigo_barras":"7890000000017","unidade":"UN","preco_venda":13.19,"ncm":"63079090","peso_kg":0.12}'
Resposta
{
"dados": {
"id": "072f458d-…",
"erp_id": 1234,
"referencia": "CP-01",
"codigo_barras": "7890000000017",
"nome": "Coador de pano nº 3",
"marca": "Mesa Posta",
"unidade": "UN",
"preco_venda": 13.19,
"estoque": 70,
"estoque_reservado": 2,
"disponivel": 68,
"ncm": "63079090",
"peso_kg": 0.12,
"ativo": true,
"categoria": "Utilidades",
"tipo_produto": "venda",
"foto_principal_url": "https://…/produto-1234-capa.jpg",
"fotos": [
"https://…/1.jpg",
"https://…/2.jpg"
],
"updated_at": "2026-11-07T19:22:00-03:00"
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
| 409 | conflito | Já existe (código repetido) ou o estado atual não permite. |
Alterar produto
PATCH/v1/produtos/{produto}
permissão produtos:writeaceita Idempotency-Key
Muda só os campos enviados. Campo que não é gravável é recusado com 422 (nunca ignorado em silêncio).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X PATCH "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"preco_venda":14.5,"ncm":"63079090"}'
Resposta
{
"dados": {
"id": "072f458d-…",
"erp_id": 1234,
"referencia": "CP-01",
"codigo_barras": "7890000000017",
"nome": "Coador de pano nº 3",
"marca": "Mesa Posta",
"unidade": "UN",
"preco_venda": 13.19,
"estoque": 70,
"estoque_reservado": 2,
"disponivel": 68,
"ncm": "63079090",
"peso_kg": 0.12,
"ativo": true,
"categoria": "Utilidades",
"tipo_produto": "venda",
"foto_principal_url": "https://…/produto-1234-capa.jpg",
"fotos": [
"https://…/1.jpg",
"https://…/2.jpg"
],
"updated_at": "2026-11-07T19:22:00-03:00"
},
"alterados": [
"preco_venda",
"ncm"
]
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
Alterar vários produtos
PATCH/v1/produtos
permissão produtos:writeaceita Idempotency-Key
Até 200 produtos numa chamada. Cada item leva "produto" (identificador) e os campos. Um item com erro não derruba os outros: a resposta diz o resultado de cada um.
Exemplo
curl -X PATCH "https://app.erpconnectmobile.com.br/api/v1/produtos" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"produtos":[{"produto":"sku:CP-01","preco_venda":14.5},{"produto":"ean:7890000000024","ativo":false}]}'
Resposta
{
"ok": 2,
"total": 2,
"resultados": [
{
"produto": "sku:CP-01",
"ok": true
},
{
"produto": "ean:7890000000024",
"ok": true
}
]
}
Inativar produto
DELETE/v1/produtos/{produto}
permissão produtos:write
Produto nunca é apagado (pedidos, notas e lotes apontam para ele): fica inativo. Para reativar, PATCH ativo=true.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X DELETE "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"ok": true,
"dados": {
"id": "uuid",
"ativo": false
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
Campos do produto
Uma rota para cada campo: ler e gravar um campo só.
Lista de campos do produto
GET/v1/produtos/campos
permissão produtos:read
Todos os campos do produto com tipo, grupo, se é gravável e limite. É a mesma tabela desta documentação.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/campos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"nome": "preco_venda",
"tipo": "numero",
"grupo": "preco",
"gravavel": true,
"descricao": "Preço de venda (R$)."
}
]
}
Ler um campo
GET/v1/produtos/{produto}/campos/{campo}
permissão produtos:read
Devolve só o valor de um campo. Serve para todo campo da tabela "Campos do produto".
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
campo obrigatório | texto | caminho | Nome do campo. Ex.: preco_venda |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/campos/preco_venda" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"produto_id": "uuid",
"campo": "preco_venda",
"valor": 13.19
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 400 | campo_desconhecido | O campo não existe na lista. |
Gravar um campo
PUT/v1/produtos/{produto}/campos/{campo}
permissão produtos:writeaceita Idempotency-Key
Grava um campo só. Corpo: {"valor": …}. Recusa campo só-leitura (403) e valor do tipo errado (422).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
campo obrigatório | texto | caminho | Nome do campo. Ex.: ncm |
Exemplo
curl -X PUT "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/campos/ncm" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"valor":"63079090"}'
Resposta
{
"produto_id": "uuid",
"campo": "ncm",
"valor": "63079090",
"anterior": "63079000"
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
| 403 | campo_somente_leitura | O campo não pode ser gravado. |
Fotos e vídeos
Até 12 fotos por produto; a primeira é a capa.
Listar fotos
GET/v1/produtos/{produto}/fotos
permissão produtos:read
As fotos do produto na ordem (até 12). A de ordem 0 é a capa. URLs públicas, prontas para marketplace.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/fotos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"ordem": 0,
"capa": true,
"url": "https://…/1.jpg",
"miniatura_url": "https://…/1-thumb.jpg"
}
],
"maximo": 12
}
Adicionar foto
POST/v1/produtos/{produto}/fotos
permissão fotos:writeaceita Idempotency-Key
Manda a foto por URL pública (https) OU em base64. JPG, PNG ou WebP, até 10 MB. Entra no fim; a primeira foto do produto vira capa. Com "capa": true ela vai para a frente. Também aceita {"fotos": [ … ]} com várias.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
url | texto | corpo | Endereço https da imagem (ou use base64). |
base64 | base64 | corpo | Imagem em base64 (com ou sem "data:image/jpeg;base64,"). |
capa | true/false | corpo | Põe como capa. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/fotos" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"url":"https://meusite.com/fotos/coador.jpg","capa":false}'
Resposta
{
"dados": {
"id": "uuid",
"ordem": 3,
"capa": false,
"url": "https://…"
},
"total_fotos": 4
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
| 409 | limite_fotos | O produto já tem 12 fotos. |
Reordenar fotos
PUT/v1/produtos/{produto}/fotos/ordem
permissão fotos:write
Manda a lista COMPLETA de ids na ordem nova; o primeiro vira capa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X PUT "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/fotos/ordem" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-d '{"ids":["uuid-3","uuid-1","uuid-2"]}'
Resposta
{
"ok": true
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
Trocar a capa
POST/v1/produtos/{produto}/fotos/{foto}/capa
permissão fotos:write
Põe esta foto na frente (ordem 0); as outras andam uma casa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
foto obrigatório | id (uuid) | caminho | Id da foto. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/fotos/{foto}/capa" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"ok": true
}
Apagar foto
DELETE/v1/produtos/{produto}/fotos/{foto}
permissão fotos:write
Apaga a foto e o arquivo. Se era a capa, a próxima vira capa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
foto obrigatório | id (uuid) | caminho | Id da foto. |
Exemplo
curl -X DELETE "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/fotos/{foto}" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"ok": true,
"total_fotos": 3
}
Listar vídeos
GET/v1/produtos/{produto}/videos
permissão produtos:read
Vídeos do produto (URL, capa, duração).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/videos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"ordem": 0,
"url": "https://…/video.mp4",
"capa_url": "https://…",
"duracao_s": 18
}
]
}
Códigos de barras
Vários códigos por produto (EAN, DUN, interno).
Listar códigos
GET/v1/produtos/{produto}/codigos-barras
permissão produtos:read
Todos os códigos do produto (EAN da unidade, DUN da caixa, código interno), com quantas unidades cada um representa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/codigos-barras" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"codigo": "7890000000017",
"simbologia": "EAN13",
"unidades": 1,
"principal": true
},
{
"id": "uuid",
"codigo": "17890000000014",
"simbologia": "DUN14",
"unidades": 12,
"principal": false
}
]
}
Adicionar código
POST/v1/produtos/{produto}/codigos-barras
permissão produtos:writeaceita Idempotency-Key
Liga mais um código ao produto. Código já usado por outro produto da empresa = 409.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
codigo obrigatório | texto | corpo | O código. |
unidades | inteiro | corpo | Quantas unidades o código representa (caixa com 12 = 12). Padrão 1. |
apelido | texto | corpo | Nome curto (ex.: "Caixa"). |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/codigos-barras" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"codigo":"17890000000014","unidades":12,"apelido":"Caixa"}'
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 409 | conflito | Já existe (código repetido) ou o estado atual não permite. |
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
Remover código
DELETE/v1/produtos/{produto}/codigos-barras/{codigo}
permissão produtos:write
Desliga o código do produto (o código principal do cadastro não sai por aqui: grave outro em codigo_barras).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
codigo obrigatório | texto | caminho | O código ou o id. |
Exemplo
curl -X DELETE "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/codigos-barras/{codigo}" \
-H "Authorization: Bearer $CHAVE"
Variações, kits e embalagens
Como o produto é montado e vendido.
Variações
GET/v1/produtos/{produto}/variacoes
permissão produtos:read
Variações (cor, tamanho…) com SKU, código de barras e preço diferencial.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/variacoes" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"atributo_tipo": "cor",
"atributo_valor": "Azul",
"sku": "CP-01-AZ",
"codigo_barras": "789…",
"preco_diferencial": 0
}
]
}
Composição do kit
GET/v1/produtos/{produto}/composicao
permissão produtos:read
Se o produto é kit, quais produtos e quantidades ele leva.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/composicao" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"componente_id": "uuid",
"componente_erp_id": 55,
"nome": "Seda Brown",
"quantidade": 2,
"unidade": "UN"
}
]
}
Embalagens
GET/v1/produtos/{produto}/embalagens
permissão produtos:read
Formas de venda/compra do produto (unidade, display, caixa) com o fator de conversão.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/embalagens" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"nome": "Caixa com 12",
"fator_conversao": 12,
"tipo": "caixa"
}
]
}
Categorias
Categorias e subcategorias.
Listar categorias
GET/v1/categorias
permissão produtos:read
Categorias com as subcategorias dentro.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/categorias" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"nome": "Utilidades",
"ordem": 1,
"ativa": true,
"subcategorias": [
{
"id": "uuid",
"nome": "Cozinha"
}
]
}
]
}
Criar categoria
POST/v1/categorias
permissão produtos:writeaceita Idempotency-Key
Cria a categoria (nome repetido devolve a existente com 200).
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/categorias" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"nome":"Utilidades","descricao":"Casa e cozinha"}'
Criar subcategoria
POST/v1/categorias/{categoria}/subcategorias
permissão produtos:writeaceita Idempotency-Key
Cria a subcategoria dentro da categoria.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
categoria obrigatório | id (uuid) | caminho | Id da categoria. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/categorias/{categoria}/subcategorias" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"nome":"Cozinha"}'
Preços
Tabelas de preço e preço por quantidade.
Preços do produto
GET/v1/produtos/{produto}/precos
permissão produtos:read
Preço de venda, preço por quantidade (atacado) e o preço em cada tabela de preço.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/precos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"preco_venda": 13.19,
"por_quantidade": [
{
"quantidade_minima": 12,
"desconto_pct": 5,
"preco_fixo": null
}
],
"tabelas": [
{
"tabela_id": "uuid",
"nome": "Atacado",
"preco": 11.9
}
]
}
Tabelas de preço
GET/v1/tabelas-preco
permissão produtos:read
Tabelas de preço da empresa.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/tabelas-preco" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"nome": "Atacado",
"desconto_pct_padrao": 10,
"ativo": true
}
]
}
Itens da tabela
GET/v1/tabelas-preco/{tabela}/itens
permissão produtos:read?formato=csv
Preço de cada produto na tabela.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
tabela obrigatório | id (uuid) | caminho | Id da tabela. |
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/tabelas-preco/{tabela}/itens" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"produto_id": "uuid",
"erp_id": 1234,
"referencia": "CP-01",
"preco": 11.9
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Estoque
Saldo, lote, validade, local, entradas, saídas e balanço.
Saldos de todos os produtos
GET/v1/estoque
permissão estoque:read?formato=csv
Um número por produto. vendavel = o que dá para vender, já na unidade de venda (o mesmo número que o app manda aos marketplaces): produto em caixa = caixas inteiras, cartela = só as lacradas, kit virtual = prontos + o que dá para montar; já desconta venda de fora ainda sem baixa e o que já foi prometido a cliente (venda que ficou sem estoque). saldo/reservado/disponivel = soma dos lotes, em unidade de estoque. É o que sistemas sem lote/local precisam. Para o detalhe por local e lote, use /estoque/{produto}. Veja "Cartela de fornecedor e kit virtual".
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/estoque" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"produto_id": "uuid",
"erp_id": 1234,
"referencia": "CP-01",
"codigo_barras": "7890000000017",
"saldo": 70,
"reservado": 2,
"disponivel": 68,
"tipo_estoque": "simples",
"vendavel": 5,
"unidades_por_venda": 12,
"vendido_fora_sem_baixa": 0,
"proxima_validade": "2027-03-01",
"atualizado_em": "…"
},
{
"produto_id": "uuid",
"erp_id": 1240,
"referencia": "CAD-C12",
"codigo_barras": null,
"saldo": 12,
"reservado": 0,
"disponivel": 12,
"tipo_estoque": "cartela",
"vendavel": 1,
"unidades_por_venda": 12,
"cartelas_lacradas": 1,
"soltas_da_cartela": 3,
"vendido_fora_sem_baixa": 0
},
{
"produto_id": "uuid",
"erp_id": 1241,
"referencia": "CAD-UN",
"codigo_barras": null,
"saldo": 0,
"reservado": 0,
"disponivel": 0,
"tipo_estoque": "kit_virtual",
"vendavel": 15,
"unidades_por_venda": 1,
"prontos": 0,
"da_para_montar": 15,
"vendido_fora_sem_baixa": 0
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Estoque detalhado do produto
GET/v1/estoque/{produto}
permissão estoque:read
Saldo total + vendável (como em /estoque) + quanto tem em cada local + cada lote (número do lote, validade, local, quantidade, caixas fechadas e unidades soltas). Lote sem local = aguardando endereçamento.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/estoque/sku:CP-01" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"produto_id": "uuid",
"saldo": 70,
"reservado": 2,
"disponivel": 68,
"tipo_estoque": "simples",
"vendavel": 5,
"unidades_por_venda": 12,
"vendido_fora_sem_baixa": 0,
"por_local": [
{
"local_id": "uuid",
"local": "A-01-02",
"quantidade": 60
},
{
"local_id": null,
"local": "Sem local (aguardando endereçar)",
"quantidade": 10
}
],
"lotes": [
{
"lote_id": "uuid",
"lote": "L2611",
"validade": "2027-03-01",
"local_id": "uuid",
"local": "A-01-02",
"quantidade": 60,
"caixas_fechadas": 5,
"unidades_soltas": 0,
"unidades_por_caixa": 12
}
]
}
Todos os lotes
GET/v1/estoque/lotes
permissão estoque:read?formato=csv
Lotes ativos de todos os produtos. Filtre por vencendo_ate para saber o que vence.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
vencendo_ate | data | consulta | Só lotes com validade até esta data. |
local_id | id (uuid) | consulta | Só deste local. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/estoque/lotes" \
-H "Authorization: Bearer $CHAVE"
Movimentos de estoque
GET/v1/estoque/movimentos
permissão estoque:read?formato=csv
Histórico de entradas, saídas, transferências e ajustes de cada lote, com motivo e pedido, do mais antigo para o mais novo. Cartela aberta para vender kit virtual aparece como abertura_cartela (e fechamento_cartela quando volta lacrada no cancelamento). Para sincronizar, peça "desde" a data do último que você leu.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
desde | data e hora | consulta | Só a partir desta data/hora. |
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/estoque/movimentos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"tipo": "saida",
"quantidade": 2,
"produto_erp_id": 1234,
"lote_id": "uuid",
"local_origem_id": "uuid",
"local_destino_id": null,
"pedido_id": "uuid",
"motivo": "Venda",
"origem_tipo": "pedido",
"criado_em": "…",
"estornada_em": null
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Dar entrada
POST/v1/estoque/entradas
permissão estoque:writeaceita Idempotency-Key
Soma estoque criando um lote. Local: o informado → o local onde o produto já está → o local padrão da empresa. No controle por lote a mercadoria nunca fica sem endereço: se nenhum desses existir, a entrada é recusada com estoque_sem_local (mande local_id, veja /locais). No modo simples o local não é exigido. Validade e lote são opcionais. Cartela de fornecedor entra só lacrada (múltiplo do tamanho da cartela, ou "unidade": "venda" com o número de cartelas); kit virtual e produto base não recebem entrada. Aceita uma entrada ou {"entradas": [ … ]} (até 200).
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | corpo | Identificador do produto (5 jeitos). |
quantidade obrigatório | número | corpo | Quantidade na unidade de estoque (inteiro > 0). |
unidade | texto | corpo | "estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras. |
local_id | id (uuid) | corpo | Local de destino (ver /locais). |
validade | data | corpo | Validade do lote (AAAA-MM-DD). |
lote | texto | corpo | Número do lote do fabricante. |
custo_unitario | número | corpo | Custo de cada unidade (R$). |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/estoque/entradas" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"entradas":[{"produto":"sku:CP-01","quantidade":24,"validade":"2027-03-01","lote":"L2611","custo_unitario":6.5}]}'
Resposta
{
"ok": 1,
"total": 1,
"resultados": [
{
"ok": true,
"lote_id": "uuid",
"local_id": "uuid",
"sem_local": false,
"quantidade_entrada": 24,
"estoque_total": 94
}
]
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 422 | estoque_sem_local | Controle por lote, sem local informado, produto sem endereço e empresa sem local padrão. |
| 422 | cartela_incompleta | Cartela com quantidade que não fecha cartela inteira (ex.: 15 numa cartela de 12). |
| 409 | produto_sem_estoque_proprio | Kit virtual ou produto base. |
Dar saída
POST/v1/estoque/saidas
permissão estoque:ajustaraceita Idempotency-Key
Tira estoque pela validade mais próxima (FEFO), de qualquer local, ou só do local informado. Falta saldo = recusa inteira (nunca tira pela metade). Cada lote mexido fica no histórico com o nome da integração. Kit virtual, produto base e cartela de fornecedor são recusados: a venda deles entra como pedido, e o app decide qual cartela abrir. Com "previa": true mostra o que faria sem mexer.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | corpo | Identificador do produto. |
quantidade obrigatório | número | corpo | Quanto tirar. |
unidade | texto | corpo | "estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras. |
local_id | id (uuid) | corpo | Só deste local. |
motivo | texto | corpo | Aparece no histórico do app. |
previa | true/false | corpo | Só simula. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/estoque/saidas" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"produto":"ean:7890000000017","quantidade":3,"motivo":"Venda no balcão do sistema X"}'
Resposta
{
"ok": true,
"aplicado": true,
"saldo_antes": 70,
"saldo_depois": 67,
"lotes": [
{
"lote_id": "uuid",
"validade": "2027-03-01",
"de": 60,
"para": 57
}
]
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 409 | saldo_insuficiente | Não tem o suficiente. |
| 409 | produto_sem_estoque_proprio | Kit virtual, base ou cartela de fornecedor. |
Acertar o saldo (valor absoluto)
PUT/v1/estoque/{produto}/saldo
permissão estoque:ajustaraceita Idempotency-Key
Para sistemas que só conhecem "quanto tem". Calcula a diferença: se subiu, cria um lote (local como na entrada); se desceu, tira só a diferença pela validade mais próxima — os outros locais e lotes ficam como estão. Kit virtual, produto base e cartela de fornecedor são recusados. Recomendado mandar "previa": true primeiro.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
quantidade obrigatório | número | corpo | Saldo que deve ficar. |
unidade | texto | corpo | "estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras. |
local_id | id (uuid) | corpo | Acerta só este local. |
motivo | texto | corpo | Aparece no histórico. |
previa | true/false | corpo | Só simula. |
Exemplo
curl -X PUT "https://app.erpconnectmobile.com.br/api/v1/estoque/sku:CP-01/saldo" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"quantidade":65,"motivo":"Contagem do sistema X","previa":true}'
Resposta
{
"ok": true,
"aplicado": false,
"saldo_antes": 70,
"saldo_depois": 65,
"lotes": [
{
"lote_id": "uuid",
"de": 60,
"para": 55
}
]
}
Balanço (vários saldos)
POST/v1/estoque/balanco
permissão estoque:ajustaraceita Idempotency-Key
Mesmo que acertar o saldo, para até 200 produtos. Cada item tem resultado próprio.
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/estoque/balanco" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"previa":true,"itens":[{"produto":"sku:CP-01","quantidade":65},{"produto":"sku:CP-02","quantidade":0}]}'
Locais de estoque
GET/v1/locais
permissão estoque:read
Endereços do depósito (zona, corredor, coluna, linha) e o local padrão da empresa.
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/locais" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"local_padrao_id": "uuid",
"dados": [
{
"id": "uuid",
"nome": "A-01-02",
"zona": "A",
"corredor": "01",
"coluna": "02",
"linha": null,
"codigo_barras": "LOC-A0102",
"ativo": true
}
]
}
Clientes
Cadastro de clientes.
Listar clientes
GET/v1/clientes
permissão clientes:read?formato=csv
Clientes da empresa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
busca | texto | consulta | Nome, fantasia ou documento. |
documento | texto | consulta | CNPJ/CPF exato (só dígitos). |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/clientes" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"razao_social": "Mercado Bom Preço Ltda",
"fantasia": "Bom Preço",
"cnpj_cpf": "12345678000190",
"inscricao_estadual": "110042490114",
"email": "compras@bompreco.com.br",
"telefone": "11999990000",
"cep": "01001000",
"logradouro": "Praça da Sé",
"numero": "100",
"bairro": "Sé",
"cidade": "São Paulo",
"uf": "SP",
"codigo_municipio": "3550308",
"limite_credito": 5000,
"ativo": true
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Ler cliente
GET/v1/clientes/{cliente}
permissão clientes:read
Pelo id ou por doc:CNPJ.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
cliente obrigatório | texto | caminho | Id ou doc:12345678000190. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/clientes/doc:12345678000190" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": {
"id": "uuid",
"razao_social": "Mercado Bom Preço Ltda",
"fantasia": "Bom Preço",
"cnpj_cpf": "12345678000190",
"inscricao_estadual": "110042490114",
"email": "compras@bompreco.com.br",
"telefone": "11999990000",
"cep": "01001000",
"logradouro": "Praça da Sé",
"numero": "100",
"bairro": "Sé",
"cidade": "São Paulo",
"uf": "SP",
"codigo_municipio": "3550308",
"limite_credito": 5000,
"ativo": true
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
Criar cliente
POST/v1/clientes
permissão clientes:writeaceita Idempotency-Key
Documento já cadastrado = 409 com o id existente.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
razao_social obrigatório | texto | corpo | razao social |
fantasia | texto | corpo | fantasia |
cnpj_cpf | texto | corpo | cnpj cpf |
inscricao_estadual | texto | corpo | inscricao estadual |
ind_ie_dest | texto | corpo | ind ie dest |
email | texto | corpo | |
telefone | texto | corpo | telefone |
cep | texto | corpo | cep |
logradouro | texto | corpo | logradouro |
numero | texto | corpo | numero |
complemento | texto | corpo | complemento |
bairro | texto | corpo | bairro |
cidade | texto | corpo | cidade |
uf | texto | corpo | uf |
codigo_municipio | texto | corpo | codigo municipio |
limite_credito | número | corpo | limite credito |
observacao | texto | corpo | observacao |
ativo | true/false | corpo | ativo |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/clientes" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"razao_social":"Mercado Bom Preço Ltda","cnpj_cpf":"12345678000190","email":"compras@bompreco.com.br","telefone":"11999990000","cep":"01001000","uf":"SP","cidade":"São Paulo"}'
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 409 | conflito | Já existe (código repetido) ou o estado atual não permite. |
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
Alterar cliente
PATCH/v1/clientes/{cliente}
permissão clientes:writeaceita Idempotency-Key
Muda só os campos enviados.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
cliente obrigatório | texto | caminho | Id ou doc:CNPJ. |
Exemplo
curl -X PATCH "https://app.erpconnectmobile.com.br/api/v1/clientes/doc:12345678000190" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"telefone":"11988887777"}'
Fornecedores
Cadastro de fornecedores.
Listar fornecedores
GET/v1/fornecedores
permissão fornecedores:read?formato=csv
Fornecedores da empresa.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
busca | texto | consulta | Nome ou documento. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/fornecedores" \
-H "Authorization: Bearer $CHAVE"
Ler fornecedor
GET/v1/fornecedores/{fornecedor}
permissão fornecedores:read
Pelo id ou doc:CNPJ.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
fornecedor obrigatório | texto | caminho | Id ou doc:CNPJ. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/fornecedores/doc:11222333000181" \
-H "Authorization: Bearer $CHAVE"
Criar fornecedor
POST/v1/fornecedores
permissão fornecedores:writeaceita Idempotency-Key
Documento já cadastrado = 409.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
razao_social obrigatório | texto | corpo | razao social |
fantasia | texto | corpo | fantasia |
cnpj_cpf | texto | corpo | cnpj cpf |
inscricao_estadual | texto | corpo | inscricao estadual |
email | texto | corpo | |
telefone | texto | corpo | telefone |
whatsapp | texto | corpo | |
cep | texto | corpo | cep |
endereco_rua | texto | corpo | endereco rua |
endereco_numero | texto | corpo | endereco numero |
endereco_bairro | texto | corpo | endereco bairro |
endereco_cidade | texto | corpo | endereco cidade |
endereco_estado | texto | corpo | endereco estado |
responsavel_nome | texto | corpo | responsavel nome |
condicao_pagamento | texto | corpo | condicao pagamento |
prazo_medio_dias | número | corpo | prazo medio dias |
lead_time_dias | número | corpo | lead time dias |
pedido_minimo_valor | número | corpo | pedido minimo valor |
observacoes | texto | corpo | observacoes |
ativo | true/false | corpo | ativo |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/fornecedores" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"razao_social":"Distribuidora Exemplo Ltda","cnpj_cpf":"11222333000181","telefone":"1133334444"}'
Alterar fornecedor
PATCH/v1/fornecedores/{fornecedor}
permissão fornecedores:writeaceita Idempotency-Key
Muda só os campos enviados.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
fornecedor obrigatório | texto | caminho | Id ou doc:CNPJ. |
Exemplo
curl -X PATCH "https://app.erpconnectmobile.com.br/api/v1/fornecedores/doc:11222333000181" \
-H "Authorization: Bearer $CHAVE"
Pedidos
Ler e criar pedidos, histórico e cancelamento.
Listar pedidos
GET/v1/pedidos
permissão pedidos:read?formato=csv
Pedidos de todos os canais (app, loja, site, marketplaces, API).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
desde | data e hora | consulta | Criados a partir de. |
status | texto | consulta | rascunho, pendente, confirmado, finalizado, faturado, cancelado (vários com vírgula). |
cliente_id | id (uuid) | consulta | Só deste cliente. |
com_itens | true/false | consulta | Inclui os itens de cada pedido. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"numero": 812,
"id_externo": "ERP-55821",
"status": "faturado",
"canal": "app",
"valor_total": 129.9,
"valor_frete": 0,
"total_itens": 2,
"cliente": {
"id": "uuid",
"nome": "Bom Preço",
"documento": "12345678000190"
},
"created_at": "2026-11-07T10:00:00-03:00",
"itens": [
{
"produto_id": "uuid",
"erp_id": 1234,
"referencia": "CP-01",
"nome": "Coador de pano nº 3",
"quantidade": 10,
"preco_unitario": 12.99,
"valor_total": 129.9
}
]
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Ler pedido
GET/v1/pedidos/{pedido}
permissão pedidos:read
Pedido completo com itens, cliente, pagamento, frete e notas. Pelo id, pelo número (n:812) ou pelo seu id externo (ext:ERP-55821).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID_EXTERNO. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": {
"id": "uuid",
"numero": 812,
"id_externo": "ERP-55821",
"status": "faturado",
"canal": "app",
"valor_total": 129.9,
"valor_frete": 0,
"total_itens": 2,
"cliente": {
"id": "uuid",
"nome": "Bom Preço",
"documento": "12345678000190"
},
"created_at": "2026-11-07T10:00:00-03:00",
"itens": [
{
"produto_id": "uuid",
"erp_id": 1234,
"referencia": "CP-01",
"nome": "Coador de pano nº 3",
"quantidade": 10,
"preco_unitario": 12.99,
"valor_total": 129.9
}
]
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
Criar pedido
POST/v1/pedidos
permissão pedidos:writeaceita Idempotency-Key
O pedido entra em Processados como venda de outro canal, e o app dá a baixa do estoque pelo motor oficial (lote, cartela, kit). "id_externo" é obrigatório e único: reenviar o mesmo devolve o pedido já criado (nunca duplica). Todo item precisa achar o produto; se um não achar, o pedido inteiro é recusado e a resposta diz qual.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
id_externo obrigatório | texto | corpo | Número do pedido no seu sistema. |
cliente | texto | corpo | Id do cliente ou doc:CNPJ (opcional). |
itens obrigatório | lista | corpo | Lista: produto, quantidade, preco_unitario. |
valor_frete | número | corpo | Frete cobrado. |
observacoes | texto | corpo | Observações. |
criado_em | data e hora | corpo | Quando foi feito no seu sistema. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/pedidos" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"id_externo":"ERP-55821","cliente":"doc:12345678000190","itens":[{"produto":"sku:CP-01","quantidade":10,"preco_unitario":12.99}],"observacoes":"Entregar pela manhã"}'
Resposta
{
"dados": {
"id": "uuid",
"numero": 813,
"id_externo": "ERP-55821",
"status": "finalizado",
"valor_total": 129.9
},
"criado": true
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
| 422 | item_sem_produto | Um item não achou produto: o pedido não entra. |
Cancelar pedido criado pela API
POST/v1/pedidos/{pedido}/cancelar
permissão pedidos:write
Só cancela pedido criado pela API e que o app ainda não baixou do estoque. Os outros se cancelam pelo app (o app pergunta o que fazer com cartela e kit).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812/cancelar" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-d '{"motivo":"Cliente desistiu"}'
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 409 | conflito | Já existe (código repetido) ou o estado atual não permite. |
Histórico do pedido
GET/v1/pedidos/{pedido}/historico
permissão pedidos:read
Cada mudança de status com data e motivo.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812/historico" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"status_anterior": "confirmado",
"status_novo": "faturado",
"motivo": null,
"criado_em": "…"
}
]
}
Cupom, envio e etiquetas
Cupom do pedido, frete, rastreio, etiqueta de envio e de produto.
Cupom do pedido
GET/v1/pedidos/{pedido}/cupom
permissão pedidos:read?formato=txt?formato=html
Comprovante do pedido (não fiscal) pronto para imprimir: txt com 48 colunas (impressora térmica 80 mm; ?colunas=32 para 58 mm), html (A4 ou térmica pelo navegador) ou json com as linhas.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID. |
formato | texto | consulta | txt (padrão), html ou json. |
colunas | inteiro | consulta | 32, 42 ou 48 (padrão). |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812/cupom" \
-H "Authorization: Bearer $CHAVE"
Frete e rastreio
GET/v1/pedidos/{pedido}/envio
permissão pedidos:read
Transportadora, serviço, valor, prazo, código de rastreio, link de rastreio e o link da etiqueta de envio (PDF) quando já foi gerada.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812/envio" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"provedor": "melhor_envio",
"transportadora": "Correios",
"servico": "PAC",
"valor_frete": 22.4,
"prazo_dias": 5,
"status": "postado",
"codigo_rastreio": "AA123456789BR",
"rastreio_url": "https://…",
"etiqueta_url": "https://…",
"volumes": 1,
"peso_kg": 0.4
}
]
}
Etiqueta do produto
GET/v1/produtos/{produto}/etiqueta
permissão produtos:read?formato=txt
Dados para imprimir a etiqueta de gôndola/produto: nome, preço, código de barras. Em ZPL (impressora Zebra/Elgin/Argox) com ?formato=zpl, ou json.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
produto obrigatório | texto | caminho | O produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01 |
formato | texto | consulta | json (padrão) ou zpl. |
copias | inteiro | consulta | Cópias no ZPL (1 a 500). |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/produtos/sku:CP-01/etiqueta" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"nome": "Coador de pano nº 3",
"referencia": "CP-01",
"preco_venda": 13.19,
"codigo_barras": "7890000000017",
"simbologia": "EAN13",
"unidade": "UN"
}
Etiquetas salvas
GET/v1/etiquetas
permissão produtos:read
Modelos de etiqueta feitos no app (código, título, tamanho, quantas vezes impressa).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/etiquetas" \
-H "Authorization: Bearer $CHAVE"
Notas fiscais
NF-e e NFC-e emitidas, com XML.
Listar notas
GET/v1/notas
permissão notas:read?formato=csv
NF-e (55) e NFC-e (65) emitidas.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
status | texto | consulta | autorizada, cancelada, rejeitada… |
modelo | texto | consulta | 55 ou 65. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/notas" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"pedido_id": "uuid",
"modelo": "55",
"serie": 1,
"numero": 43,
"chave": "3526…",
"status": "autorizada",
"valor_total": 129.9,
"data_emissao": "…",
"destinatario": {
"nome": "Bom Preço",
"documento": "12345678000190"
}
}
],
"paginacao": {
"pagina": 1,
"por_pagina": 100,
"total": 1,
"total_paginas": 1
}
}
Ler nota
GET/v1/notas/{nota}
permissão notas:read
Pelo id ou pela chave (chave:44 dígitos).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
nota obrigatório | texto | caminho | Id ou chave:CHAVE. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/notas/chave:35261154815379000117550010000000431000000431" \
-H "Authorization: Bearer $CHAVE"
XML autorizado
GET/v1/notas/{nota}/xml
permissão notas:read?formato=xml
O XML da nota com o protocolo da SEFAZ (nfeProc), pronto para mandar ao contador ou ao marketplace.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
nota obrigatório | texto | caminho | Id ou chave:CHAVE. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/notas/chave:35261154815379000117550010000000431000000431/xml" \
-H "Authorization: Bearer $CHAVE"
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 404 | nao_encontrado | O item não existe nesta empresa. |
| 409 | sem_xml | A nota não foi autorizada. |
Notas do pedido
GET/v1/pedidos/{pedido}/notas
permissão notas:read
Notas emitidas para o pedido.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pedido obrigatório | texto | caminho | Id, n:NUMERO ou ext:ID. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pedidos/n:812/notas" \
-H "Authorization: Bearer $CHAVE"
Financeiro
Contas a receber.
Contas a receber
GET/v1/contas-receber
permissão financeiro:read?formato=csv
Parcelas a receber com vencimento, valor em aberto, pago, forma prevista e boleto (linha digitável).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
alterado_desde | data e hora | consulta | Só o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00 |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
status | texto | consulta | aberto, pago, vencido, cancelado. |
vencimento_ate | data | consulta | Vence até. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/contas-receber" \
-H "Authorization: Bearer $CHAVE"
Caixa, cardápio e balança
Vendas do PDV, cardápio para apps de comida e carga de balança.
Vendas do caixa
GET/v1/pdv/vendas
permissão pdv:read?formato=csv
Vendas do PDV com itens, pagamentos e o cupom de desconto usado (cupom_regra_id).
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
pagina | inteiro | consulta | Página (começa em 1). Ex.: 1 |
por_pagina | inteiro | consulta | Itens por página (1 a 500, padrão 100). Ex.: 100 |
desde | data e hora | consulta | A partir de. |
formato | texto | consulta | json (padrão) ou csv (planilha, separador ;). Ex.: csv |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/pdv/vendas" \
-H "Authorization: Bearer $CHAVE"
Cardápio
GET/v1/cardapio
permissão pdv:read
Seções e itens do cardápio com preço, foto e disponibilidade (estoque > 0). Mesmo formato de "item com complementos" do padrão Open Delivery (Abrasel).
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/cardapio" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": "uuid",
"nome": "Lanches",
"ordem": 1,
"itens": [
{
"id": "uuid",
"produto_id": "uuid",
"nome": "X-Burguer",
"preco": 25,
"disponivel": true,
"foto_url": "https://…",
"complementos": [
{
"produto_erp_id": 99,
"texto": "Bacon"
}
]
}
]
}
]
}
Carga da balança
GET/v1/balanca/itens
permissão produtos:read?formato=toledo?formato=filizola
Itens com código de balança (PLU), preço por kg ou por unidade. ?formato=toledo devolve o arquivo ITENSMGV.TXT (Toledo MGV), ?formato=filizola o CADTXT.TXT; json para outros programas.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
formato | texto | consulta | json (padrão), toledo ou filizola. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/balanca/itens" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"codigo_balanca": "01234",
"nome": "Queijo minas",
"unidade": "KG",
"preco": 39.9,
"por_peso": true,
"validade_dias": null
}
]
}
Eventos e avisos (webhooks)
Receba avisos automáticos ou leia o feed.
Cadastre um endereço https (pelo app em Integrações › API, ou por POST /v1/webhooks). A cada evento escolhido mandamos um POST com JSON:
POST https://seusistema.com.br/webhooks/erpconnect
Content-Type: application/json
X-ERP-Evento: estoque.alterado
X-ERP-Entrega: 9b1f… (id da entrega)
X-ERP-Assinatura: t=1762554180,v1=5d41402abc4b2a76b9719d911017c592…
{ "id": 1042, "tipo": "estoque.alterado", "criado_em": "2026-11-07T22:23:00Z", "tentativa": 1,
"dados": { "produto_id": "…", "erp_id": 1234, "saldo": 68, "reservado": 0, "disponivel": 68, "saldo_anterior": 70 } }
- Responda 2xx em até 10 s. Outra resposta = nova tentativa em 1 min, 5 min, 30 min, 2 h, 6 h e 24 h.
- Pode chegar repetido ou fora de ordem: use o
iddo evento para ignorar o que já tratou, e leia o estado atual pela API quando a ordem importar. - Muitas falhas seguidas desligam o endereço (o app mostra o motivo).
Conferir a assinatura
Assinatura = HMAC-SHA256 do texto t + "." + corpo com o seu segredo (mostrado uma vez ao cadastrar). Recuse se não bater ou se t tiver mais de 5 minutos.
Importante: confira com o corpo exatamente como chegou (os bytes crus da requisição), antes de transformar em objeto. Se você ler o JSON e montar o texto de novo, espaços e a ordem dos campos mudam e a assinatura não bate.
import crypto from 'node:crypto';
function assinaturaOk(corpoBruto, cabecalho, segredo) {
const p = Object.fromEntries(cabecalho.split(',').map((x) => x.split('=')));
if (Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false;
const esperado = crypto.createHmac('sha256', segredo).update(p.t + '.' + corpoBruto).digest('hex');
return crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(p.v1 || ''));
}
import hmac, hashlib, time
def assinatura_ok(corpo_bruto: bytes, cabecalho: str, segredo: str) -> bool:
p = dict(x.split('=', 1) for x in cabecalho.split(','))
if abs(time.time() - int(p['t'])) > 300: return False
esperado = hmac.new(segredo.encode(), p['t'].encode() + b'.' + corpo_bruto, hashlib.sha256).hexdigest()
return hmac.compare_digest(esperado, p.get('v1', ''))
function assinatura_ok(string $corpo, string $cab, string $segredo): bool {
parse_str(str_replace(',', '&', $cab), $p);
if (abs(time() - (int)$p['t']) > 300) return false;
return hash_equals(hash_hmac('sha256', $p['t'] . '.' . $corpo, $segredo), $p['v1'] ?? '');
}

Tipos de evento
| Evento | Quando | dados |
|---|---|---|
produto.criado | Produto novo cadastrado. | {"produto_id":"uuid","erp_id":1234,"nome":"Coador de pano","referencia":"CP-01","codigo_barras":"7890000000017"} |
produto.alterado | Algum campo do cadastro mudou. `campos` diz quais. | {"produto_id":"uuid","erp_id":1234,"nome":"Coador de pano","campos":["preco_venda","ncm"]} |
produto.fotos_alteradas | Foto adicionada, apagada, reordenada ou capa trocada. | {"produto_id":"uuid","erp_id":1234} |
estoque.alterado | O estoque do produto mudou (venda, entrada, ajuste, nota…). Sai também para a cartela e para cada kit virtual que usa a peça que mexeu, com o vendavel novo. | {"produto_id":"uuid","erp_id":1234,"referencia":"CP-01","codigo_barras":"7890000000017","saldo":70,"reservado":2,"disponivel":68,"saldo_anterior":71,"tipo_estoque":"simples","vendavel":68,"unidades_por_venda":1} |
pedido.criado | Pedido novo (de qualquer canal). | {"pedido_id":"uuid","numero":812,"id_externo":null,"status":"pendente","valor_total":129.9,"cliente_id":"uuid","canal":"app"} |
pedido.status_alterado | Status do pedido mudou. | {"pedido_id":"uuid","numero":812,"status":"faturado","status_anterior":"confirmado","valor_total":129.9} |
pedido.cancelado | Pedido cancelado. | {"pedido_id":"uuid","numero":812,"status":"cancelado"} |
nota.autorizada | NF-e/NFC-e autorizada pela SEFAZ. | {"nota_id":"uuid","pedido_id":"uuid","numero":43,"serie":1,"modelo":"55","chave":"3526…","valor_total":129.9} |
nota.cancelada | Nota cancelada. | {"nota_id":"uuid","pedido_id":"uuid","numero":43,"serie":1,"modelo":"55","chave":"3526…"} |
cliente.criado | Cliente novo. | {"cliente_id":"uuid","nome":"Mercado Bom Preço","documento":"12345678000190"} |
cliente.alterado | Cadastro do cliente mudou. | {"cliente_id":"uuid","nome":"Mercado Bom Preço","documento":"12345678000190"} |
envio.atualizado | Frete do pedido mudou: etiqueta gerada, rastreio, postado, entregue. | {"pedido_id":"uuid","envio_id":"uuid","status":"postado","transportadora":"Correios","codigo_rastreio":"AA123456789BR","rastreio_url":"https://…","tem_etiqueta":true} |
teste.ping | Disparado pelo botão Testar (ou POST /webhooks/{id}/teste). | {"mensagem":"Teste do ERP Connect Mobile","webhook_id":"uuid"} |
Assine grupos com "pedido.*" ou tudo com "*".
Feed de eventos
GET/v1/eventos
permissão eventos:read
Para quem não pode receber aviso automático: leia de tempos em tempos pedindo só o que veio depois do último id lido. Guardamos 30 dias.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
depois | inteiro | consulta | Último id que você já leu (0 na primeira vez). |
tipos | texto | consulta | Só estes tipos (vírgula), ex.: estoque.alterado,pedido.* |
por_pagina | inteiro | consulta | Até 500. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/eventos" \
-H "Authorization: Bearer $CHAVE"
Resposta
{
"dados": [
{
"id": 1042,
"tipo": "estoque.alterado",
"recurso_id": "uuid",
"criado_em": "…",
"dados": {
"saldo": 68
}
}
],
"ultimo_id": 1042,
"tem_mais": false
}
Listar avisos
GET/v1/webhooks
permissão webhooks:write
Endereços cadastrados (o segredo não volta).
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/webhooks" \
-H "Authorization: Bearer $CHAVE"
Cadastrar aviso
POST/v1/webhooks
permissão webhooks:writeaceita Idempotency-Key
Cadastra um endereço https que recebe um POST a cada evento escolhido ("*" = todos, "pedido.*" = todos de pedido). O segredo de assinatura volta UMA vez: guarde.
Corpo (JSON)
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
url obrigatório | texto | corpo | https://… (nome de domínio público, porta 443). |
eventos | lista de textos | corpo | Tipos de evento. Padrão: ["*"]. |
descricao | texto | corpo | Para você lembrar o que é. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/webhooks" \
-H "Authorization: Bearer $CHAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f9c2b1e-pedido-55821" \
-d '{"url":"https://meuerp.com.br/webhooks/erpconnect","eventos":["estoque.alterado","pedido.*"]}'
Resposta
{
"dados": {
"id": "uuid",
"segredo": "whsec_…",
"eventos": [
"estoque.alterado",
"pedido.*"
]
}
}
Erros específicos
| HTTP | Código | Quando |
|---|---|---|
| 422 | dado_invalido | Algum campo veio errado (o campo é informado). |
Remover aviso
DELETE/v1/webhooks/{webhook}
permissão webhooks:write
Para de mandar para o endereço.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
webhook obrigatório | id (uuid) | caminho | Id do aviso. |
Exemplo
curl -X DELETE "https://app.erpconnectmobile.com.br/api/v1/webhooks/{webhook}" \
-H "Authorization: Bearer $CHAVE"
Testar aviso
POST/v1/webhooks/{webhook}/teste
permissão webhooks:write
Manda um evento teste.ping no próximo minuto.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
webhook obrigatório | id (uuid) | caminho | Id do aviso. |
Exemplo
curl -X POST "https://app.erpconnectmobile.com.br/api/v1/webhooks/{webhook}/teste" \
-H "Authorization: Bearer $CHAVE"
Entregas do aviso
GET/v1/webhooks/{webhook}/entregas
permissão webhooks:write
Últimas 100 entregas: evento, tentativa, código HTTP que seu servidor respondeu e o erro.
Parâmetros
| Nome | Tipo | Onde | Descrição |
|---|---|---|---|
webhook obrigatório | id (uuid) | caminho | Id do aviso. |
Exemplo
curl -X GET "https://app.erpconnectmobile.com.br/api/v1/webhooks/{webhook}/entregas" \
-H "Authorization: Bearer $CHAVE"
Todos os campos do produto
Cada campo tem rota própria: GET /v1/produtos/{produto}/campos/{campo} para ler e PUT …/campos/{campo} com {"valor": …} para gravar. Os mesmos nomes valem em POST /produtos e PATCH /produtos/{produto}.
Identificação
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
id | id (uuid) | não | Identificador interno (não muda nunca). |
erp_id | inteiro | não | Código numérico do produto na empresa. |
referencia | texto (até 60) | sim | SKU / referência. Também serve para achar o produto: /produtos/sku:CP-01. |
codigo_barras | texto (até 50) | sim | Código de barras principal (EAN/GTIN). Outros códigos: /codigos-barras. |
codigo_balanca | texto (até 20) | sim | Código do item na balança (PLU). |
tipo_produto | texto | não | venda, kit ou base (componente). Base não aparece nas listas sem ?incluir_base=1. |
Descrição
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
nome | texto (até 200) | sim | Nome do produto. |
descricao | texto (até 5000) | sim | Descrição longa. |
marca | texto (até 80) | sim | Marca. |
modelo | texto (até 80) | sim | Modelo. |
variante | texto (até 80) | sim | Variante (cor, tamanho, sabor) quando o produto é uma variação. |
unidade | texto (até 6) | sim | Unidade de venda (UN, CX, KG, PCT…). |
foto_principal_url | texto | não | Foto de capa. Para mudar, use /fotos. |
Medidas
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
peso_kg | número | sim | Peso bruto em kg. |
altura_cm | número | sim | Altura da embalagem em cm. |
largura_cm | número | sim | Largura em cm. |
comprimento_cm | número | sim | Comprimento em cm. |
Fiscal
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
ncm | texto (até 8) | sim | NCM (8 dígitos). |
cest | texto (até 7) | sim | CEST (7 dígitos). |
cfop_padrao | texto (até 4) | sim | CFOP padrão de venda. |
origem_mercadoria | texto (até 1) | sim | Origem (0 a 8, tabela da SEFAZ). |
csosn_padrao | texto (até 3) | sim | CSOSN (Simples Nacional). |
cst_icms_padrao | texto (até 3) | sim | CST do ICMS (regime normal). |
aliquota_icms_padrao | número | sim | Alíquota de ICMS (%). |
reducao_bc_icms_pct | número | sim | Redução da base do ICMS (%). |
mva_st_pct | número | sim | MVA da substituição tributária (%). |
aliquota_icms_st_pct | número | sim | Alíquota do ICMS-ST (%). |
fcp_pct | número | sim | Fundo de Combate à Pobreza (%). |
cbenef | texto (até 10) | sim | Código de benefício fiscal. |
cst_pis_padrao | texto (até 2) | sim | CST do PIS. |
aliquota_pis_padrao | número | sim | Alíquota do PIS (%). |
cst_cofins_padrao | texto (até 2) | sim | CST da COFINS. |
aliquota_cofins_padrao | número | sim | Alíquota da COFINS (%). |
cst_ipi_padrao | texto (até 2) | sim | CST do IPI. |
aliquota_ipi_padrao | número | sim | Alíquota do IPI (%). |
Preço e custo
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
preco_venda | número | sim | Preço de venda (R$). Kit não aceita preço pela API (precisa do aval no app). |
desconto_max_pct | número | sim | Desconto máximo permitido ao vendedor (%). |
custo_medio | número | não custos:read | Custo médio ponderado (R$). |
ultimo_custo | número | não custos:read | Custo da última entrada (R$). |
margem_padrao_pct | número | não custos:read | Margem padrão (%). |
margem_minima_produto | número | não custos:read | Margem mínima (%). |
Estoque
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
estoque | número | não | Saldo total (soma dos lotes). Para mudar, use /estoque. |
estoque_reservado | número | não | Reservado para pedidos. |
proxima_validade | data | não | Validade mais próxima entre os lotes. |
estoque_minimo | número | sim | Estoque mínimo (alerta de compra). |
estoque_ideal | número | sim | Estoque ideal. |
unidade_compra_nome | texto (até 20) | sim | Nome da unidade de compra (ex.: CX). |
unidade_estoque_nome | texto (até 20) | sim | Nome da unidade de estoque (ex.: UN). |
fator_conversao_compra | número | não | Quantas unidades de estoque vêm numa unidade de compra. |
controla_lote_fabricante | true/false | sim | Pede o lote do fabricante na entrada. |
Onde vende
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
ativo | true/false | sim | Ativo no sistema. |
visivel_venda | true/false | sim | Aparece para vender (pedido, catálogo, loja). |
visivel_pdv | true/false | sim | Aparece no caixa (PDV). |
ativo_marketplace | true/false | sim | Liberado para anunciar em marketplaces. |
Categoria
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
categoria_id | id (uuid) | sim | Categoria (ver /categorias). |
subcategoria_id | id (uuid) | sim | Subcategoria (ver /categorias). |
categoria | texto | não | Nome da categoria (só leitura; para mudar use categoria_id). |
subcategoria | texto | não | Nome da subcategoria (só leitura). |
Controle
| Campo | Tipo | Grava? | Descrição |
|---|---|---|---|
created_at | data e hora | não | Criado em. |
updated_at | data e hora | não | Alterado em (use em ?alterado_desde=). |
Mudanças da API
| Data | Versão | O que mudou |
|---|---|---|
| 08/11/2026 | 1.2.2 | O "vendavel" desconta também o que já foi prometido a cliente (venda que ficou sem estoque e espera mercadoria): quando a mercadoria chega, essas unidades não aparecem como livres. Kit virtual desconta também venda pendente da peça vendida avulsa. |
| 08/11/2026 | 1.2.1 | Produtos e clientes de demonstração (que toda conta nova traz) não aparecem mais em nenhuma rota, aviso ou conector — nem antes, nem depois de a empresa limpar a demonstração. |
| 08/11/2026 | 1.2.0 | Estoque com "vendavel" (o que dá para vender, na unidade de venda: caixa inteira, cartela lacrada, kit virtual que dá para montar), tipo_estoque, cartelas_lacradas e soltas_da_cartela. "unidade": "venda" na entrada, saída e saldo. Cartela entra só lacrada (cartela_incompleta); cartela e kit virtual recusam saída/saldo pela API. estoque.alterado sai também para a cartela e os kits virtuais de cada peça que mudou. |
| 08/11/2026 | 1.1.0 | Vendas do caixa (/pdv/vendas) passam a trazer cupom_regra_id, o cupom de desconto aplicado na venda. |
| 07/11/2026 | 1.0.0 | Lançamento da API v1: produtos (cada campo), 12 fotos, códigos de barras, estoque com lote/validade/local (entrada, saída, saldo, balanço), clientes, fornecedores, pedidos, cupom, envio, etiquetas, notas com XML, contas a receber, PDV, cardápio, balança, feed de eventos e avisos automáticos (webhooks). |
Mudança que quebra integração existente nunca entra na v1: vira v2, e a v1 continua funcionando.
Suporte
Deu erro, ficou com dúvida ou quer um conector novo? Fale direto com o desenvolvedor no WhatsApp (11) 99123-0856. Mande a rota, a hora e o X-Request-Id da resposta.