◈ GESTIÓN

Documentación API

← Volver

Documentación de la API

Cada negocio tiene su propia API REST bajo el prefijo /api/n/<slug>/. Todos los endpoints son compatibles con integraciones externas como Make.com, n8n o agentes de WhatsApp.

Autenticación

Todos los endpoints requieren autenticación. Se aceptan dos métodos:

Opción 1 — X-API-Key (integraciones externas)

Para Make.com, n8n, agentes de WhatsApp u otras integraciones. La API key de cada negocio está en el panel de gestión (botón API).

X-API-Key: a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5
⚠️ Importante: La API key de un negocio solo da acceso a los endpoints de ESE negocio. Una key de otro negocio devuelve 401.

Opción 2 — JWT Bearer (dashboard web)

El dashboard del negocio usa JWT. Se obtiene al hacer login.

Authorization: Bearer <token>
Obtener JWT: POST /api/auth/login/ con {"username": "email", "password": "..."}

Respuesta sin autenticación

{ "ok": false, "error": "Autenticación requerida. Incluye X-API-Key o un JWT válido." }

El slug del negocio

Sustituye <slug> por el identificador del negocio. Lo encuentras en el listado principal junto a la URL del dashboard.

# Ejemplo para PIT-LANE: /api/n/pit-lane/disponibilidad/ # Ejemplo para Autolavado García: /api/n/autolavado-garcia/disponibilidad/

Listar servicios

GET /api/n/<slug>/servicios/ API Key / JWT Lista los servicios activos del negocio
Respuesta
{ "ok": true, "servicios": [ { "id": 1, "nombre": "OPTIMUM — Txiki", "descripcion": null, "precio": "99.00", "duracion_minutos": 70, "hora_max_reserva": "15:15", "es_simultaneo": false, "color_hex": "#3b82f6", "orden": 0 } ] }
hora_max_reserva: hora límite de inicio del servicio. Si es null se calcula automáticamente como hora_cierre − duración. Úsala para mostrar al cliente cuándo es la última hora disponible.

Slots disponibles

POST /api/n/<slug>/disponibilidad/ API Key / JWT Horas libres para una fecha y servicio
⚠️ El servicio es necesario para calcular la duración y la hora límite correctamente. Sin él se devuelve ok: true con la lista de servicios disponibles para que el agente los muestre al cliente.
CampoTipoRequeridoDescripción
fechastringFormato YYYY-MM-DD
serviciostringRecomendadoNombre del servicio. Ej: "OPTIMUM" o "OPTIMUM — Txiki". Acepta nombre exacto o prefijo.
servicio_idintegerAlternativaID del servicio (alternativa al nombre)
Body — con nombre del servicio (recomendado para agentes)
{ "fecha": "2026-06-03", "servicio": "OPTIMUM — Txiki" }
Respuesta — slots disponibles
{ "ok": true, "disponibles": ["08:15", "09:15", "10:15", "11:15"], "servicio": { "id": 1, "nombre": "OPTIMUM — Txiki", "duracion_minutos": 70, "hora_max_reserva": "15:15" } }
Respuesta — sin servicio (el agente debe preguntar cuál)
{ "ok": true, "disponibles": [], "mensaje": "Para consultar la disponibilidad necesito saber el servicio que deseas. Los servicios disponibles son: OPTIMUM — Txiki, VIP — Pequeño, LUXURY — Grande." }
Respuesta — sin huecos por hora límite
{ "ok": true, "disponibles": [], "servicio": { "nombre": "VIP — Pequeño", "hora_max_reserva": "09:15", ... }, "mensaje": "No hay huecos disponibles para 'VIP — Pequeño'. Este servicio solo puede reservarse hasta las 09:15." }
Nota: Los slots respetan la duración del servicio, la pausa al mediodía, los huecos ocupados y la hora máxima de inicio configurada por servicio.

Crear reserva

POST /api/n/<slug>/reservas/crear/ API Key / JWT Crea una nueva reserva
CampoTipoRequeridoDescripción
nombrestringNombre del cliente
telefonostringTeléfono del cliente
fechastringYYYY-MM-DD
horastringHH:MM (de los slots disponibles)
serviciostringNombre del servicio
preciostringEj: "99 €"
modelostringModelo del vehículo
tiempo_estimadostringEj: "1h 10min"
apellidosstringNo
emailstringNo
variantestringNoEj: "Txiki", "Grande"
colorstringNoColor del vehículo
observacionesstringNo
Body
{ "nombre": "Ana", "apellidos": "García", "telefono": "600111222", "email": "ana@email.com", "fecha": "2026-06-03", "hora": "09:15", "servicio": "OPTIMUM — Txiki", "variante": "Txiki", "precio": "99 €", "modelo": "Audi A1 2023", "color": "Blanco", "tiempo_estimado": "1h 10min", "observaciones": "Notas opcionales" }
Respuesta 201
{ "ok": true, "ref": "PL-AB3X7K", "id": "550e8400-e29b-41d4-a716-446655440000" }
Respuesta — slot ocupado
{ "ok": false, "error": "Horario ocupado. Capacidad máxima alcanzada hasta las 11:15" }
Respuesta — hora límite superada
{ "ok": false, "reservada": false, "error": "'VIP — Pequeño' no puede reservarse más tarde de las 09:15. Con 480 min de duración no daría tiempo antes del cierre." }

Buscar reserva

POST /api/n/<slug>/reservas/buscar/ API Key / JWT Busca por nombre + fecha + hora
Body
{ "nombre": "Ana García", "fecha": "2026-06-03", "hora": "09:15" }
Respuesta
{ "ok": true, "encontrada": true, "reserva": { "id": "...", "ref": "PL-AB3X7K", "estado": "activa", ... } }

Anular reserva

POST /api/n/<slug>/reservas/anular/ API Key / JWT Cancela una reserva por ID
Body
{ "id": "550e8400-e29b-41d4-a716-446655440000" }
Respuesta
{ "ok": true, "mensaje": "Reserva PL-AB3X7K cancelada correctamente" }

Modificar reserva

POST /api/n/<slug>/reservas/modificar/ API Key / JWT Modifica campos de una reserva existente
Nota: Solo envía los campos que quieras cambiar, junto con el id. El sistema valida solapamientos excluyendo la propia reserva.
Body
{ "id": "550e8400-e29b-41d4-a716-446655440000", "fecha": "2026-06-04", "hora": "10:15" }
Respuesta
{ "ok": true, "reserva": { "id": "...", "fecha": "2026-06-04", "hora": "10:15", ... } }

Citas por teléfono

POST /api/n/<slug>/citas/ API Key / JWT Todas las reservas activas de un teléfono
Body
{ "telefono": "600111222" }
Respuesta
{ "ok": true, "reservas": [ { "id": "...", "ref": "PL-AB3X7K", "fecha": "2026-06-03", "hora": "09:15", ... } ] }

Listar todas las reservas

GET /api/n/<slug>/reservas/ JWT requerido Lista completa de reservas del negocio
Requiere autenticación. Obtén el token primero con POST /api/auth/login/ y envíalo en la cabecera Authorization: Bearer <token>.
Respuesta
[ { "id": "550e8400-...", "ref": "PL-AB3X7K", "fecha": "2026-06-03", "hora": "09:15", "nombre": "Ana", "apellidos": "García", "telefono": "600111222", "servicio": "OPTIMUM — Txiki", "precio": "99 €", "modelo": "Audi A1 2023", "tiempo_estimado": "1h 10min", "estado": "activa" } ]