Appearance
Estoque
O estoque controla os insumos (stock_items) consumidos pelas vendas do POS — via revenda direta ou ficha técnica — em um ou mais locais (stock_locations). O saldo de cada item em cada local fica em stock_levels, e toda variação passa pelo livro-razão (stock_movements), que registra compras, consumos, transferências, ajustes, perdas e produções com custo e rastreabilidade.
Headers obrigatórios
Todas as requisições devem incluir o header X-Tour-Id (UUID) com o identificador da instância e Authorization: Bearer {token} com o token de um usuário staff (guard toursUser).
Permissões de escrita
As mutações de insumos, saldos e movimentações exigem a permissão stock.adjust. As mutações de locais de estoque exigem settings.manage. Sem a permissão, a API responde 403 com code: FORBIDDEN. As consultas (GET) não exigem permissão adicional.
Insumos (Stock Items)
O que se compra, armazena e consome: garrafa de rum, pão de hambúrguer, toalha de praia. Cada insumo tem unidade de medida própria (ver Catálogo), fornecedor padrão e níveis de reposição — minQuantity (ponto de alerta) e parQuantity (nível ideal).
Os campos averageCost (custo médio ponderado) e lastCost (custo da última compra) são calculados pela API a partir das movimentações de entrada — não são editáveis.
Listar Insumos
http
GET /v1/tours/user/stock-itemsParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | O número da página (mínimo: 1). |
perPage | number | Não | Itens por página (entre 1 e 100). |
search | string | Não | Busca por código ou nome. |
tourSupplierId | number | Não | Filtra por fornecedor padrão. |
isActive | boolean | Não | Filtra por insumos ativos/inativos. |
orderBy | enum | Não | id, code, name ou createdAt (padrão: id). |
orderDirection | enum | Não | asc ou desc (padrão: desc). |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/stock-items?isActive=true" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
Retorna a página de insumos no formato meta/data.
json
{
"meta": {
"currentPage": 1,
"perPage": 10
},
"data": [
{
"id": 1,
"tourId": 1,
"tourMeasurementUnitId": 1,
"tourSupplierId": 1,
"code": "RLSRFO50",
"name": "Bespoke Wooden Bike",
"averageCost": "0.00",
"lastCost": "0.00",
"minQuantity": "0.0000",
"parQuantity": null,
"isActive": true,
"createdAt": "2026-10-07T11:56:15.031-03:00",
"updatedAt": "2026-10-07T11:56:15.031-03:00"
}
]
}Criar Insumo
http
POST /v1/tours/user/stock-itemsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código único na instância (máx. 50 caracteres). |
name | string | Sim | Nome do insumo (máx. 150 caracteres). |
tourMeasurementUnitId | number | Sim | Unidade de medida do insumo. |
tourSupplierId | number | Não | Fornecedor padrão usado nas compras. |
minQuantity | number | Não | Estoque mínimo — ponto de alerta de reposição (mínimo: 0). |
parQuantity | number | Não | Nível ideal de estoque (mínimo: 0). |
isActive | boolean | Não | Indica se já nasce ativo (padrão: true). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/stock-items" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "DOC-ITEM-1",
"name": "Insumo Doc",
"tourMeasurementUnitId": 1,
"tourSupplierId": 1,
"minQuantity": 5,
"parQuantity": 20,
"isActive": true
}'Respostas
201 Created
Retorna o ID do insumo criado.
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o code já existe na instância ou a unidade de medida/fornecedor não existe.
Listar para Dropdown
http
GET /v1/tours/user/stock-items/listAceita search, isActive e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 1,
"label": "Bespoke Wooden Bike"
},
{
"value": 4,
"label": "Insumo Doc"
}
]Obter Insumo por ID
http
GET /v1/tours/user/stock-items/:idRespostas
200 OK
Retorna o insumo com unidade de medida e fornecedor padrão resolvidos.
json
{
"id": 4,
"tourId": 1,
"tourMeasurementUnitId": 1,
"tourSupplierId": 1,
"code": "DOC-ITEM-1",
"name": "Insumo Doc",
"averageCost": "0.00",
"lastCost": "0.00",
"minQuantity": "5.0000",
"parQuantity": "20.0000",
"isActive": true,
"createdAt": "2026-10-07T15:11:10.134-03:00",
"updatedAt": "2026-10-07T15:11:10.134-03:00",
"toursMeasurementUnit": {
"id": 1,
"code": "IFH2PUIH",
"name": "Bronze"
},
"toursSupplier": {
"id": 1,
"name": "Ward - Pouros"
}
}404 Not Found
Ocorre quando o insumo não existe na instância.
Atualizar Insumo
http
PUT /v1/tours/user/stock-items/:idAceita os mesmos campos da criação, todos opcionais. averageCost e lastCost não são editáveis.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Insumo
http
DELETE /v1/tours/user/stock-items/:idRespostas
204 No Content
Remoção concluída via soft delete.
Locais de Estoque
Os pontos físicos onde o insumo fica: depósito, cozinha, bar, quiosque. O local com isDefault: true é usado como origem padrão nas baixas automáticas de venda.
Listar Locais de Estoque
http
GET /v1/tours/user/stock-locationsParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | O número da página (mínimo: 1). |
perPage | number | Não | Itens por página (entre 1 e 100). |
search | string | Não | Busca por código ou nome. |
isDefault | boolean | Não | Filtra pelo local padrão. |
isActive | boolean | Não | Filtra por locais ativos/inativos. |
orderBy | enum | Não | id, code, name ou createdAt (padrão: id). |
orderDirection | enum | Não | asc ou desc (padrão: desc). |
Respostas
200 OK
json
{
"meta": {
"currentPage": 1,
"perPage": 10
},
"data": [
{
"id": 1,
"tourId": 1,
"code": "TI3KEITS",
"name": "4224 Rempel Keys",
"isDefault": false,
"isActive": true,
"createdAt": "2026-10-07T11:56:15.004-03:00",
"updatedAt": "2026-10-07T11:56:15.004-03:00"
}
]
}Criar Local de Estoque
http
POST /v1/tours/user/stock-locationsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código único na instância (máx. 50 caracteres). |
name | string | Sim | Nome do local (máx. 150 caracteres). |
isDefault | boolean | Não | Marca o local como padrão das baixas de venda. |
isActive | boolean | Não | Indica se já nasce ativo (padrão: true). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/stock-locations" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "doc-cozinha",
"name": "Cozinha Doc",
"isDefault": false,
"isActive": true
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o code já existe na instância.
Listar para Dropdown
http
GET /v1/tours/user/stock-locations/listAceita search, isActive e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 1,
"label": "4224 Rempel Keys"
},
{
"value": 4,
"label": "Cozinha Doc"
}
]Obter Local de Estoque por ID
http
GET /v1/tours/user/stock-locations/:idRespostas
200 OK
json
{
"id": 4,
"tourId": 1,
"code": "doc-cozinha",
"name": "Cozinha Doc",
"isDefault": false,
"isActive": true,
"createdAt": "2026-10-07T15:11:12.182-03:00",
"updatedAt": "2026-10-07T15:11:12.182-03:00"
}404 Not Found
Ocorre quando o local não existe na instância.
Atualizar Local de Estoque
http
PUT /v1/tours/user/stock-locations/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Local de Estoque
http
DELETE /v1/tours/user/stock-locations/:idRespostas
204 No Content
Remoção concluída via soft delete.
Saldos (Stock Levels)
O saldo de cada insumo em cada local — a grade item × local. quantity é o estoque físico; reservedQuantity é a parcela reservada (por exemplo, para eventos confirmados) e não fica disponível para venda. Os saldos são atualizados automaticamente pelas movimentações; o cadastro manual serve para a carga inicial e acertos de inventário.
Listar Saldos
http
GET /v1/tours/user/stock-levelsParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | O número da página (mínimo: 1). |
perPage | number | Não | Itens por página (entre 1 e 100). |
tourStockItemId | number | Não | Filtra por insumo. |
tourStockLocationId | number | Não | Filtra por local de estoque. |
orderBy | enum | Não | id, quantity ou updatedAt (padrão: id). |
orderDirection | enum | Não | asc ou desc (padrão: desc). |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/stock-levels?tourStockItemId=1" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
json
{
"meta": {
"currentPage": 1,
"perPage": 10
},
"data": [
{
"id": 1,
"tourId": 1,
"tourStockItemId": 1,
"tourStockLocationId": 1,
"quantity": "10.0000",
"reservedQuantity": "0.0000",
"updatedAt": "2026-10-07T11:56:15.164-03:00"
}
]
}Criar Saldo
Registra o saldo inicial de um insumo em um local (carga inicial).
http
POST /v1/tours/user/stock-levelsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tourStockItemId | number | Sim | Insumo. |
tourStockLocationId | number | Sim | Local de estoque. |
quantity | number | Não | Saldo físico inicial (padrão: 0). |
reservedQuantity | number | Não | Quantidade reservada inicial (padrão: 0). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/stock-levels" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"tourStockItemId": 1,
"tourStockLocationId": 1,
"quantity": 100,
"reservedQuantity": 0
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o insumo ou o local não existe na instância.
Obter Saldo por ID
http
GET /v1/tours/user/stock-levels/:idRespostas
200 OK
Retorna o saldo com insumo e local resolvidos.
json
{
"id": 4,
"tourId": 1,
"tourStockItemId": 1,
"tourStockLocationId": 1,
"quantity": "100.0000",
"reservedQuantity": "0.0000",
"updatedAt": "2026-10-07T15:11:11.025-03:00",
"toursStockLocation": {
"id": 1,
"code": "TI3KEITS",
"name": "4224 Rempel Keys"
},
"toursStockItem": {
"id": 1,
"code": "RLSRFO50",
"name": "Bespoke Wooden Bike"
}
}404 Not Found
Ocorre quando o saldo não existe na instância.
Atualizar Saldo
Ajuste direto de inventário sobre um par item × local já cadastrado.
http
PUT /v1/tours/user/stock-levels/:idPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
quantity | number | Não | Novo saldo físico. |
reservedQuantity | number | Não | Nova quantidade reservada. |
Respostas
204 No Content
Atualização concluída com sucesso.
Ajuste vs. movimentação
Para acertos com rastreabilidade (quem, quando e por quê), prefira registrar uma movimentação do tipo adjustment em vez de editar o saldo diretamente.
Remover Saldo
http
DELETE /v1/tours/user/stock-levels/:idRespostas
204 No Content
Remoção concluída com sucesso.
Movimentações de Estoque
O livro-razão do estoque: toda entrada e saída de insumo vira um registro imutável de movimentação, alimentando os saldos e os custos (averageCost/lastCost) do insumo. Como todo livro-razão do módulo, correções são feitas por estorno (nova movimentação com sinal oposto), nunca por edição de valores.
Regras do registro:
quantityDeltapositivo = entrada, negativo = saída. Uma compra de 50 unidades é50; o consumo de 2 é-2.createdByTourUserIdé injetado pela API com o usuário staff autenticado — não é aceito no payload.- Rastreabilidade opcional:
tourOrderItemIdvincula o consumo ao item de pedido do POS que o originou;tourSupplierIdidentifica o fornecedor de uma compra. - Se
occurredAtfor omitido, a API usa o momento do registro.
Tipos de movimentação (kind):
| Kind | Sentido típico | Uso |
|---|---|---|
purchase | entrada | Compra de insumos de fornecedor. |
consumption | saída | Baixa por venda (revenda direta ou ficha técnica). |
transfer_in | entrada | Recebimento de transferência entre locais. |
transfer_out | saída | Envio de transferência entre locais. |
adjustment | ambos | Acerto de inventário (contagem física). |
waste | saída | Perda, quebra ou validade vencida. |
production | entrada | Entrada de produção interna (pré-preparo). |
return | saída | Devolução de insumo ao fornecedor. |
Listar Movimentações
http
GET /v1/tours/user/stock-movementsParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | O número da página (mínimo: 1). |
perPage | number | Não | Itens por página (entre 1 e 100). |
tourStockItemId | number | Não | Filtra por insumo. |
tourStockLocationId | number | Não | Filtra por local de estoque. |
kind | enum | Não | Filtra por tipo de movimentação (ver tabela acima). |
from | date | Não | Início do período, em ISO 8601 (occurredAt). |
to | date | Não | Fim do período, em ISO 8601 (occurredAt). |
orderBy | enum | Não | id, occurredAt ou createdAt (padrão: id). |
orderDirection | enum | Não | asc ou desc (padrão: desc). |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/stock-movements?kind=purchase&from=2026-10-01" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
Retorna a página de movimentações com o insumo resolvido em toursStockItem.
json
{
"meta": {
"currentPage": 1,
"perPage": 10
},
"data": [
{
"id": 1,
"tourId": 1,
"tourStockItemId": 1,
"tourStockLocationId": 1,
"kind": "purchase",
"quantityDelta": "5.0000",
"unitCost": "10.00",
"totalCost": "50.00",
"occurredAt": "2026-10-07T11:56:15.388-03:00",
"createdAt": "2026-10-07T11:56:15.388-03:00",
"toursStockItem": {
"id": 1,
"code": "RLSRFO50",
"name": "Bespoke Wooden Bike"
}
}
]
}Registrar Movimentação
Lança uma entrada ou saída manual — compra, ajuste de inventário, perda, transferência. A movimentação atualiza o saldo do par item × local e, nas entradas com custo, recalcula lastCost e averageCost do insumo.
http
POST /v1/tours/user/stock-movementsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tourStockItemId | number | Sim | Insumo movimentado. |
tourStockLocationId | number | Sim | Local da movimentação. |
kind | enum | Sim | Tipo da movimentação (ver tabela acima). |
quantityDelta | number | Sim | Variação de quantidade — positivo = entrada, negativo = saída. |
unitCost | number | Não | Custo unitário da entrada, na moeda da instância. |
totalCost | number | Não | Custo total da movimentação, na moeda da instância. |
tourOrderItemId | number | Não | Item de pedido do POS que originou o consumo (rastreabilidade). |
tourSupplierId | number | Não | Fornecedor da compra (rastreabilidade). |
reason | string | Não | Motivo/observação do lançamento. |
occurredAt | date | Não | Data/hora do fato, em ISO 8601 (padrão: momento do registro). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/stock-movements" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"tourStockItemId": 1,
"tourStockLocationId": 1,
"kind": "purchase",
"quantityDelta": 50,
"unitCost": 12.5,
"reason": "Compra doc",
"occurredAt": "2026-10-20T14:00:00.000-03:00"
}'Respostas
201 Created
Retorna o ID da movimentação registrada.
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o insumo, o local, o item de pedido ou o fornecedor não existe na instância.
Obter Movimentação por ID
http
GET /v1/tours/user/stock-movements/:idRespostas
200 OK
Retorna a movimentação completa, incluindo createdByTourUserId (injetado pela API) e os vínculos de rastreabilidade.
json
{
"id": 4,
"tourId": 1,
"tourStockItemId": 1,
"tourStockLocationId": 1,
"tourOrderItemId": null,
"tourSupplierId": null,
"createdByTourUserId": 1,
"kind": "purchase",
"quantityDelta": "50.0000",
"unitCost": "12.50",
"totalCost": "0.00",
"reason": "Compra doc",
"occurredAt": "2026-10-20T14:00:00.000-03:00",
"createdAt": "2026-10-07T15:11:13.283-03:00",
"toursStockItem": {
"id": 1,
"code": "RLSRFO50",
"name": "Bespoke Wooden Bike"
}
}404 Not Found
Ocorre quando a movimentação não existe na instância.
Atualizar Movimentação
Somente o campo reason pode ser corrigido — quantidades, custos e vínculos são imutáveis. Para corrigir valores, lance um estorno.
http
PUT /v1/tours/user/stock-movements/:idPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reason | string | Não | Novo motivo/observação do lançamento. |
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Movimentação
http
DELETE /v1/tours/user/stock-movements/:idRespostas
204 No Content
Remoção concluída com sucesso.
Prefira o estorno
Livros-razão existem para auditoria: remover um lançamento apaga o rastro do fato. A correção recomendada é registrar uma nova movimentação com quantityDelta de sinal oposto (estorno), preservando o histórico completo.