LubConsulta Connect← Voltar ao manual e console
Referência de integração · v1

Campos de cada chamada

Parâmetros, corpo enviado e resposta de todas as rotas públicas do Connect. Os exemplos de uso e o console interativo permanecem no manual principal. Esta referência descreve o contrato da API de produção.

Convenções

TermoSignificado
ObrigatórioEnvie o campo para uma operação válida. “Condicional” significa que a regra depende dos outros campos ou de criar versus atualizar.
Opcional / nuloEm JSON, os nomes são camelCase. Um campo marcado como anulável pode voltar como null; listas vazias voltam como [].
UUIDIdentificador interno. Não confunda ID de uma linha da venda com ID de um cadastro de produto ou serviço.
DecimalNúmero JSON com ponto decimal, sem “R$”; valores monetários estão em reais.
Data/horaEnvie filtros de período em ISO 8601 com fuso explícito, preferencialmente UTC (ex.: 2026-09-24T12:00:00Z). Leia o fuso efetivamente serializado nos retornos.
BearerExceto na geração do token, envie Authorization: Bearer {accessToken}. A chave da API não deve ir nas demais chamadas.
EscritaPOST e PATCH operacionais exigem Idempotency-Key novo por operação. Repetir a mesma chave e corpo devolve a resposta salva; trocar o corpo gera 409.

Consultar grupos e subgrupos

GET /v1/operacoes/produtos/classificacoes

Catálogo de classificações disponível para vincular produtos. É somente leitura nesta API.

Envio

CampoLocal / tipoObrigatórioDescrição
AuthorizationHeader · BearerSimToken com acesso à consulta de produtos.
empresaIdQuery · UUIDSimEmpresa permitida na chave; não use X-Empresa-Id nesta chamada.

Resposta 200

CampoTipoNulo?Descrição
grupos[]object[]NãoGrupos disponíveis. Cada objeto inclui os subgrupos associados.
grupos[].idUUIDNãoEnvie como grupoId ao importar produto.
grupos[].codigostringNãoCódigo de referência do grupo.
grupos[].nomestringNãoNome exibido do grupo.
grupos[].subgrupos[]object[]NãoSubgrupos pertencentes a esse grupo.
grupos[].subgrupos[].idUUIDNãoEnvie como subgrupoId ao importar produto.
grupos[].subgrupos[].codigostringNãoCódigo de referência do subgrupo.
grupos[].subgrupos[].nomestringNãoNome exibido do subgrupo.
subgruposSemGrupo[]object[]NãoSubgrupos sem grupo associado; também contêm id, codigo e nome.
O vínculo entre grupoId e subgrupoId é validado na importação. Os campos textuais grupo e subgrupo do layout não substituem esses IDs.

Importar produtos

POST /v1/operacoes/produtos/importacoes

Valida ou grava um lote de 1 a 500 produtos. O mesmo produto externo é atualizado em novas importações. A resposta 200 não garante sucesso de todos os itens: examine resultados[].

Headers

CampoTipoObrigatórioDescrição
AuthorizationBearer JWTSimToken com produtos.importar.
Idempotency-KeyUUIDSimUUID por tentativa. Use outro ao passar de validação para gravação.

Corpo enviado — lote

CampoTipoObrigatórioDescrição
versaoLayoutstringNãoVersão aceita: 1.0; é o padrão se omitida.
idLotestringSimIdentificador do lote no sistema de origem, até 100 caracteres.
sistemaOrigemstringSimIdentifica o parceiro, até 80 caracteres; usado para reencontrar idExterno.
empresaIdUUIDSimEmpresa que receberá os produtos; precisa ser permitida na chave.
somenteValidarbooleanNãoPadrão false. Se true, simula as ações e pendências sem criar/atualizar produtos.
produtos[]object[]SimEntre 1 e 500 objetos de produto.

Corpo enviado — cada produtos[]

CampoTipoObrigatórioDescrição / limite
idExternostringSimID estável no sistema de origem, até 100 caracteres; identifica criação versus atualização.
skustringNãoCódigo interno, até 50 caracteres. Na criação sem SKU, a API gera um.
nomestringNa criaçãoNome do produto, até 200 caracteres.
descricaostringNãoDescrição, até 500 caracteres.
eanstringNãoCódigo de barras, até 14 caracteres; não pode conflitar com outro produto.
referenciaFabricantestringNãoReferência do fabricante, até 50 caracteres.
marcastringNãoMarca, até 200 caracteres.
grupoIdUUIDNãoID ativo retornado na consulta de classificações.
subgrupoIdUUIDNãoID ativo; se houver grupo, precisa pertencer a ele.
grupostringNão enviarCampo legado do layout. Valor preenchido é rejeitado; use grupoId.
subgrupostringNão enviarCampo legado do layout. Valor preenchido é rejeitado; use subgrupoId.
unidadestringNãoUnidade de venda, até 10 caracteres; padrão UN na criação.
ativobooleanNãoDisponibilidade cadastral; padrão true na criação.
vendavelbooleanNãoPermite venda; padrão true na criação.
controlaEstoquebooleanNa criaçãoDefine se o estoque do produto será controlado.
permiteFracionamentobooleanNãoPermite quantidades fracionadas; padrão false na criação.
precificacaoobjectNãoPreço; subcampos abaixo.
fiscalobjectNãoClassificação fiscal; subcampos abaixo.

Objetos de preço e fiscal

CampoTipoObrigatórioDescrição
precificacao.tipostringNãoLayout prevê PRECO_FIXO. A implementação atual grava preço fixo; não há outra modalidade operacional.
precificacao.precoVendadecimalNãoPreço de venda em reais, maior ou igual a zero.
precificacao.precoCustodecimalNãoCusto em reais, maior ou igual a zero.
fiscal.ncmstringNãoNCM com 8 dígitos.
fiscal.ceststringNãoCEST com 7 dígitos.
fiscal.origemMercadoriaintegerNãoCódigo de origem fiscal de 0 a 8; consulte a classificação fiscal do produto.

Resposta 200

CampoTipoNulo?Descrição
idLotestringNãoID enviado para correlacionar resposta e lote.
statusstringNãoVALIDADO, VALIDADO_COM_PENDENCIAS, PROCESSADO ou PROCESSADO_COM_ERROS.
resultados[]object[]NãoUma resposta por produto enviado.
resultados[].idExternostringNãoID do produto no parceiro.
resultados[].acaoPrevistastringSimCRIAR ou ATUALIZAR no modo somenteValidar; pode ser nulo após gravação.
resultados[].produtoIdUUIDSimID interno quando criado/atualizado; nulo na validação ou rejeição.
resultados[].statusstringSimCRIADO, ATUALIZADO, REJEITADO; nulo na simulação.
resultados[].pendencias[]object[]NãoErros/avisos do item; inspecione mesmo quando o HTTP é 200.
resultados[].pendencias[].campostringNãoCampo ou regra afetada.
resultados[].pendencias[].mensagemstringNãoMotivo da pendência.
Na atualização, campos não enviados preservam o cadastro. A validação de lote também consome a Idempotency-Key; gere outra chave ao enviar o mesmo lote para gravação.

Obter token

POST /v1/auth/token

Não usa Bearer. Responde 200; chave inválida ou revogada responde 401.

Corpo enviado

CampoTipoObrigatórioDescrição
apiKeystringSimChave em claro exibida uma única vez no LubConsulta. Nunca coloque em URL ou código-fonte.

Resposta 200

CampoTipoNulo?Descrição
accessTokenstringNãoJWT a enviar no header Authorization.
tokenTypestringNãoValor Bearer.
expiresInintegerNãoValidade do token em segundos; normalmente 3600.
scopes[]string[]NãoEscopos concedidos à chave, como consulta.* ou produtos.importar.

Criar pessoa

POST /v1/operacoes/pessoas

Cria cliente, fornecedor ou ambos. Responde 201 na criação; repetição idêntica da chave de idempotência responde 200.

Headers

HeaderTipoObrigatórioDescrição
AuthorizationBearer JWTSimToken com pessoas.gravar ou pessoas.criar.
Idempotency-KeyUUIDSimIdentifica a tentativa de criação; gere outro UUID para outra operação.
X-Empresa-IdUUIDSimEmpresa permitida na chave.
X-Sistema-OrigemstringNãoIdentifica o ERP parceiro; padrão ERP_PARCEIRO. Usado com referenciaExterna.

Corpo enviado

CampoTipoObrigatórioDescrição / regra
tipostringPadrão clientePapel comercial: cliente, fornecedor ou clienteFornecedor. Não indica PF/PJ.
tipoPessoastringNãoPF ou PJ. PF exige CPF sem CNPJ; PJ exige CNPJ sem CPF. Se omitido, o documento determina o tipo; sem documento, é AVULSO.
nomestringSimNome ou razão social, até 200 caracteres.
cpfstringSe PFCPF válido, até 20 caracteres; não pode pertencer a outro cadastro.
cnpjstringSe PJCNPJ válido, até 20 caracteres; não pode pertencer a outro cadastro.
emailstringNãoE-mail, até 100 caracteres.
telefonestringNãoTelefone, até 20 caracteres; independente de celular.
celularstringNãoCelular, até 20 caracteres; independente de telefone.
enderecoobjectNãoEndereço principal; campos descritos na tabela abaixo.
referenciaExternastringNãoID da pessoa no ERP parceiro, até 100 caracteres. Deve ser único para X-Sistema-Origem.
observacoesstringNãoObservações, até 1000 caracteres.

Campos de endereco — também usados no PATCH

CampoTipoObrigatórioDescrição
endereco.cepstringNãoCEP, até 10 caracteres.
endereco.logradourostringNãoRua/avenida, até 200 caracteres.
endereco.numerostringNãoNúmero, até 50 caracteres.
endereco.complementostringNãoComplemento, até 100 caracteres.
endereco.bairrostringNãoBairro, até 100 caracteres.
endereco.municipiostringNãoNome do município, até 100 caracteres.
endereco.ufstringNãoUF, 2 caracteres.
endereco.codigoMunicipioIbgeintegerNãoCódigo IBGE do município.

Resposta 201/200

CampoTipoNulo?Descrição
idUUIDNãoID interno da pessoa; use em PATCH.
nomestringNãoNome ou razão social gravada.
tipoPessoastringNãoPF, PJ ou AVULSO.
cpf / cnpjstringSimDocumento correspondente à natureza da pessoa.
emailstringSimE-mail gravado.
telefone / celularstringSimContatos gravados, em campos separados.
referenciaExternastringSimReferência enviada na criação, quando informada.

Atualizar pessoa

PATCH /v1/operacoes/pessoas/{id}

Responde 200 com o mesmo formato de pessoa acima; pessoa inexistente responde 404.

Rota e headers

CampoTipoObrigatórioDescrição
idUUIDSimID interno retornado ao criar a pessoa; vai na URL.
AuthorizationBearer JWTSimEscopo pessoas.gravar ou pessoas.atualizar.
Idempotency-KeyUUIDSimUUID novo para esta atualização.
X-Empresa-IdUUIDSimEmpresa permitida na chave.
X-Sistema-OrigemstringNãoPadrão ERP_PARCEIRO.

Corpo enviado

CampoTipoObrigatórioDescrição
nomestringNãoNovo nome/razão social, até 200 caracteres.
emailstringNãoNovo e-mail, até 100 caracteres.
telefonestringNãoNovo telefone, até 20 caracteres.
celularstringNãoNovo celular, até 20 caracteres.
observacoesstringNãoNovas observações, até 1000 caracteres.
enderecoobjectNãoAtualiza o endereço principal; subcampos estão na tabela da criação.
O PATCH preserva campos omitidos; valores nulos ou vazios não apagam os dados atuais. CPF, CNPJ, tipoPessoa, tipo e referenciaExterna não são alteráveis por esta rota. No retorno atual do PATCH, referenciaExterna vem null, mesmo que a pessoa tenha referência cadastrada; isso não remove o vínculo.

Consultar catálogo de serviços

GET /v1/operacoes/servicos/catalogo

Expõe o código canônico, a hierarquia e os tipos de produto esperados para cada serviço. Não é uma tabela de preços nem informa quais serviços foram habilitados por empresa.

Envio

CampoLocal / tipoObrigatórioDescrição
AuthorizationHeader · BearerSimToken com consulta.* ou vendas.consultar.
empresaIdQuery · UUIDSimEmpresa permitida na chave.

Resposta 200

CampoTipoNulo?Descrição
servicos[]object[]NãoServiços do catálogo.
servicos[].idUUIDSimID do serviço cadastrado; pode ser nulo quando o item canônico ainda não está materializado.
servicos[].codigostringNãoCódigo estável para integração, como TROCA_OLEO_MOTOR.
servicos[].nomestringNãoNome exibido ao usuário.
servicos[].categoriastringNãoCategoria funcional do catálogo.
servicos[].servicoPaiIdUUIDSimID cadastral do serviço pai, quando há vínculo e cadastro disponível.
servicos[].servicoPaiCodigostringSimCódigo canônico do serviço pai; útil mesmo quando o ID é nulo.
servicos[].produtosEsperados[]object[]NãoTipos de produto associados ao serviço; não são produtos de uma venda.
servicos[].produtosEsperados[].codigostringNãoCódigo do tipo de produto esperado.
servicos[].produtosEsperados[].nomestringNãoNome do tipo de produto.
servicos[].produtosEsperados[].grupoCodigostringSimCódigo de grupo recomendado, quando mapeado.
servicos[].produtosEsperados[].subgrupoCodigostringSimCódigo de subgrupo recomendado, quando mapeado.
Na venda, servicos[].codigo identifica o serviço histórico e itens[].servicoComponenteId identifica o componente associado ao produto. servicoPaiId do catálogo é diferente de itemPedidoServicoPaiId de uma linha de venda.

Listar vendas

GET /v1/operacoes/vendas

Consulta vendas e OSs por período. Cada registro em vendas[] usa o contrato completo detalhado abaixo.

Envio

CampoLocal / tipoObrigatórioDescrição
AuthorizationHeader · BearerSimToken com vendas.consultar ou consulta.*.
empresaIdQuery · UUIDSimEmpresa permitida na chave.
inicioQuery · data/horaSim para consulta útilInício do intervalo ISO 8601 UTC; use com fim.
fimQuery · data/horaSim para consulta útilFim do intervalo ISO 8601 UTC. Janela máxima: 31 dias.
paginaQuery · integerNãoPágina iniciada em 1; padrão 1.
limiteQuery · integerNãoItens por página; padrão 100, limitado a 1–100.
sistemaOrigemQuery · stringNãoPadrão ERP_PARCEIRO. Controla qual vínculo externo preenche itens[].idExterno.

Resposta 200

CampoTipoNulo?Descrição
paginaintegerNãoPágina retornada.
limiteintegerNãoTamanho aplicado à página.
totalintegerNãoQuantidade total de vendas no filtro, antes da paginação.
vendas[]object[]NãoVendas da página; veja todos os campos de cada venda.

Detalhar venda

GET /v1/operacoes/vendas/{numero}

Retorna uma venda diretamente, sem envelope vendas[]. Responde 404 se não encontrada na empresa.

Envio

CampoLocal / tipoObrigatórioDescrição
AuthorizationHeader · BearerSimToken com vendas.consultar ou consulta.*.
numeroRota · stringSimNúmero comercial da venda/OS; a API também aceita o UUID interno como alternativa.
empresaIdQuery · UUIDSimEmpresa permitida na chave.
sistemaOrigemQuery · stringNãoPadrão ERP_PARCEIRO; seleciona o mapeamento de idExterno dos produtos.

Resposta 200

Objeto de venda com todos os campos abaixo. Não é apenas um resumo: inclui itens, serviços, preços, pagamentos e documentos fiscais quando existentes.

Campos do objeto de venda

O mesmo objeto aparece em vendas[] da listagem e como resposta direta do detalhe. A ligação é feita por IDs: itens[].itemPedidoServicoId aponta para servicos[].id. Um item sem serviço tem esse ID nulo.

Venda e cliente

CampoTipoNulo?Descrição
idUUIDNãoID interno da venda.
numerostringNãoNúmero comercial para consultar o detalhe.
empresaIdUUIDNãoEmpresa proprietária.
statusstringNãoEstado operacional em maiúsculas, como ABERTA, FINALIZADA, CANCELADA, TRANSFERIDA, PREVENDA, PROPOSTA, PERDIDA ou AGUARDANDOPAGAMENTO. Não é o status fiscal.
datadata/horaNãoData de fechamento, quando existe; caso contrário, data de criação.
plataformastringNãoOrigem operacional, por exemplo PDV, RETAGUARDA, SITEPROPRIO, IFOOD ou WHATSAPP.
tipostringSimTipo comercial, por exemplo BALCAO, MESA, COMANDA, DELIVERY ou OFICINA.
clienteobjectNãoDados do cliente na venda.
cliente.idUUIDSimID do cadastro de pessoa, quando vinculado.
cliente.nomestringNãoNome apresentado na venda.
cliente.cpfstringSimCPF do cliente, se houver.
cliente.cnpjstringSimCNPJ do cliente, se houver.
cliente.telefonestringSimTelefone disponível para o cliente.
veiculoobjectSimVeículo associado à OS, quando existe.
observacoesstringSimObservações registradas na venda.

Veículo

CampoTipoNulo?Descrição
veiculo.placastringNão*Placa do veículo quando veiculo existe.
veiculo.marcastringNão*Marca apresentada.
veiculo.modelostringNão*Modelo apresentado.
veiculo.versaostringSimVersão do veículo, quando conhecida.
veiculo.anointegerSimAno do veículo, quando conhecido.
veiculo.odometroKmintegerSimOdômetro em quilômetros registrado na OS.
veiculo.codigoFipestringSimCódigo FIPE do cadastro do veículo (ex.: 004504-7); null se não informado. Preserve zeros à esquerda e o hífen.

* Estes campos pertencem ao objeto veiculo; o objeto inteiro pode ser nulo numa venda sem veículo.

Produtos em itens[]

CampoTipoNulo?Descrição
itens[]object[]NãoLinhas de produtos, inclusive vinculadas a serviços; vazio se não há produtos.
itens[].produtoIdUUIDNãoID do produto no LubConsulta.
itens[].idExternostringSimID do produto no sistemaOrigem consultado; nulo se não houver mapeamento.
itens[].skustringSimSKU cadastrado.
itens[].nomestringNãoNome do produto na linha.
itens[].unidadestringNãoUnidade vendida.
itens[].quantidadedecimalNãoQuantidade vendida; pode ser fracionada.
itens[].precoUnitariodecimalNãoPreço por unidade em reais.
itens[].descontodecimalNãoDesconto dessa linha em reais.
itens[].acrescimodecimalNãoAcréscimo dessa linha em reais.
itens[].valorTotaldecimalNãoTotal da linha após ajustes.
itens[].itemPedidoServicoIdUUIDSimID da linha de mão de obra em servicos[].id à qual o produto foi ligado; nulo para produto avulso.
itens[].servicoComponenteIdUUIDSimID cadastral do componente/tipo de serviço que classificou o produto (ex.: filtro de óleo). Não é a linha cobrada.

Mão de obra em servicos[]

CampoTipoNulo?Descrição
servicos[]object[]NãoLinhas de serviço cobradas na venda; vazio se não houver.
servicos[].idUUIDNãoID desta linha da venda. É o alvo de itens[].itemPedidoServicoId.
servicos[].servicoIdUUIDNãoID do serviço cadastrado no catálogo.
servicos[].codigostringSimCódigo canônico do serviço, quando disponível no histórico.
servicos[].nomestringNãoNome da mão de obra na venda.
servicos[].itemPedidoServicoPaiIdUUIDSimID de outra linha em servicos[].id que é pai desta linha; não é servicoPaiId cadastral.
servicos[].quantidadedecimalNãoQuantidade do serviço.
servicos[].precoUnitariodecimalNãoPreço unitário da mão de obra em reais.
servicos[].valorTotaldecimalNãoValor total desta linha de serviço.
Exemplo de vínculo: procure uma linha de itens[] cujo itemPedidoServicoId seja igual ao id de uma linha em servicos[]. O produto e a mão de obra têm preços próprios. O componente indica a natureza do produto dentro do serviço e pode ser comparado com o catálogo, mas não substitui essa ligação.

Totais, pagamentos e documentos fiscais

CampoTipoNulo?Descrição
totaisobjectNãoConsolidação monetária da venda.
totais.subtotaldecimalNãoSoma antes dos ajustes gerais.
totais.descontodecimalNãoDesconto total.
totais.acrescimodecimalNãoAcréscimo total.
totais.fretedecimalNãoFrete da venda.
totais.impostosdecimalNãoImpostos informados no total.
totais.totaldecimalNãoTotal final autoritativo da venda em reais.
pagamentos[]object[]NãoPagamentos não cancelados. Pode ser [] mesmo com venda concluída sem pagamento registrado.
pagamentos[].formastringNãoDescrição da forma de pagamento; pode vir “Não informado”.
pagamentos[].valordecimalNãoValor pago neste registro.
pagamentos[].parcelasintegerNãoNúmero de parcelas.
pagamentos[].statusstringNãoStatus do pagamento, como PENDENTE ou CONFIRMADO; cancelados não entram no array.
pagamentos[].datadata/horaNãoData do registro de pagamento.
pagamentos[].referenciastringSimReferência externa, se houver.
pagamentos[].autorizacaostringSimCódigo de autorização, se houver.
pagamentos[].bandeirastringSimBandeira de cartão, se houver.
documentosFiscais[]object[]NãoNotas associadas; [] se nenhuma foi emitida. Consulta não emite nota.
documentosFiscais[].numerostringSimNúmero da nota, quando atribuído.
documentosFiscais[].seriestringSimSérie, quando atribuída.
documentosFiscais[].chaveAcessostringSimChave fiscal, quando disponível.
documentosFiscais[].modelostringNãoModelo, como NFe, NFCe ou NFSe.
documentosFiscais[].situacaostringNãoPENDENTE, EMITIDA, CANCELADA ou ERROEMISSAO.
documentosFiscais[].dataEmissaodata/horaNãoData da emissão/registro.
documentosFiscais[].dataCancelamentodata/horaSimData de cancelamento, quando houve.
Não infira o status operacional a partir de pagamentos[] ou documentosFiscais[]. Venda finalizada pode ter saldo a receber, e orçamento/OS em aberto podem não ter pagamento. Use status, tipo e os valores financeiros separadamente.

Erros e saúde

Em falhas de negócio, a API normalmente devolve {"codigo":"...","mensagem":"..."}. Erros automáticos de desserialização ou validação HTTP podem usar o formato Problem Details do ASP.NET; trate o status HTTP como principal e exiba a mensagem quando presente.

StatusQuando ocorreO que fazer
400Campo obrigatório, layout/lote inválido, UUID ou JSON malformado.Corrija a requisição; na importação, confira também resultados[].pendencias[].
401Chave inválida/revogada ou Bearer ausente/expirado.Gere um token com uma chave ativa e autorizada.
403Escopo ou empresa não autorizados.Confira o vínculo da chave com a empresa e os escopos concedidos.
404Pessoa ou venda não encontrada na empresa consultada.Verifique o ID/número e a empresa.
409Mesma Idempotency-Key reutilizada com corpo diferente ou outro conflito.Para operação nova, gere um UUID novo; para repetição, preserve o corpo original.
422Regra de negócio ou dados inconsistentes.Leia codigo e mensagem; corrija o campo indicado.

Saúde do serviço

GET /health

Sem autenticação, parâmetros ou corpo. Responde 200 quando a aplicação está atendendo; não é uma operação de negócio.

Campo da respostaTipoValor / significado
statusstringok: processo HTTP ativo.
servicestringlubconsulta-connect-api: identificador do serviço.
Esta rota confirma que a aplicação responde. Ela não faz uma transação de teste nem garante, sozinha, que banco ou integrações externas estão disponíveis.

LubConsulta Connect · contrato público v1 · referência conferida com os DTOs e controladores da API em produção.