Appearance
Catálogo de Produtos
O catálogo define tudo o que o estabelecimento vende no POS: produtos com SKU único e preço, organizados em categorias hierárquicas, despachados para estações KDS (bar, cozinha) e compostos por modificadores (adicionais, tamanhos) e fichas técnicas que baixam o estoque a cada venda.
A cadeia de dependências é: unidades de medida → categorias, estações KDS e fornecedores → produtos → grupos/opções de modificadores e componentes de receita.
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ão de escrita
Todas as mutações desta página (criar, atualizar, remover e sincronizar modificadores) exigem a permissão settings.manage. Sem ela, a API responde 403 com code: FORBIDDEN. As consultas (GET) não exigem permissão adicional.
Unidades de Medida
Unidades usadas em insumos e fichas técnicas. Uma unidade pode referenciar uma unidade base (baseTourMeasurementUnitId) com um fator de conversão — ex.: caixa com factor: 12 sobre a base unidade — permitindo comprar em uma unidade e consumir em outra.
Listar Unidades de Medida
http
GET /v1/tours/user/measurement-unitsParâ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 (máx. 150 caracteres). |
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/measurement-units?search=unidade" \
-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 unidades no formato meta/data.
json
{
"meta": {
"currentPage": 1,
"perPage": 10
},
"data": [
{
"id": 1,
"tourId": 1,
"baseTourMeasurementUnitId": null,
"code": "IFH2PUIH",
"name": "Bronze",
"factor": "1.000000",
"decimalPlaces": 2,
"createdAt": "2026-10-07T11:56:14.871-03:00",
"updatedAt": "2026-10-07T11:56:14.871-03:00"
}
]
}Criar Unidade de Medida
http
POST /v1/tours/user/measurement-unitsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código único na instância (máx. 50 caracteres). |
name | string | Sim | Nome da unidade (máx. 150 caracteres). |
baseTourMeasurementUnitId | number | Não | Unidade base para conversão. null indica que esta é uma unidade base. |
factor | number | Não | Fator de conversão sobre a unidade base (padrão: 1). |
decimalPlaces | number | Não | Casas decimais aceitas para quantidades nesta unidade (mínimo: 0). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/measurement-units" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "doc-un",
"name": "Unidade Doc",
"factor": 1,
"decimalPlaces": 0
}'Respostas
201 Created
Retorna o ID da unidade criada.
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o code já existe na instância ou a unidade base não existe.
Listar para Dropdown
http
GET /v1/tours/user/measurement-units/listAceita search e limit (1 a 500) como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 1,
"label": "Bronze"
},
{
"value": 4,
"label": "Unidade Doc"
}
]Obter Unidade de Medida por ID
http
GET /v1/tours/user/measurement-units/:idRespostas
200 OK
Retorna a unidade, incluindo o objeto baseTourMeasurementUnit quando há conversão.
json
{
"id": 4,
"tourId": 1,
"baseTourMeasurementUnitId": null,
"code": "doc-un",
"name": "Unidade Doc",
"factor": "1.000000",
"decimalPlaces": 0,
"createdAt": "2026-10-07T15:10:50.611-03:00",
"updatedAt": "2026-10-07T15:10:50.611-03:00",
"baseTourMeasurementUnit": null
}404 Not Found
Ocorre quando a unidade não existe na instância.
Atualizar Unidade de Medida
http
PUT /v1/tours/user/measurement-units/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Unidade de Medida
http
DELETE /v1/tours/user/measurement-units/:idRespostas
204 No Content
Remoção concluída via soft delete.
Categorias de Produtos
Categorias hierárquicas (parentTourProductCategoryId) que organizam o cardápio e agrupam produtos para relatórios. Uma categoria pode ter um grupo de impostos (tourTaxGroupId) padrão — aplicado aos produtos da categoria que não definem o próprio grupo.
Listar Categorias
http
GET /v1/tours/user/product-categoriesParâ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. |
parentTourProductCategoryId | number | Não | Filtra por categoria pai (filhas diretas). |
isActive | boolean | Não | Filtra por categorias ativas/inativas. |
orderBy | enum | Não | id, code, name, sortOrder 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,
"parentTourProductCategoryId": null,
"tourTaxGroupId": null,
"code": "ZPMKE6OU",
"name": "Shoes",
"sortOrder": 0,
"isActive": true,
"createdAt": "2026-10-07T11:56:14.895-03:00",
"updatedAt": "2026-10-07T11:56:14.895-03:00"
}
]
}Criar Categoria
http
POST /v1/tours/user/product-categoriesPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código único na instância (máx. 50 caracteres). |
name | string | Sim | Nome da categoria (máx. 150 caracteres). |
parentTourProductCategoryId | number | Não | Categoria pai — monta a hierarquia (árvore). |
tourTaxGroupId | number | Não | Grupo de impostos padrão dos produtos da categoria. |
sortOrder | number | Não | Ordem de exibição no cardápio. |
isActive | boolean | Não | Indica se já nasce ativa (padrão: true). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/product-categories" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "DOC-CAT",
"name": "Categoria Doc",
"tourTaxGroupId": 1,
"sortOrder": 10,
"isActive": true
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o code já existe, a categoria pai não existe ou o grupo de impostos é inválido.
Listar para Dropdown
http
GET /v1/tours/user/product-categories/listAceita search, isActive e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 4,
"label": "Categoria Doc"
},
{
"value": 1,
"label": "Shoes"
}
]Obter Categoria por ID
http
GET /v1/tours/user/product-categories/:idRespostas
200 OK
Retorna a categoria com os objetos toursTaxGroup e parentTourProductCategory resolvidos.
json
{
"id": 4,
"tourId": 1,
"parentTourProductCategoryId": null,
"tourTaxGroupId": 1,
"code": "DOC-CAT",
"name": "Categoria Doc",
"sortOrder": 10,
"isActive": true,
"createdAt": "2026-10-07T15:10:57.710-03:00",
"updatedAt": "2026-10-07T15:10:57.710-03:00",
"toursTaxGroup": {
"id": 1,
"code": "WMGCLJKQ",
"name": "Electronics"
},
"parentTourProductCategory": null
}404 Not Found
Ocorre quando a categoria não existe na instância.
Atualizar Categoria
http
PUT /v1/tours/user/product-categories/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Categoria
http
DELETE /v1/tours/user/product-categories/:idRespostas
204 No Content
Remoção concluída via soft delete.
Estações KDS
Estações de produção que recebem os itens do pedido no KDS (Kitchen Display System) — por exemplo, bar e cozinha. Cada produto aponta para a estação que o prepara.
Listar Estações KDS
http
GET /v1/tours/user/kds-stationsParâ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. |
isActive | boolean | Não | Filtra por estações ativas/inativas. |
orderBy | enum | Não | id, code, name, sortOrder 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": "PTSVAMDQ",
"name": "Movies",
"sortOrder": 0,
"isActive": true,
"createdAt": "2026-10-07T11:56:14.911-03:00",
"updatedAt": "2026-10-07T11:56:14.911-03:00"
}
]
}Criar Estação KDS
http
POST /v1/tours/user/kds-stationsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código único na instância (máx. 50 caracteres). |
name | string | Sim | Nome da estação (máx. 150 caracteres). |
sortOrder | number | Não | Ordem de exibição nas telas do KDS. |
isActive | boolean | Não | Indica se já nasce ativa (padrão: true). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/kds-stations" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "doc-bar",
"name": "Bar Doc",
"sortOrder": 10,
"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/kds-stations/listAceita search, isActive e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 4,
"label": "Bar Doc"
},
{
"value": 1,
"label": "Movies"
}
]Obter Estação KDS por ID
http
GET /v1/tours/user/kds-stations/:idRespostas
200 OK
json
{
"id": 4,
"tourId": 1,
"code": "doc-bar",
"name": "Bar Doc",
"sortOrder": 10,
"isActive": true,
"createdAt": "2026-10-07T15:10:48.903-03:00",
"updatedAt": "2026-10-07T15:10:48.903-03:00"
}404 Not Found
Ocorre quando a estação não existe na instância.
Atualizar Estação KDS
http
PUT /v1/tours/user/kds-stations/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Estação KDS
http
DELETE /v1/tours/user/kds-stations/:idRespostas
204 No Content
Remoção concluída via soft delete.
Fornecedores
Fornecedores de insumos, usados nas compras de estoque e como fornecedor padrão de cada item. O leadTimeDays alimenta a previsão de reposição.
Listar Fornecedores
http
GET /v1/tours/user/suppliersParâ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 nome, contato ou e-mail. |
isActive | boolean | Não | Filtra por fornecedores ativos/inativos. |
orderBy | enum | Não | id, 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,
"name": "Ward - Pouros",
"taxId": "56911715534103",
"contactName": "Isac Ledner-Carter",
"email": "Ethel.Herman72@yahoo.com",
"phone": "552.938.8801 x2049",
"leadTimeDays": 7,
"isActive": true,
"createdAt": "2026-10-07T11:56:14.972-03:00",
"updatedAt": "2026-10-07T11:56:14.972-03:00"
}
]
}Criar Fornecedor
http
POST /v1/tours/user/suppliersPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Sim | Razão social/nome (máx. 150 caracteres). |
taxId | string | Não | Documento fiscal — CNPJ/CPF (máx. 50 caracteres). |
contactName | string | Não | Nome do contato (máx. 150 caracteres). |
email | string | Não | E-mail válido (máx. 250 caracteres). |
phone | string | Não | Telefone (máx. 50 caracteres). |
leadTimeDays | number | Não | Prazo médio de entrega em dias (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/suppliers" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Fornecedor Doc",
"taxId": "12.345.678/0001-90",
"contactName": "Maria Doc",
"email": "fornecedor.doc@example.com",
"phone": "+55 11 99999-0001",
"leadTimeDays": 3,
"isActive": true
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o payload é inválido (ex.: email malformado).
Listar para Dropdown
http
GET /v1/tours/user/suppliers/listAceita search, isActive e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 4,
"label": "Fornecedor Doc"
},
{
"value": 1,
"label": "Ward - Pouros"
}
]Obter Fornecedor por ID
http
GET /v1/tours/user/suppliers/:idRespostas
200 OK
json
{
"id": 4,
"tourId": 1,
"name": "Fornecedor Doc",
"taxId": "12.345.678/0001-90",
"contactName": "Maria Doc",
"email": "fornecedor.doc@example.com",
"phone": "+55 11 99999-0001",
"leadTimeDays": 3,
"isActive": true,
"createdAt": "2026-10-07T15:11:13.835-03:00",
"updatedAt": "2026-10-07T15:11:13.835-03:00"
}404 Not Found
Ocorre quando o fornecedor não existe na instância.
Atualizar Fornecedor
http
PUT /v1/tours/user/suppliers/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Fornecedor
http
DELETE /v1/tours/user/suppliers/:idRespostas
204 No Content
Remoção concluída via soft delete.
Produtos
O item vendável do cardápio: bebida, prato, passeio ou diária avulsa. Cada produto tem SKU único na instância, preço (priceAmount), categoria obrigatória e, opcionalmente, grupo de impostos, estação KDS e tempo de preparo.
Regras de precificação e estoque:
- Impostos: o
tourTaxGroupIddo produto sobrepõe o grupo de impostos da categoria. Quando ausente, vale o da categoria. - Revenda direta: produtos revendidos como comprados (uma garrafa de água, por exemplo) vinculam
tourStockItemId— cada venda baixa 1 unidade do insumo. - Ficha técnica: produtos preparados (drinks, pratos) não usam
tourStockItemId; o consumo é calculado pelos componentes de receita. isStockTrackedindica se a venda baixa estoque;isAvailablecontrola a disponibilidade no POS.
Listar Produtos
http
GET /v1/tours/user/productsParâ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 nome ou SKU. |
tourProductCategoryId | number | Não | Filtra por categoria. |
tourKdsStationId | number | Não | Filtra por estação KDS. |
isAvailable | boolean | Não | Filtra por produtos disponíveis/indisponíveis. |
isStockTracked | boolean | Não | Filtra por produtos com baixa de estoque. |
orderBy | enum | Não | id, name, sku, priceAmount, sortOrder 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,
"tourProductCategoryId": 1,
"tourKdsStationId": 1,
"sku": "3XSHCPSMWH",
"name": "Bespoke Concrete Fish",
"priceAmount": "10.00",
"isStockTracked": false,
"isAvailable": true,
"sortOrder": 0,
"createdAt": "2026-10-07T11:56:15.084-03:00",
"updatedAt": "2026-10-07T11:56:15.084-03:00"
}
]
}Criar Produto
http
POST /v1/tours/user/productsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tourProductCategoryId | number | Sim | Categoria do produto. |
tourTaxGroupId | number | Não | Grupo de impostos — sobrepõe o da categoria. |
tourKdsStationId | number | Não | Estação KDS que prepara o produto. |
tourStockItemId | number | Não | Insumo baixado na venda (revenda direta). Não usar com ficha técnica. |
sku | string | Sim | SKU único na instância (máx. 100 caracteres). |
name | string | Sim | Nome do produto (máx. 150 caracteres). |
description | string | Não | Descrição exibida no cardápio. |
priceAmount | number | Sim | Preço de venda, na moeda da instância (mínimo: 0). |
prepTimeMinutes | number | Não | Tempo de preparo em minutos (inteiro, mínimo: 0). |
isStockTracked | boolean | Não | Indica se a venda baixa estoque. |
isAvailable | boolean | Não | Indica se já nasce disponível no POS (padrão: true). |
sortOrder | number | Não | Ordem de exibição no cardápio (inteiro, mínimo: 0). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/products" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"tourProductCategoryId": 1,
"tourTaxGroupId": 1,
"tourKdsStationId": 1,
"sku": "DOC-SKU-1",
"name": "Produto Doc",
"description": "Produto criado pela documentação",
"priceAmount": 45,
"prepTimeMinutes": 15,
"isStockTracked": false,
"isAvailable": true,
"sortOrder": 1
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o sku já existe na instância ou algum vínculo (categoria, grupo de impostos, estação, insumo) não existe.
Listar para Dropdown
http
GET /v1/tours/user/products/listAceita search, isAvailable e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 1,
"label": "Bespoke Concrete Fish"
},
{
"value": 4,
"label": "Produto Doc"
}
]Obter Produto por ID
http
GET /v1/tours/user/products/:idRespostas
200 OK
Retorna o produto com categoria, grupo de impostos, estação KDS, insumo de revenda, ficha técnica (toursRecipeComponents) e grupos de modificadores (toursModifierGroups) resolvidos.
json
{
"id": 4,
"tourId": 1,
"tourProductCategoryId": 1,
"tourTaxGroupId": 1,
"tourKdsStationId": 1,
"tourStockItemId": null,
"sku": "DOC-SKU-1",
"name": "Produto Doc",
"description": "Produto criado pela documentação",
"priceAmount": "45.00",
"prepTimeMinutes": 15,
"isStockTracked": false,
"isAvailable": true,
"sortOrder": 1,
"createdAt": "2026-10-07T15:10:58.439-03:00",
"updatedAt": "2026-10-07T15:10:58.439-03:00",
"toursTaxGroup": {
"id": 1,
"code": "WMGCLJKQ",
"name": "Electronics"
},
"toursProductCategory": {
"id": 1,
"code": "ZPMKE6OU",
"name": "Shoes"
},
"toursKdsStation": {
"id": 1,
"code": "PTSVAMDQ",
"name": "Movies"
},
"toursStockItem": null,
"toursRecipeComponents": [],
"toursModifierGroups": []
}404 Not Found
Ocorre quando o produto não existe na instância.
Atualizar Produto
http
PUT /v1/tours/user/products/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Sincronizar Grupos de Modificadores
Substitui o conjunto de grupos de modificadores vinculados ao produto (relação N:N — sync completo). Envie a lista final de IDs; grupos ausentes são desvinculados.
http
PUT /v1/tours/user/products/:id/modifier-groupsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
modifierGroupIds | number[] | Sim | IDs dos grupos de modificadores do produto. |
Exemplo de Requisição
bash
curl -X PUT "https://api.us.basis.tavares.in/v1/tours/user/products/4/modifier-groups" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"modifierGroupIds": [1]
}'Respostas
204 No Content
Vínculos sincronizados com sucesso.
422 Unprocessable Entity
Ocorre quando algum ID não corresponde a um grupo de modificadores da instância.
Remover Produto
http
DELETE /v1/tours/user/products/:idRespostas
204 No Content
Remoção concluída via soft delete.
Grupos de Modificadores
Conjuntos de personalização aplicáveis a um ou mais produtos — "ponto da carne", "adicionais", "tamanho". Os limites minSelect/maxSelect definem quantas opções o cliente pode (ou deve) escolher: minSelect: 1 torna o grupo obrigatório; maxSelect: null permite escolhas ilimitadas.
Listar Grupos de Modificadores
http
GET /v1/tours/user/modifier-groupsParâ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. |
orderBy | enum | Não | id, name, code 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": "O8KVQFIU",
"name": "Rubber",
"minSelect": 0,
"maxSelect": null,
"createdAt": "2026-10-07T11:56:15.115-03:00",
"updatedAt": "2026-10-07T11:56:15.115-03:00"
}
]
}Criar Grupo de Modificadores
http
POST /v1/tours/user/modifier-groupsPayload (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 grupo (máx. 150 caracteres). |
minSelect | number | Não | Mínimo de opções obrigatórias (inteiro, mínimo: 0, padrão: 0). |
maxSelect | number | Não | Máximo de opções permitidas (inteiro, mínimo: 0; null = ilimitado). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/modifier-groups" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "DOC-GRP-1",
"name": "Grupo Doc",
"minSelect": 0,
"maxSelect": 3
}'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/modifier-groups/listAceita search e limit como filtros opcionais de query.
Respostas
200 OK
json
[
{
"value": 4,
"label": "Grupo Doc"
},
{
"value": 1,
"label": "Rubber"
}
]Obter Grupo de Modificadores por ID
http
GET /v1/tours/user/modifier-groups/:idRespostas
200 OK
Retorna o grupo com suas opções em toursModifierOptions.
json
{
"id": 4,
"tourId": 1,
"code": "DOC-GRP-1",
"name": "Grupo Doc",
"minSelect": 0,
"maxSelect": 3,
"createdAt": "2026-10-07T15:10:51.501-03:00",
"updatedAt": "2026-10-07T15:10:51.501-03:00",
"toursModifierOptions": []
}404 Not Found
Ocorre quando o grupo não existe na instância.
Atualizar Grupo de Modificadores
http
PUT /v1/tours/user/modifier-groups/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Grupo de Modificadores
http
DELETE /v1/tours/user/modifier-groups/:idRespostas
204 No Content
Remoção concluída via soft delete.
Opções de Modificadores
As escolhas dentro de um grupo — cada opção soma um priceDelta ao preço do item e pode consumir um insumo do estoque (tourStockItemId), útil para adicionais que baixam insumo próprio (ex.: "extra bacon").
Listar Opções de Modificadores
http
GET /v1/tours/user/modifier-optionsParâ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. |
tourModifierGroupId | number | Não | Filtra por grupo de modificadores. |
isActive | boolean | Não | Filtra por opções ativas/inativas. |
orderBy | enum | Não | id, name, code, sortOrder 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,
"tourModifierGroupId": 1,
"code": "SMMOMOXX",
"name": "Small",
"priceDelta": "2.00",
"sortOrder": 0,
"isActive": true,
"createdAt": "2026-10-07T11:56:15.138-03:00",
"updatedAt": "2026-10-07T11:56:15.138-03:00"
}
]
}Criar Opção de Modificador
http
POST /v1/tours/user/modifier-optionsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tourModifierGroupId | number | Sim | Grupo ao qual a opção pertence. |
tourStockItemId | number | Não | Insumo consumido do estoque quando a opção é escolhida. |
code | string | Sim | Código da opção (máx. 50 caracteres). |
name | string | Sim | Nome da opção (máx. 150 caracteres). |
priceDelta | number | Não | Valor somado ao preço do item (padrão: 0). |
sortOrder | number | Não | Ordem de exibição dentro do grupo (inteiro, mínimo: 0). |
isActive | boolean | Não | Indica se já nasce ativa (padrão: true). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/modifier-options" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"tourModifierGroupId": 1,
"code": "DOC-OPT-1",
"name": "Opção Doc",
"priceDelta": 8,
"sortOrder": 1,
"isActive": true
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o grupo ou o insumo informado não existe na instância.
Obter Opção de Modificador por ID
http
GET /v1/tours/user/modifier-options/:idRespostas
200 OK
json
{
"id": 4,
"tourId": 1,
"tourModifierGroupId": 1,
"tourStockItemId": null,
"code": "DOC-OPT-1",
"name": "Opção Doc",
"priceDelta": "8.00",
"sortOrder": 1,
"isActive": true,
"createdAt": "2026-10-07T15:10:52.296-03:00",
"updatedAt": "2026-10-07T15:10:52.296-03:00"
}404 Not Found
Ocorre quando a opção não existe na instância.
Atualizar Opção de Modificador
http
PUT /v1/tours/user/modifier-options/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Opção de Modificador
http
DELETE /v1/tours/user/modifier-options/:idRespostas
204 No Content
Remoção concluída via soft delete.
Componentes de Receita (Ficha Técnica)
A ficha técnica de um produto: cada componente vincula um insumo com a quantidade consumida por unidade vendida, na unidade de medida indicada. O wasteFactor adiciona a margem de perda/preparo sobre a quantidade teórica (ex.: 0.05 = 5% de perda), e isOptional marca componentes que não impedem a venda quando faltam em estoque.
Listar Componentes de Receita
http
GET /v1/tours/user/recipe-componentsParâ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). |
tourProductId | number | Não | Filtra pela ficha técnica de um produto. |
tourStockItemId | number | Não | Filtra pelas receitas que usam um insumo. |
orderBy | enum | Não | id, quantity 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,
"tourProductId": 1,
"tourStockItemId": 1,
"tourMeasurementUnitId": 1,
"quantity": "2.0000",
"wasteFactor": "0.000000",
"isOptional": false,
"createdAt": "2026-10-07T11:56:15.188-03:00",
"updatedAt": "2026-10-07T11:56:15.188-03:00"
}
]
}Criar Componente de Receita
http
POST /v1/tours/user/recipe-componentsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tourProductId | number | Sim | Produto dono da ficha técnica. |
tourStockItemId | number | Sim | Insumo consumido. |
tourMeasurementUnitId | number | Sim | Unidade de medida da quantidade. |
quantity | number | Sim | Quantidade consumida por unidade vendida. |
wasteFactor | number | Não | Fator de perda/preparo sobre a quantidade (padrão: 0). |
isOptional | boolean | Não | Indica se o componente é opcional (não bloqueia a venda). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/recipe-components" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"tourProductId": 1,
"tourStockItemId": 1,
"tourMeasurementUnitId": 1,
"quantity": 0.35,
"wasteFactor": 0.05,
"isOptional": false
}'Respostas
201 Created
json
{
"id": 4
}422 Unprocessable Entity
Ocorre quando o produto, o insumo ou a unidade de medida não existe na instância.
Obter Componente de Receita por ID
http
GET /v1/tours/user/recipe-components/:idRespostas
200 OK
Retorna o componente com insumo e unidade de medida resolvidos.
json
{
"id": 4,
"tourId": 1,
"tourProductId": 1,
"tourStockItemId": 1,
"tourMeasurementUnitId": 1,
"quantity": "0.3500",
"wasteFactor": "0.050000",
"isOptional": false,
"createdAt": "2026-10-07T15:11:01.120-03:00",
"updatedAt": "2026-10-07T15:11:01.120-03:00",
"toursStockItem": {
"id": 1,
"code": "RLSRFO50",
"name": "Bespoke Wooden Bike"
},
"toursMeasurementUnit": {
"id": 1,
"code": "IFH2PUIH",
"name": "Bronze"
}
}404 Not Found
Ocorre quando o componente não existe na instância.
Atualizar Componente de Receita
http
PUT /v1/tours/user/recipe-components/:idAceita os mesmos campos da criação, todos opcionais.
Respostas
204 No Content
Atualização concluída com sucesso.
Remover Componente de Receita
http
DELETE /v1/tours/user/recipe-components/:idRespostas
204 No Content
Remoção concluída via soft delete.