SaldoLote
Consulta read-only de saldo por lote (tabela SB8).
Útil para FIFO/FEFO — a chave inclui produto, lote,
opcionalmente subLote, e armazém. Saldo disponível =
B8_SALDO - B8_EMPENHO - B8_QEMPPRE (quando o campo existir no
dicionário). Não há POST/PUT/DELETE:
rastreabilidade de lote é gerada/baixada via documentos fiscais e produção.
Endpoint OAuth2
Token via ./src/scripts/get-token.sh.
Vinculação com o ERP
Convenções
Endpoint read-only. Saldo de lote é gerado por NF de
entrada (informando B8_LOTECTL) e baixado por NF de saída,
requisição ou produção. Esta API não escreve em SB8.
Chave composta extensa. A rota canônica é
/WsSB8/{produto}/{lote}/{armazem} (3 segmentos). Sub-lote
(B8_NUMLOTE) é opcional via query string
(?subLote=) — quando ausente, faz prefix-seek e devolve
o primeiro registro do lote+armazém. Aceita também o atalho
/WsSB8/{produto}/{lote} (armazém default "01").
Bloqueio TOTVS não se aplica. A SB8 não tem
o par *_MSBLQL/*_MSBLQD no dicionário — saldo de
lote não é cadastro. Bloqueio de produto vive em SB1/SB5.
Filtros de listagem. validadeAte
(formato YYYYMMDD) corta lotes com B8_DTVALID
maior que a data; somenteComSaldo=true filtra disponível
(saldo - empenho - processo) maior que zero. Combinados são úteis para
FEFO: lotes vencendo logo com saldo disponível.
Paginação e delta-sync. /_list e os
atalhos /porProduto, /porLote, /porArmazem
compartilham o mesmo motor: orderBy=chave (default) ou
orderBy=recno com cursor.
Saldo
Consulta consolidada por loteDescrição
Retorna o saldo de um lote específico. A chave full inclui
produto+lote+armazém; sub-lote (B8_NUMLOTE) é
opcional via ?subLote=. Sem sub-lote, o endpoint
faz prefix-seek e devolve o primeiro match de produto+lote+armazém.
O disponivel é calculado: B8_SALDO − B8_EMPENHO − B8_QEMPPRE
(este último só quando o dicionário tem o campo).
Path parameters
B8_LOTECTL)."01").Cenário
Query parameters
Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/MP001/LOTE001/01 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
{ success: true, data: SaldoSB8 }.Descrição
Busca o registro de saldo de lote por id técnico. Útil para
integrações que persistem o recno retornado em
/_list e querem reconfirmar sem refazer o seek
pela chave composta de 5 partes.
Cenário
Query parameters
recno.recnoSB8.Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/_byid?tipo=recno&valor=5678 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
tipo ausente / fora do enum, ou valor não-positivo.Listagem
Listagem paginada + filtros pré-definidosDescrição
Lista registros de SB8 com filtros opcionais por
produto, lote, armazem,
validadeAte e somenteComSaldo. Retorna
campos crus + colunas calculadas (processo,
disponivel, datas opcionais).
Dois modos de ordenação:
orderBy=chave (default; índice 1) ou
orderBy=recno (delta-sync com cursor).
Cenário
Query parameters
B8_PRODUTO — também serve de prefix-seek no índice 1.B8_LOTECTL.B8_LOCAL.B8_DTVALID maior que essa data são descartados (útil para FEFO).saldo - empenho - processo > 0. Default false.CAMPOS_GET.1.50, máx 500.chave.chaverecnonextCursor da página anterior.Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/_list?produto=MP001&armazem=01&page=1&pageSize=50 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/_list?produto=MP001&somenteComSaldo=true&validadeAte=20271231 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/_list?orderBy=recno&cursor=5678&pageSize=200 Authorization: Bearer eyJhbGciOiJIUzI1NiIs… Accept: application/json
Respostas
Descrição
Atalho semântico — equivale a /_list?produto={produto}.
Path parameter
Cenário
Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/porProduto/MP001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs…
Respostas
data=[].Descrição
Filtra todos os registros que compartilham o mesmo B8_LOTECTL
— útil para rastreabilidade reversa (qual produto compõe esse lote, em
quais armazéns está distribuído).
Atenção a custo. Lote sem produto faz scan-full do
índice; prefira orderBy=recno em bases grandes.
Path parameter
Cenário
Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/porLote/LOTE001 Authorization: Bearer eyJhbGciOiJIUzI1NiIs…
Respostas
Descrição
Atalho — equivale a /_list?armazem={armazem}. Inventário de lotes do armazém.
Path parameter
Cenário
Exemplo da requisição (cenário ativo)
GET https://erpapi.jetme.com.br/api/99/01/WsSB8/porArmazem/01?orderBy=recno&pageSize=500 Authorization: Bearer eyJhbGciOiJIUzI1NiIs…
Respostas
Schemas
Definições canônicas — campos com origemSX3 rastreável
GET /WsSB8/{produto}/{lote}/{armazem}. Campos
datas (dataValidade, dataFabricacao,
dataReferencia) só aparecem se o dicionário tiver
B8_DTVALID/B8_DFABRIC/B8_DTREFER.
saldo - empenhado - processo./_list, atalhos e /_byid. Conjunto efetivo depende de ?fields=.B8_QEMPPRE.page só em orderBy=chave; nextCursor só em orderBy=recno.orderBy=chave.chaverecnoCenários
Catálogo de combinações reconhecidas. Endpoint read-only — todos os cenários usamGET.
orderBy=chave + page/pageSize. Filtros opcionais de produto/lote/armazém.somenteComSaldo=true + validadeAte. Lista para FEFO operacional — só lotes com disponível e vencendo até a data.orderBy=recno + cursor; sincronização incremental.Pendências conhecidas (rev3)
B8_MSUID ausente nesta base. O dicionário
padrão TOTVS de SB8 não traz B8_MSUID nesta
instalação. _byid só aceita tipo=recno;
tentativas com tipo=msuid retornariam 501
se a opção fosse exposta. Implementação requer UPDDISTR no dicionário e
revisão da rota _byid?tipo=msuid.
Volumetria alta em SB8. Bases com rastreabilidade
ativa por anos podem ter centenas de milhares de registros em
SB8 — uma linha por produto+lote+sublote+armazém+validade.
PAGE_SIZE_MAX=500 evita OOM, mas listagem total exige
orderBy=recno + cursor em iterações. Para
reports analíticos prefira o DW (src/dw/).
Sub-lote ambíguo sem produto. A rota /porLote/{lote}
filtra por B8_LOTECTL, não por sub-lote (B8_NUMLOTE).
Quando o mesmo código de lote é usado em produtos diferentes (raro, mas
válido), o resultado mistura todos. Refinar por ?produto=
se necessário.
Bloqueio MSBLQL/MSBLQD não aplicável. Saldo de lote
é resultado de movimentação, não cadastro. Bloqueio comercial vive em
SB1/SB5; bloqueio de
qualidade típico (lote em quarentena) é controlado por outro fluxo
(CQ — controle de qualidade), fora do escopo deste endpoint.
Sem _search. Autocomplete de lote
ainda não é exposto. Quando necessário, listar por /porProduto
e filtrar no consumer.
Concorrência com movimento. Snapshot do instante
do DbSeek. Para alocação de lote em separação, prefira
chamar a função nativa diretamente no mesmo processo do movimento.