Documentación API
Cada negocio tiene su propia API REST bajo el prefijo /api/n/<slug>/. Todos los endpoints son compatibles con integraciones externas como agentes de IA (WhatsApp) o la web del negocio.
Todos los endpoints requieren autenticación. Se aceptan dos métodos:
Cada negocio tiene dos API keys, ambas en el panel de gestión (botón API):
El dashboard del negocio usa JWT. Se obtiene al hacer login.
Sustituye <slug> por el identificador del negocio. Lo encuentras en el listado principal junto a la URL del dashboard.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| fecha | string | Sí | Formato YYYY-MM-DD |
| servicio | string | Recomendado | Nombre del servicio. Ej: "OPTIMUM" o "OPTIMUM — Txiki". Acepta nombre exacto o prefijo. |
| servicio_id | integer | Alternativa | ID del servicio (alternativa al nombre) |
| opcion | string | Condicional | Obligatoria si el servicio tiene caracteristica con opciones. Ej: "Tela" (no distingue mayúsculas ni espacios). Sin ella (o con un valor no listado) se devuelve ok: true con la pregunta y las opciones. |
| excluir | string (uuid) | Opcional | ID de una reserva a ignorar en la ocupación. Útil al modificar: la propia reserva no bloquea su hueco y su hora aparece como libre. Un valor que no sea UUID se ignora. |
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| nombre | string | Sí | Nombre del cliente |
| telefono | string | Sí | Teléfono del cliente |
| fecha | string | Sí | YYYY-MM-DD |
| hora | string | Sí | HH:MM (de los slots disponibles) |
| servicio | string | Sí | Nombre del servicio |
| precio | string | Sí | Ej: "99 €" |
| modelo | string | Sí | Modelo del vehículo |
| tiempo_estimado | string | Sí | Ej: "1h 10min". Si se omite y la opción define uno propio, se usa el de la opción. |
| apellidos | string | No | |
| string | No | ||
| variante | string | No | Ej: "Txiki", "Grande" |
| opcion | string | Condicional | Obligatoria si el servicio tiene caracteristica. Sin ella (o con un valor no listado) → 400 con la pregunta tal cual en error (ej: "¿Los asientos son de tela o de piel? Opciones: Tela, Piel."). Se guarda en la reserva como caracteristica (nombre canónico del catálogo). |
| color | string | No | Color del vehículo |
| observaciones | string | No | |
| canal | string | No | Canal por el que entra la reserva: "whatsapp", "chat_web", "web" o "agente". Si se omite, el sistema lo deduce solo: JWT de miembro → panel; petición de navegador (con Origin) → web; API key server-to-server → agente. Un agente con varios canales (WhatsApp y chat web) debería mandarlo para distinguirlos. |
reservas/crear/ incluye checkin_url: el enlace con el
que el cliente registra a sus viajeros desde el móvil. Mándaselo en la conversación
justo después de confirmar la reserva. Si el negocio no tiene la feature activa, el
campo llega vacío o no aparece — en ese caso no menciones nada del registro.