ERP Connect MobileAPI para desenvolvedores · v1.2.2

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.
Endereço da API
https://app.erpconnectmobile.com.br/api/v1
Endereço direto (mesma API): https://aylmiszdvdlpdugkwzql.supabase.co/functions/v1/catalogo-api/v1

Primeiros passos

  1. Gere a chave no app (passo a passo com prints logo abaixo).
  2. 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();

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.

  1. No app, abra Painel › Integrações (ou Minha conta › Integrações).
  2. Desça até API para outros sistemas, dê um nome (ex.: "Bling" ou "Balança do açougue") e marque as permissões.
  3. Toque em Gerar chave. A chave aparece uma vez só: copie e guarde num lugar seguro.
  4. Perdeu ou vazou? Toque em Revogar e gere outra. A antiga para na hora.
Integrações › API para outros sistemas: nome e permissões
Integrações › API para outros sistemas: nome e permissões
A chave aparece uma vez só: copie e guarde
A chave aparece uma vez só: copie e guarde
Chaves ativas, último uso e o botão Revogar
Chaves ativas, último uso e o botão Revogar

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ãoNome no appO que libera
produtos:readLer produtosCadastro, fotos, códigos de barras, categorias, preços, etiquetas e balança.
produtos:write escritaAlterar produtosCriar e alterar produtos, categorias e códigos de barras.
fotos:write escritaAlterar fotosEnviar, ordenar, trocar a capa e apagar as fotos (até 12 por produto).
custos:read sensívelVer custo e margemInclui custo médio, último custo e margens nas respostas. Dado sensível.
estoque:readLer estoqueSaldo, reservado, disponível, por local, por lote e validade, movimentos e locais.
estoque:write escritaDar entrada no estoqueSó soma: cria lote novo (com validade, se vier).
estoque:ajustar escrita sensívelTirar e acertar estoqueSaída, saldo absoluto e balanço. Tira pela validade mais próxima.
pedidos:readLer pedidosPedidos, itens, histórico, cupom, envio e etiqueta de envio.
pedidos:write escritaCriar pedidosPedido de outro sistema entra em Processados (como venda de marketplace).
clientes:readLer clientesCadastro de clientes.
clientes:write escritaAlterar clientesCriar e alterar clientes.
fornecedores:readLer fornecedoresCadastro de fornecedores.
fornecedores:write escritaAlterar fornecedoresCriar e alterar fornecedores.
notas:readLer notas fiscaisNF-e/NFC-e emitidas: dados, chave, XML autorizado.
financeiro:read sensívelLer financeiroContas a receber.
pdv:readLer vendas do caixaVendas do PDV e cardápio.
eventos:readLer eventosFeed de eventos para quem não recebe aviso automático.
webhooks:write escritaGerir avisos automáticosCadastrar, 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/" }
HTTPQuando
200 / 201Deu certo (201 = criou).
207Lista com resultado por item: alguns deram certo, outros não (veja resultados).
400Parâmetro ou JSON errado.
401 / 403Chave ausente/inválida · sem a permissão.
402Licença da empresa vencida: leitura continua, escrita para.
404Não existe nesta empresa (a chave nunca enxerga outra empresa).
409Conflito: código repetido, saldo insuficiente, estado não permite.
422Campo inválido (o nome vem em campo).
429Limite por minuto.
5xxProblema 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çãoO que acontece
Você lê o estoqueGET /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 localVai 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 loteTiramos 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á zeradoMande 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 caixaMande "unidade": "venda" na entrada, saída ou saldo: 2 caixas de 12 viram 24 unidades aqui.
Cartela e kit virtualVeja 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 soltasO 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çavendavel: 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 vendavel como número absoluto: ao receber estoque.alterado (ou ao ler GET /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/movimentos a abertura aparece como tipo: "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 vendavel vai 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) ou balanca:PLU. Cliente: id ou doc:CNPJ. Pedido: id, n:NUMERO ou ext: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=ID de 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

SistemaSituaçãoComo
Mercado LivreIntegrado no appIntegrações › Mercado Livre (login seguro). Anúncio, estoque, preço, fotos, pedidos, etiqueta, NF-e e perguntas.
ShopeeIntegrado no appIntegrações › Shopee. Anúncio, estoque, pedidos e etiqueta.
MagaluIntegrado no appIntegrações › Magalu. Anúncio, estoque, pedidos e perguntas.
TikTok ShopEm teste / homologaçãoIntegrações › TikTok Shop (app em avaliação na TikTok).
KaBuM! (Mirakl)Em teste / homologaçãoIntegrações › KaBuM: cole a chave de API do painel do vendedor. Mesmo motor de Carrefour, Leroy Merlin, Centauro e Decathlon.
Casas BahiaIntegrado no appIntegrações › Casas Bahia (cole o token do portal do lojista). Anúncio, estoque, preço, pedidos, enviado e entregue.

ERPs

SistemaSituaçãoComo
Bling (API v3)Em teste / homologaçãoConector 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çãoConector 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.
OmieEm teste / homologaçãoConector 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 AzulConector planejadoSem webhooks: sincronize por alterado_desde. Estoque só pelo cadastro: mande o saldo total.
MercosEm teste / homologaçãoConector 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.
PedidoOKIntegrado no appIntegrações › Sistema de pedidos (ERP). Produtos, clientes e pedidos; estoque absoluto, sem lote (mandamos o saldo total).
vhsysConector planejadoEstoque só por lançamento (entrada/saída): use /estoque/entradas e /estoque/saidas.
SankhyaConector planejadoEstoque por empresa/local/controle (lote) e só por movimento: casa com entradas e saídas com lote.
OdooConecta pela nossa APIO Odoo chama APIs REST externas (módulo ou automação): use esta API com a chave da empresa.
SAP Business OneConecta pela nossa APIPelo Service Layer com um integrador: ele lê/grava nesta API.
TOTVS Protheus / Senior / LinxConecta pela nossa APIPela camada de integração do próprio ERP (REST): use esta API e os avisos automáticos.
Sistema próprio ou sob medidaConecta pela nossa APIQualquer linguagem que faça HTTPS + JSON (ou CSV). Comece por GET /v1/status.

Lojas virtuais e hubs

SistemaSituaçãoComo
NuvemshopConecta pela nossa APIEstoque replace (absoluto) ou variation (soma/subtrai): /estoque/{p}/saldo ou entradas/saídas.
TrayConecta pela nossa APIUse a lista de produtos com fotos (12 URLs) e o saldo total.
ShopifyConecta pela nossa APIAplicativo/automação lê /produtos e /estoque e assina estoque.alterado.
VTEXConecta pela nossa APICatálogo, preço e estoque por depósito: mande o saldo total por SKU.
ANYMARKET / Plugg.to / Hub2bConecta pela nossa APIO hub lê o catálogo e o estoque desta API e devolve os pedidos em POST /pedidos.
n8n, Make, Zapier, Power AutomateConecta pela nossa APINó HTTP com a chave no cabeçalho + gatilho por aviso automático (webhook) assinado.

WMS e logística

SistemaSituaçãoComo
Melhor EnvioIntegrado no appFrete integrado no app: cotação, etiqueta e rastreio. Leia por /pedidos/{p}/envio.
Senior WMSConecta pela nossa APISaldo por lote e endereço: /estoque/{produto} devolve lote, validade e local no mesmo formato.
Intelipost / FrenetConecta pela nossa APIUse o pedido (/pedidos/{p}), o envio e o XML da nota (/notas/{n}/xml).
WMS de terceiros (Infor, Manhattan, Linx WMS)Conecta pela nossa APIRecebimento = /estoque/entradas com lote e validade; expedição = pedidos + avisos pedido.*.

Apps de comida e delivery

SistemaSituaçãoComo
iFoodEm teste / homologaçãoConector 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 WebConector planejadoO padrão manda só disponível sim/não por item: /cardapio já devolve disponivel e complementos.
RappiConector planejadoDisponibilidade por SKU (até 100 por chamada): use /cardapio ou /estoque.
Anota AI, Goomer, Saipos, OlaClickConecta pela nossa APISem 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

SistemaSituaçãoComo
Balança Toledo (MGV)Por arquivo (exportar/importar)GET /balanca/itens?formato=toledo devolve o ITENSMGV.TXT para o MGV importar.
Balança FilizolaPor arquivo (exportar/importar)GET /balanca/itens?formato=filizola devolve o CADTXT.TXT.
Etiqueta de balança (EAN-13 prefixo 2)Integrado no appO 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

SistemaSituaçãoComo
AsaasIntegrado no appBoleto e Pix no app; parcelas em /contas-receber.
Mercado Pago, PagBank, Stone, CieloConecta pela nossa APIConciliaçã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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
buscatextoconsultaProcura no nome, referência e código de barras.
ativotrue/falseconsultatrue (padrão), false ou todos.
categoria_idid (uuid)consultaSó desta categoria.
incluir_basetrue/falseconsultaInclui produtos base (componentes de kit).
campostextoconsultaSó 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

HTTPCódigoQuando
404nao_encontradoO 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)

NomeTipoOndeDescrição
nome obrigatóriotextocorpoNome do produto.
…textocorpoQualquer 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

HTTPCódigoQuando
422dado_invalidoAlgum campo veio errado (o campo é informado).
409conflitoJá 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
422dado_invalidoAlgum 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

HTTPCódigoQuando
404nao_encontradoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
campo obrigatóriotextocaminhoNome 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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
400campo_desconhecidoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
campo obrigatóriotextocaminhoNome 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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
422dado_invalidoAlgum campo veio errado (o campo é informado).
403campo_somente_leituraO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01

Corpo (JSON)

NomeTipoOndeDescrição
urltextocorpoEndereço https da imagem (ou use base64).
base64base64corpoImagem em base64 (com ou sem "data:image/jpeg;base64,").
capatrue/falsecorpoPõ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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
422dado_invalidoAlgum campo veio errado (o campo é informado).
409limite_fotosO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

HTTPCódigoQuando
422dado_invalidoAlgum 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
foto obrigatórioid (uuid)caminhoId 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
foto obrigatórioid (uuid)caminhoId 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01

Corpo (JSON)

NomeTipoOndeDescrição
codigo obrigatóriotextocorpoO código.
unidadesinteirocorpoQuantas unidades o código representa (caixa com 12 = 12). Padrão 1.
apelidotextocorpoNome 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

HTTPCódigoQuando
409conflitoJá existe (código repetido) ou o estado atual não permite.
422dado_invalidoAlgum 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
codigo obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
categoria obrigatórioid (uuid)caminhoId 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
tabela obrigatórioid (uuid)caminhoId da tabela.
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
formatotextoconsultajson (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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
vencendo_atedataconsultaSó lotes com validade até esta data.
local_idid (uuid)consultaSó 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

NomeTipoOndeDescrição
desdedata e horaconsultaSó a partir desta data/hora.
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
formatotextoconsultajson (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)

NomeTipoOndeDescrição
produto obrigatóriotextocorpoIdentificador do produto (5 jeitos).
quantidade obrigatórionúmerocorpoQuantidade na unidade de estoque (inteiro > 0).
unidadetextocorpo"estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras.
local_idid (uuid)corpoLocal de destino (ver /locais).
validadedatacorpoValidade do lote (AAAA-MM-DD).
lotetextocorpoNúmero do lote do fabricante.
custo_unitarionúmerocorpoCusto 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

HTTPCódigoQuando
422estoque_sem_localControle por lote, sem local informado, produto sem endereço e empresa sem local padrão.
422cartela_incompletaCartela com quantidade que não fecha cartela inteira (ex.: 15 numa cartela de 12).
409produto_sem_estoque_proprioKit 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)

NomeTipoOndeDescrição
produto obrigatóriotextocorpoIdentificador do produto.
quantidade obrigatórionúmerocorpoQuanto tirar.
unidadetextocorpo"estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras.
local_idid (uuid)corpoSó deste local.
motivotextocorpoAparece no histórico do app.
previatrue/falsecorpoSó 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

HTTPCódigoQuando
409saldo_insuficienteNão tem o suficiente.
409produto_sem_estoque_proprioKit 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01

Corpo (JSON)

NomeTipoOndeDescrição
quantidade obrigatórionúmerocorpoSaldo que deve ficar.
unidadetextocorpo"estoque" (padrão) ou "venda": a quantidade em caixas/cartelas inteiras.
local_idid (uuid)corpoAcerta só este local.
motivotextocorpoAparece no histórico.
previatrue/falsecorpoSó 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
buscatextoconsultaNome, fantasia ou documento.
documentotextoconsultaCNPJ/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

NomeTipoOndeDescrição
cliente obrigatóriotextocaminhoId 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

HTTPCódigoQuando
404nao_encontradoO 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)

NomeTipoOndeDescrição
razao_social obrigatóriotextocorporazao social
fantasiatextocorpofantasia
cnpj_cpftextocorpocnpj cpf
inscricao_estadualtextocorpoinscricao estadual
ind_ie_desttextocorpoind ie dest
emailtextocorpoemail
telefonetextocorpotelefone
ceptextocorpocep
logradourotextocorpologradouro
numerotextocorponumero
complementotextocorpocomplemento
bairrotextocorpobairro
cidadetextocorpocidade
uftextocorpouf
codigo_municipiotextocorpocodigo municipio
limite_creditonúmerocorpolimite credito
observacaotextocorpoobservacao
ativotrue/falsecorpoativo

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

HTTPCódigoQuando
409conflitoJá existe (código repetido) ou o estado atual não permite.
422dado_invalidoAlgum 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

NomeTipoOndeDescrição
cliente obrigatóriotextocaminhoId 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
buscatextoconsultaNome 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

NomeTipoOndeDescrição
fornecedor obrigatóriotextocaminhoId 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)

NomeTipoOndeDescrição
razao_social obrigatóriotextocorporazao social
fantasiatextocorpofantasia
cnpj_cpftextocorpocnpj cpf
inscricao_estadualtextocorpoinscricao estadual
emailtextocorpoemail
telefonetextocorpotelefone
whatsapptextocorpowhatsapp
ceptextocorpocep
endereco_ruatextocorpoendereco rua
endereco_numerotextocorpoendereco numero
endereco_bairrotextocorpoendereco bairro
endereco_cidadetextocorpoendereco cidade
endereco_estadotextocorpoendereco estado
responsavel_nometextocorporesponsavel nome
condicao_pagamentotextocorpocondicao pagamento
prazo_medio_diasnúmerocorpoprazo medio dias
lead_time_diasnúmerocorpolead time dias
pedido_minimo_valornúmerocorpopedido minimo valor
observacoestextocorpoobservacoes
ativotrue/falsecorpoativo

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

NomeTipoOndeDescrição
fornecedor obrigatóriotextocaminhoId 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
desdedata e horaconsultaCriados a partir de.
statustextoconsultarascunho, pendente, confirmado, finalizado, faturado, cancelado (vários com vírgula).
cliente_idid (uuid)consultaSó deste cliente.
com_itenstrue/falseconsultaInclui 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

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, 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

HTTPCódigoQuando
404nao_encontradoO 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)

NomeTipoOndeDescrição
id_externo obrigatóriotextocorpoNúmero do pedido no seu sistema.
clientetextocorpoId do cliente ou doc:CNPJ (opcional).
itens obrigatóriolistacorpoLista: produto, quantidade, preco_unitario.
valor_fretenúmerocorpoFrete cobrado.
observacoestextocorpoObservações.
criado_emdata e horacorpoQuando 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

HTTPCódigoQuando
422dado_invalidoAlgum campo veio errado (o campo é informado).
422item_sem_produtoUm 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

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, 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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
409conflitoJá 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

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, 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

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, n:NUMERO ou ext:ID.
formatotextoconsultatxt (padrão), html ou json.
colunasinteiroconsulta32, 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

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, 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

NomeTipoOndeDescrição
produto obrigatóriotextocaminhoO produto, de 5 jeitos: id (uuid), código numérico (1234), sku:REF, ean:CODIGO ou balanca:PLU. Ex.: sku:CP-01
formatotextoconsultajson (padrão) ou zpl.
copiasinteiroconsultaCó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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
statustextoconsultaautorizada, cancelada, rejeitada…
modelotextoconsulta55 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

NomeTipoOndeDescrição
nota obrigatóriotextocaminhoId 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

NomeTipoOndeDescrição
nota obrigatóriotextocaminhoId 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

HTTPCódigoQuando
404nao_encontradoO item não existe nesta empresa.
409sem_xmlA nota não foi autorizada.

Notas do pedido

GET/v1/pedidos/{pedido}/notas

permissão notas:read

Notas emitidas para o pedido.

Parâmetros

NomeTipoOndeDescrição
pedido obrigatóriotextocaminhoId, 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
alterado_desdedata e horaconsultaSó o que mudou depois desta data/hora (ISO 8601). Use para sincronizar só a diferença. Ex.: 2026-11-07T00:00:00-03:00
formatotextoconsultajson (padrão) ou csv (planilha, separador ;). Ex.: csv
statustextoconsultaaberto, pago, vencido, cancelado.
vencimento_atedataconsultaVence 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

NomeTipoOndeDescrição
paginainteiroconsultaPágina (começa em 1). Ex.: 1
por_paginainteiroconsultaItens por página (1 a 500, padrão 100). Ex.: 100
desdedata e horaconsultaA partir de.
formatotextoconsultajson (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

NomeTipoOndeDescrição
formatotextoconsultajson (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 id do 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 || ''));
}
Integrações › Avisos automáticos: endereço, eventos e o botão Testar
Integrações › Avisos automáticos: endereço, eventos e o botão Testar

Tipos de evento

EventoQuandodados
produto.criadoProduto novo cadastrado.{"produto_id":"uuid","erp_id":1234,"nome":"Coador de pano","referencia":"CP-01","codigo_barras":"7890000000017"}
produto.alteradoAlgum campo do cadastro mudou. `campos` diz quais.{"produto_id":"uuid","erp_id":1234,"nome":"Coador de pano","campos":["preco_venda","ncm"]}
produto.fotos_alteradasFoto adicionada, apagada, reordenada ou capa trocada.{"produto_id":"uuid","erp_id":1234}
estoque.alteradoO 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.criadoPedido 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_alteradoStatus do pedido mudou.{"pedido_id":"uuid","numero":812,"status":"faturado","status_anterior":"confirmado","valor_total":129.9}
pedido.canceladoPedido cancelado.{"pedido_id":"uuid","numero":812,"status":"cancelado"}
nota.autorizadaNF-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.canceladaNota cancelada.{"nota_id":"uuid","pedido_id":"uuid","numero":43,"serie":1,"modelo":"55","chave":"3526…"}
cliente.criadoCliente novo.{"cliente_id":"uuid","nome":"Mercado Bom Preço","documento":"12345678000190"}
cliente.alteradoCadastro do cliente mudou.{"cliente_id":"uuid","nome":"Mercado Bom Preço","documento":"12345678000190"}
envio.atualizadoFrete 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.pingDisparado 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

NomeTipoOndeDescrição
depoisinteiroconsultaÚltimo id que você já leu (0 na primeira vez).
tipostextoconsultaSó estes tipos (vírgula), ex.: estoque.alterado,pedido.*
por_paginainteiroconsultaAté 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)

NomeTipoOndeDescrição
url obrigatóriotextocorpohttps://… (nome de domínio público, porta 443).
eventoslista de textoscorpoTipos de evento. Padrão: ["*"].
descricaotextocorpoPara 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

HTTPCódigoQuando
422dado_invalidoAlgum 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

NomeTipoOndeDescrição
webhook obrigatórioid (uuid)caminhoId 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

NomeTipoOndeDescrição
webhook obrigatórioid (uuid)caminhoId 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

NomeTipoOndeDescrição
webhook obrigatórioid (uuid)caminhoId 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

CampoTipoGrava?Descrição
idid (uuid)nãoIdentificador interno (não muda nunca).
erp_idinteironãoCódigo numérico do produto na empresa.
referenciatexto (até 60)simSKU / referência. Também serve para achar o produto: /produtos/sku:CP-01.
codigo_barrastexto (até 50)simCódigo de barras principal (EAN/GTIN). Outros códigos: /codigos-barras.
codigo_balancatexto (até 20)simCódigo do item na balança (PLU).
tipo_produtotextonãovenda, kit ou base (componente). Base não aparece nas listas sem ?incluir_base=1.

Descrição

CampoTipoGrava?Descrição
nometexto (até 200)simNome do produto.
descricaotexto (até 5000)simDescrição longa.
marcatexto (até 80)simMarca.
modelotexto (até 80)simModelo.
variantetexto (até 80)simVariante (cor, tamanho, sabor) quando o produto é uma variação.
unidadetexto (até 6)simUnidade de venda (UN, CX, KG, PCT…).
foto_principal_urltextonãoFoto de capa. Para mudar, use /fotos.

Medidas

CampoTipoGrava?Descrição
peso_kgnúmerosimPeso bruto em kg.
altura_cmnúmerosimAltura da embalagem em cm.
largura_cmnúmerosimLargura em cm.
comprimento_cmnúmerosimComprimento em cm.

Fiscal

CampoTipoGrava?Descrição
ncmtexto (até 8)simNCM (8 dígitos).
cesttexto (até 7)simCEST (7 dígitos).
cfop_padraotexto (até 4)simCFOP padrão de venda.
origem_mercadoriatexto (até 1)simOrigem (0 a 8, tabela da SEFAZ).
csosn_padraotexto (até 3)simCSOSN (Simples Nacional).
cst_icms_padraotexto (até 3)simCST do ICMS (regime normal).
aliquota_icms_padraonúmerosimAlíquota de ICMS (%).
reducao_bc_icms_pctnúmerosimRedução da base do ICMS (%).
mva_st_pctnúmerosimMVA da substituição tributária (%).
aliquota_icms_st_pctnúmerosimAlíquota do ICMS-ST (%).
fcp_pctnúmerosimFundo de Combate à Pobreza (%).
cbeneftexto (até 10)simCódigo de benefício fiscal.
cst_pis_padraotexto (até 2)simCST do PIS.
aliquota_pis_padraonúmerosimAlíquota do PIS (%).
cst_cofins_padraotexto (até 2)simCST da COFINS.
aliquota_cofins_padraonúmerosimAlíquota da COFINS (%).
cst_ipi_padraotexto (até 2)simCST do IPI.
aliquota_ipi_padraonúmerosimAlíquota do IPI (%).

Preço e custo

CampoTipoGrava?Descrição
preco_vendanúmerosimPreço de venda (R$). Kit não aceita preço pela API (precisa do aval no app).
desconto_max_pctnúmerosimDesconto máximo permitido ao vendedor (%).
custo_medionúmeronão custos:readCusto médio ponderado (R$).
ultimo_custonúmeronão custos:readCusto da última entrada (R$).
margem_padrao_pctnúmeronão custos:readMargem padrão (%).
margem_minima_produtonúmeronão custos:readMargem mínima (%).

Estoque

CampoTipoGrava?Descrição
estoquenúmeronãoSaldo total (soma dos lotes). Para mudar, use /estoque.
estoque_reservadonúmeronãoReservado para pedidos.
proxima_validadedatanãoValidade mais próxima entre os lotes.
estoque_minimonúmerosimEstoque mínimo (alerta de compra).
estoque_idealnúmerosimEstoque ideal.
unidade_compra_nometexto (até 20)simNome da unidade de compra (ex.: CX).
unidade_estoque_nometexto (até 20)simNome da unidade de estoque (ex.: UN).
fator_conversao_compranúmeronãoQuantas unidades de estoque vêm numa unidade de compra.
controla_lote_fabricantetrue/falsesimPede o lote do fabricante na entrada.

Onde vende

CampoTipoGrava?Descrição
ativotrue/falsesimAtivo no sistema.
visivel_vendatrue/falsesimAparece para vender (pedido, catálogo, loja).
visivel_pdvtrue/falsesimAparece no caixa (PDV).
ativo_marketplacetrue/falsesimLiberado para anunciar em marketplaces.

Categoria

CampoTipoGrava?Descrição
categoria_idid (uuid)simCategoria (ver /categorias).
subcategoria_idid (uuid)simSubcategoria (ver /categorias).
categoriatextonãoNome da categoria (só leitura; para mudar use categoria_id).
subcategoriatextonãoNome da subcategoria (só leitura).

Controle

CampoTipoGrava?Descrição
created_atdata e horanãoCriado em.
updated_atdata e horanãoAlterado em (use em ?alterado_desde=).

Mudanças da API

DataVersãoO que mudou
08/11/20261.2.2O "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/20261.2.1Produtos 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/20261.2.0Estoque 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/20261.1.0Vendas do caixa (/pdv/vendas) passam a trazer cupom_regra_id, o cupom de desconto aplicado na venda.
07/11/20261.0.0Lanç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.

Chamar no WhatsApp