Skip to content

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-units

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por código ou nome (máx. 150 caracteres).
orderByenumNãoid, code, name ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-units

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único na instância (máx. 50 caracteres).
namestringSimNome da unidade (máx. 150 caracteres).
baseTourMeasurementUnitIdnumberNãoUnidade base para conversão. null indica que esta é uma unidade base.
factornumberNãoFator de conversão sobre a unidade base (padrão: 1).
decimalPlacesnumberNãoCasas 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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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-categories

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por código ou nome.
parentTourProductCategoryIdnumberNãoFiltra por categoria pai (filhas diretas).
isActivebooleanNãoFiltra por categorias ativas/inativas.
orderByenumNãoid, code, name, sortOrder ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-categories

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único na instância (máx. 50 caracteres).
namestringSimNome da categoria (máx. 150 caracteres).
parentTourProductCategoryIdnumberNãoCategoria pai — monta a hierarquia (árvore).
tourTaxGroupIdnumberNãoGrupo de impostos padrão dos produtos da categoria.
sortOrdernumberNãoOrdem de exibição no cardápio.
isActivebooleanNãoIndica 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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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-stations

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por código ou nome.
isActivebooleanNãoFiltra por estações ativas/inativas.
orderByenumNãoid, code, name, sortOrder ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-stations

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único na instância (máx. 50 caracteres).
namestringSimNome da estação (máx. 150 caracteres).
sortOrdernumberNãoOrdem de exibição nas telas do KDS.
isActivebooleanNãoIndica 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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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/suppliers

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por nome, contato ou e-mail.
isActivebooleanNãoFiltra por fornecedores ativos/inativos.
orderByenumNãoid, name ou createdAt (padrão: id).
orderDirectionenumNãoasc 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/suppliers

Payload (Body) ​

AtributoTipoObrigatórioDescrição
namestringSimRazão social/nome (máx. 150 caracteres).
taxIdstringNãoDocumento fiscal — CNPJ/CPF (máx. 50 caracteres).
contactNamestringNãoNome do contato (máx. 150 caracteres).
emailstringNãoE-mail válido (máx. 250 caracteres).
phonestringNãoTelefone (máx. 50 caracteres).
leadTimeDaysnumberNãoPrazo médio de entrega em dias (mínimo: 0).
isActivebooleanNãoIndica 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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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 tourTaxGroupId do 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.
  • isStockTracked indica se a venda baixa estoque; isAvailable controla a disponibilidade no POS.

Listar Produtos ​

http
GET /v1/tours/user/products

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por nome ou SKU.
tourProductCategoryIdnumberNãoFiltra por categoria.
tourKdsStationIdnumberNãoFiltra por estação KDS.
isAvailablebooleanNãoFiltra por produtos disponíveis/indisponíveis.
isStockTrackedbooleanNãoFiltra por produtos com baixa de estoque.
orderByenumNãoid, name, sku, priceAmount, sortOrder ou createdAt (padrão: id).
orderDirectionenumNãoasc 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/products

Payload (Body) ​

AtributoTipoObrigatórioDescrição
tourProductCategoryIdnumberSimCategoria do produto.
tourTaxGroupIdnumberNãoGrupo de impostos — sobrepõe o da categoria.
tourKdsStationIdnumberNãoEstação KDS que prepara o produto.
tourStockItemIdnumberNãoInsumo baixado na venda (revenda direta). Não usar com ficha técnica.
skustringSimSKU único na instância (máx. 100 caracteres).
namestringSimNome do produto (máx. 150 caracteres).
descriptionstringNãoDescrição exibida no cardápio.
priceAmountnumberSimPreço de venda, na moeda da instância (mínimo: 0).
prepTimeMinutesnumberNãoTempo de preparo em minutos (inteiro, mínimo: 0).
isStockTrackedbooleanNãoIndica se a venda baixa estoque.
isAvailablebooleanNãoIndica se já nasce disponível no POS (padrão: true).
sortOrdernumberNãoOrdem 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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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-groups

Payload (Body) ​

AtributoTipoObrigatórioDescrição
modifierGroupIdsnumber[]SimIDs 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/:id

Respostas ​

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-groups

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por código ou nome.
orderByenumNãoid, name, code ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-groups

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único na instância (máx. 50 caracteres).
namestringSimNome do grupo (máx. 150 caracteres).
minSelectnumberNãoMínimo de opções obrigatórias (inteiro, mínimo: 0, padrão: 0).
maxSelectnumberNãoMá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/list

Aceita 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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-options

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
searchstringNãoBusca por código ou nome.
tourModifierGroupIdnumberNãoFiltra por grupo de modificadores.
isActivebooleanNãoFiltra por opções ativas/inativas.
orderByenumNãoid, name, code, sortOrder ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-options

Payload (Body) ​

AtributoTipoObrigatórioDescrição
tourModifierGroupIdnumberSimGrupo ao qual a opção pertence.
tourStockItemIdnumberNãoInsumo consumido do estoque quando a opção é escolhida.
codestringSimCódigo da opção (máx. 50 caracteres).
namestringSimNome da opção (máx. 150 caracteres).
priceDeltanumberNãoValor somado ao preço do item (padrão: 0).
sortOrdernumberNãoOrdem de exibição dentro do grupo (inteiro, mínimo: 0).
isActivebooleanNãoIndica 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

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-components

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100).
tourProductIdnumberNãoFiltra pela ficha técnica de um produto.
tourStockItemIdnumberNãoFiltra pelas receitas que usam um insumo.
orderByenumNãoid, quantity ou createdAt (padrão: id).
orderDirectionenumNãoasc 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-components

Payload (Body) ​

AtributoTipoObrigatórioDescrição
tourProductIdnumberSimProduto dono da ficha técnica.
tourStockItemIdnumberSimInsumo consumido.
tourMeasurementUnitIdnumberSimUnidade de medida da quantidade.
quantitynumberSimQuantidade consumida por unidade vendida.
wasteFactornumberNãoFator de perda/preparo sobre a quantidade (padrão: 0).
isOptionalbooleanNãoIndica 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/:id

Respostas ​

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/:id

Aceita 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/:id

Respostas ​

204 No Content

Remoção concluída via soft delete.