Skip to content
Coda
  • Pages
    • API Pública de PICK Gestión
      • icon picker
        Reservas
      • Canchas
    • Instructivo Mederson
Share
Explore

Reservas

Documentación de Endpoints Públicos de Reservas


1. Obtener Espacios Libres

GET /api/v1/reservations/public/court/:courtId/free-spots
Permite consultar la disponibilidad de una cancha en un rango de fechas.
Parámetros de URL:
courtId: ID de la cancha (requerido)
Parámetros de Query:
startDate: Fecha inicial (YYYY-MM-DD) (requerido)
endDate: Fecha final (YYYY-MM-DD) (requerido)
Restricciones:
El rango de fechas no puede exceder 20 días
Las fechas deben ser válidas en formato YYYY-MM-DD
Ejemplo de solicitud:
GET /api/v1/reservations/public/court/123/free-spots?startDate=2025-03-20&endDate=2025-03-25
Respuesta exitosa (200):

{
"success": true,
"data": [
{
"date": "2025-03-20T00:00:00.000Z",
"dayOfWeek": "Wednesday",
"availableSlots": 12,
"timeSlots": [
{
"time": "08:00",
"isAvailable": true
},
{
"time": "09:00",
"isAvailable": false
}
// ... más slots de tiempo
]
}
// ... más días
]
}
Posibles errores:
400: Fechas inválidas o rango muy amplio
404: Cancha no encontrada
info
Sera importante luego de implementado hacer pruebas mirando el calendario para corroborar que esté funcionando la API correctamente, ya que es propensa a errores de timezone

2. Crear Reserva Pública

POST /api/v1/reservations/public/reservation
Permite crear una reserva sin necesidad de autenticación.
Cuerpo de la solicitud:

{
"court": "ID_DE_LA_CANCHA",
"date": "2024-03-20",
"startTime": "14:00",
"endTime": "15:00",
"name": "Juan Pérez",
"phone": "+34600000000",
"email": "juan@ejemplo.com"
}
Campos requeridos:
court: ID de la cancha
date: Fecha de la reserva (YYYY-MM-DD)
startTime: Hora de inicio (HH:mm)
endTime: Hora de fin (HH:mm)
name: Nombre del cliente
phone: Teléfono de contacto
email: Correo electrónico (opcional)
Restricciones:
Horario disponible: 8:00 - 23:00 (actualmente hardcodeado)
Duración mínima: 1 hora
Duración máxima: 3 horas
No se pueden hacer reservas para fechas pasadas
Máximo 2 semanas de anticipación
Límite de 30 solicitudes por hora por IP
Respuesta exitosa (200):

{
"success": true,
"data": {
"id": "12345",
"court": {
"id": "67890",
"name": "Cancha Principal"
},
"date": "2024-03-20",
"startTime": "14:00",
"endTime": "15:00",
"status": "confirmed",
"contact": {
"name": "Juan Pérez",
"phone": "+34600000000",
"email": "juan@ejemplo.com"
}
},
"message": "Reservation created successfully."
}
Posibles errores:
400: Datos inválidos o faltantes
400: Horario no disponible o ya reservado
400: Fuera del horario permitido
404: Cancha no encontrada
429: Demasiadas solicitudes (rate limit)
Notas adicionales:
Las reservas públicas se crean con estado "confirmed”
El estado de pago inicial es “unpaid”
Se aplica un límite de velocidad de 30 solicitudes por hora por IP
La cancha no debe estar en mantenimiento para poder reservar
info
Sera importante luego de implementado hacer pruebas para comprobar que no permite tomar una reserva un turno ya reservado.
light
Es posible hacer reservas de 2hs o 3hs. A considerar si se permite esto del frontend.

3. Obtener Detalles Públicos de una Reserva

GET /api/v1/reservations/public/:id
Permite obtener información básica de una reserva específica sin necesidad de autenticación.

Parámetros de URL:

id: ID de la reserva (MongoDB ObjectId) (requerido)

Respuesta exitosa (200):

{
"success": true,
"message": "Success",
"data": {
"day": "2025-05-18T00:00:00.000Z",
"startTime": "22:00",
"endTime": "23:00",
"name": "Leonel Mederdrut",
"courtName": "PICK Gavilán",
"courtAddress": "Gavilán 1564"
}
}

Posibles errores:

404: Reserva no encontrada
500: Error interno del servidor

Notas adicionales:

El día se devuelve en inglés (ej.: "Monday", "Tuesday", etc.)
Los horarios están en formato de 24 horas (HH:mm)
Si la dirección de la cancha no está disponible, se devolverá "Address not available"
Este endpoint no tiene límite de solicitudes por IP

Ejemplo de solicitud:

GET /api/v1/reservations/public/65f1a2b3c4d5e6f7g8h9i0j1
 
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.