Skip to content

Catálogo de Serviços ​

O catálogo é o que a unidade vende e o que a agenda consome. Três recursos trabalham juntos:

  • Categorias agrupam os serviços no menu do cliente ("Cabelo", "Barba", "Estética") — evitam uma lista de 40 serviços solta na tela de agendamento.
  • Serviços são o que se vende. O campo central é durationMinutes, que o algoritmo usa para encaixar o cliente na grade. Junto vêm os buffers (preparo/limpeza que bloqueiam a agenda, mas não são cobrados nem exibidos) e a capacity, que separa atendimento exclusivo de sessão em grupo.
  • Recursos são o que é fisicamente disputado além da pessoa: cadeira, sala, equipamento. Sem eles, o sistema aceitaria dois agendamentos válidos que na prática brigam pelo mesmo espaço.

Headers obrigatórios

Todas as requisições devem incluir o header X-Booking-Id (UUID) e Authorization: Bearer {token} com o token de um usuário staff. A leitura (index/show/list) é livre para qualquer papel autenticado; a escrita exige owner ou manager (403 FORBIDDEN caso contrário).


Categorias de Serviço ​

Agrupamento puramente organizacional, com sortOrder para controlar a ordem de exibição no menu.

Listar Categorias ​

http
GET /v1/booking/user/service-categories

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
page / perPagenumberNãoPaginação (máx. 100 por página).
searchstringNãoBusca por nome.
isActivebooleanNãoFiltra por categorias ativas/inativas.
orderByenumNãoid, name, sortOrder ou createdAt (padrão: sortOrder).
orderDirectionenumNãoasc ou desc (padrão: asc).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/booking/user/service-categories?isActive=true" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna a página de categorias no formato meta/data, ordenadas por sortOrder.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 25
  },
  "data": [
    {
      "id": 1,
      "bookingId": 1,
      "name": "Cabelo",
      "slug": "cabelo",
      "sortOrder": 0,
      "isActive": true,
      "createdAt": "2026-09-10T14:22:10.000+00:00",
      "updatedAt": "2026-09-10T14:22:10.000+00:00"
    }
  ]
}

Criar Categoria ​

http
POST /v1/booking/user/service-categories

Payload (Body) ​

AtributoTipoObrigatórioDescrição
namestringSimNome da categoria (máx. 150 caracteres). O slug é gerado a partir dele, único por instância.
sortOrdernumberNãoOrdem de exibição (mín. 0, padrão: 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/booking/user/service-categories" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Cabelo" }'

Respostas ​

201 Created

Retorna o ID da categoria criada.

json
{
  "id": 1
}

Obter Categoria por ID ​

http
GET /v1/booking/user/service-categories/:id

Retorna a categoria com seus serviços (bookingServices). Responde 404 quando não existe na instância.

Atualizar Categoria ​

http
PUT /v1/booking/user/service-categories/:id

Aceita os mesmos campos da criação. O slug é regenerado apenas quando o nome muda. Responde 204 em caso de sucesso.

Remover Categoria ​

http
DELETE /v1/booking/user/service-categories/:id

Soft delete — a categoria some das listagens; os serviços vinculados não são removidos. Responde 204 em caso de sucesso.

Listar para Dropdown ​

http
GET /v1/booking/user/service-categories/list

Retorna [{ "value", "label" }] com search e isActive opcionais — ideal para o select de categoria no formulário de serviço.


Serviços ​

O item vendável. durationMinutes + buffers determinam quanto tempo da agenda o serviço ocupa; price é o valor de tabela (cada profissional pode ter preço e duração próprios).

Listar Serviços ​

http
GET /v1/booking/user/services

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
page / perPagenumberNãoPaginação (máx. 100 por página).
searchstringNãoBusca por nome.
bookingServiceCategoryIdnumberNãoFiltra por categoria.
isActivebooleanNãoFiltra por ativos/inativos.
isBookableOnlinebooleanNãoFiltra os agendáveis pelo portal do cliente.
orderByenumNãoid, name, sortOrder, price ou createdAt (padrão: sortOrder).
orderDirectionenumNãoasc ou desc (padrão: asc).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/booking/user/services?bookingServiceCategoryId=1&isBookableOnline=true" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna a página de serviços com a categoria embutida em cada item.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 25
  },
  "data": [
    {
      "id": 1,
      "bookingId": 1,
      "bookingServiceCategoryId": 1,
      "name": "Corte Masculino",
      "slug": "corte-masculino",
      "price": "80.00",
      "durationMinutes": 45,
      "capacity": 1,
      "isBookableOnline": true,
      "sortOrder": 0,
      "isActive": true,
      "createdAt": "2026-09-10T14:22:10.000+00:00",
      "updatedAt": "2026-09-10T14:22:10.000+00:00",
      "bookingServiceCategory": {
        "id": 1,
        "name": "Cabelo"
      }
    }
  ]
}

Criar Serviço ​

http
POST /v1/booking/user/services

Payload (Body) ​

AtributoTipoObrigatórioDescrição
namestringSimNome do serviço (máx. 150 caracteres). O slug é gerado a partir dele, único por instância.
pricenumberSimPreço de tabela (mín. 0).
durationMinutesnumberSimDuração do atendimento em minutos (mín. 1) — é o que a grade usa para encaixar o cliente.
bookingServiceCategoryIdnumberNãoCategoria do serviço (deve existir na instância).
descriptionstringNãoDescrição exibida no portal (máx. 10000 caracteres).
bufferBeforeMinutesnumberNãoPreparo antes do atendimento — bloqueia a agenda, não é cobrado (mín. 0, padrão: 0).
bufferAfterMinutesnumberNãoLimpeza/intervalo depois do atendimento (mín. 0, padrão: 0).
capacitynumberNãoAtendimentos simultâneos no mesmo horário (mín. 1, padrão: 1) — acima de 1 = sessão em grupo.
isRequiresConfirmationbooleanNãoExige confirmação manual mesmo com isAutoConfirm ligado na instância (padrão: false).
isBookableOnlinebooleanNãoVisível e agendável no portal do cliente (padrão: true).
colorCodestringNãoCor na agenda visual (máx. 20 caracteres).
imageUrlstringNãoImagem do serviço (máx. 255 caracteres).
sortOrdernumberNãoOrdem de exibição (mín. 0, padrão: 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/booking/user/services" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "bookingServiceCategoryId": 1,
    "name": "Corte Masculino",
    "price": 80,
    "durationMinutes": 45,
    "bufferAfterMinutes": 15,
    "isBookableOnline": true
  }'

Respostas ​

201 Created

Retorna o ID do serviço criado.

json
{
  "id": 1
}

422 Unprocessable Entity

Ocorre quando a categoria não existe na instância ou o payload é inválido.

json
{
  "errors": [
    {
      "message": "Categoria de serviço não encontrada",
      "rule": "database.exists",
      "field": "bookingServiceCategoryId"
    }
  ]
}

Obter Serviço por ID ​

http
GET /v1/booking/user/services/:id

Retorna o serviço completo (descrição, buffers, flags) com a categoria. Responde 404 quando não existe na instância.

Atualizar Serviço ​

http
PUT /v1/booking/user/services/:id

Aceita os mesmos campos da criação. O slug é regenerado apenas quando o nome muda. Responde 204 em caso de sucesso.

Remover Serviço ​

http
DELETE /v1/booking/user/services/:id

Soft delete. Agendamentos já criados preservam nome, preço e duração congelados — remover o serviço não afeta o histórico. Responde 204 em caso de sucesso.

Listar para Dropdown ​

http
GET /v1/booking/user/services/list

Retorna [{ "value", "label" }] com search, bookingServiceCategoryId, isActive e isBookableOnline opcionais.


Recursos ​

Cadeiras, salas, equipamentos — qualquer coisa fisicamente disputada além do profissional. Um recurso se torna obrigatório para um serviço via vínculo serviço ↔ recurso; na criação do agendamento, o sistema aloca automaticamente o primeiro recurso livre e falha com 422 RESOURCE_UNAVAILABLE se todos estiverem ocupados.

Listar Recursos ​

http
GET /v1/booking/user/resources

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
page / perPagenumberNãoPaginação (máx. 100 por página).
searchstringNãoBusca por nome.
typestringNãoFiltra por tipo livre (room, chair, equipment…).
isActivebooleanNãoFiltra por ativos/inativos.
orderByenumNãoid, 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/booking/user/resources?type=room" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna a página de recursos no formato meta/data.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 25
  },
  "data": [
    {
      "id": 1,
      "bookingId": 1,
      "name": "Sala 1",
      "type": "room",
      "capacity": 1,
      "isActive": true,
      "createdAt": "2026-09-10T14:22:10.000+00:00",
      "updatedAt": "2026-09-10T14:22:10.000+00:00"
    }
  ]
}

Criar Recurso ​

http
POST /v1/booking/user/resources

Payload (Body) ​

AtributoTipoObrigatórioDescrição
namestringSimNome do recurso (máx. 150 caracteres).
typestringNãoTipo livre para agrupar (máx. 100 caracteres).
capacitynumberNãoCapacidade do recurso (mín. 1, padrão: 1).
isActivebooleanNãoIndica se já nasce ativo (padrão: true).

Exemplo de Requisição ​

bash
curl -X POST "https://api.us.basis.tavares.in/v1/booking/user/resources" \
  -H "X-Booking-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Sala 1", "type": "room" }'

Respostas ​

201 Created

Retorna o ID do recurso criado.

json
{
  "id": 1
}

Obter Recurso por ID ​

http
GET /v1/booking/user/resources/:id

Responde 404 quando não existe na instância.

Atualizar Recurso ​

http
PUT /v1/booking/user/resources/:id

Aceita os mesmos campos da criação. Responde 204 em caso de sucesso.

Remover Recurso ​

http
DELETE /v1/booking/user/resources/:id

Soft delete. Responde 204 em caso de sucesso.

Listar para Dropdown ​

http
GET /v1/booking/user/resources/list

Retorna [{ "value", "label" }] com search, type e isActive opcionais.