Catálogo, disponibilidad, reservaciones y avisos de resbok para sistemas que se conectan (callcenter, bots, integraciones).
API para que otro sistema (un callcenter con bot telefónico y agentes, un asistente, una integración propia) conozca los lugares de resbok, sus reglas de reservación y la disponibilidad real, reserve, dé seguimiento y reciba avisos cuando una reservación cambia.
https://api.resbok.com/v1 — es la única dirección de la API. Esta página se abre ahí mismo, sin token.
Authorization: Bearer <token> (también se acepta X-API-Key: <token>).429. Muchos tokens inválidos desde la misma IP también dan 429 (un token válido siempre pasa).403. resbok entrega un token con todos los permisos; el callcenter
decide qué extensión o área usa cada operación (por ejemplo, reservar en una y dar seguimiento en otra). Para modificar o
cancelar siempre se confirma con el folio y el teléfono de la reservación.AAAA-MM-DD y horas HH:MM en 24 h, en la zona horaria del restaurante (zona_horaria).:00, :15, :30, :45).Todos los errores responden {"error": "<código>", "mensaje": "<texto>"}.
El mensaje está escrito para leerse tal cual al cliente.
404. Sincronicen GET /restaurantes periódicamente
(por ejemplo cada hora) y usen actualizado_en para saber qué cambió.GET /reservaciones?telefono=, GET /agenda/reservaciones?telefono=) lleva el teléfono en la URL:
no la guarden en bitácoras de su lado.acepta_reservas_por_api = true: se reserva en línea igual que en el portal. false: el lugar no reserva en línea. Se registra una solicitud pendiente, pero antes se revisan
personas y anticipación: un grupo fuera de rango o una hora pasada se rechaza igual.Respuesta mínima para comprobar que el API responde y que el token es válido, sin bajar el catálogo. Sirve con cualquier token activo (no pide permiso especial) y no se registra en la bitácora de resbok. Cuenta para el límite de peticiones por minuto: no lo consulten más de una vez por minuto.
| estado required | string Value: "ok" |
| hora_servidor required | string Hora del servidor (AAAA-MM-DD HH:MM:SS), el mismo reloj de |
{- "estado": "ok",
- "hora_servidor": "2026-09-14 16:35:50"
}Devuelve todos los restaurantes activos de resbok (los mismos del portal), ordenados por nombre, con la ficha completa de cada uno. Pensado para sincronizar el catálogo del bot cada cierto tiempo. Todos los filtros son opcionales, buscan texto parcial y no distinguen mayúsculas ni acentos.
| q | string Ejemplo: q=compa Nombre del lugar o uno de sus |
| ciudad | string Ejemplo: ciudad=Metepec Ciudad o alcaldía. |
| estado | string Ejemplo: estado=Ciudad de México Estado. |
| colonia | string Ejemplo: colonia=Polanco Colonia (Polanco, Condesa) o alcaldía (Miguel Hidalgo, Cuauhtémoc). |
| tipo | string Ejemplo: tipo=Vida nocturna Tipo de lugar (Restaurante, Vida nocturna, Club de playa, Eventos). |
| cocina | string Ejemplo: cocina=Mexicana Tipo de cocina (Mexicana, Bar, Discoteca…). |
| total required | integer >= 0 |
required | Lista de objects (FichaRestaurante) |
{- "restaurantes": [
- {
- "activo": true,
- "actualizado_en": "2026-09-14 16:23:27",
- "aforo": {
- "de_pie": 50,
- "estimado": true,
- "sentados": 84,
- "total": 134
}, - "areas": [
- {
- "fumar": false,
- "id": 181,
- "lugares_sentados": 84,
- "mesas": 30,
- "nombre": "SALON PRINCIPAL",
- "personas_maximo": 6,
- "personas_minimo": 1,
- "tipo": null
}
], - "calificacion": {
- "promedio": 5,
- "resenas": 1,
- "texto": "Tiene calificación de 5.0 de 5 con 1 reseña."
}, - "cocina": [
- "Discoteca"
], - "contacto": {
- "facebook": null,
- "whatsapp": null,
}, - "descripcion": "Situado en un rincón de POLANCO, este piano bar ofrece música EN VIVO, con gran talento musical por parte del ELENCO ARTISTICO, música ambiental, y una gran variedad de bebidas.",
- "descripcion_corta": "Situado en un rincón de POLANCO, este piano bar ofrece música EN VIVO, con gran talento musical por parte del ELENCO ARTISTICO, música ambiental, y una gran va…",
- "direccion": {
- "alcaldia": "Miguel Hidalgo",
- "calle": "Anatole France 145, Polanco, Polanco III Secc, Miguel Hidalgo Ciudad de México, CDMX",
- "ciudad": "Miguel Hidalgo",
- "codigo_postal": "11540",
- "colonia": "Polanco",
- "estado": "Ciudad de México",
- "lat": 19.407269,
- "lng": -99.190754
}, - "fotos": {
- "galeria": [
- {
- "etiqueta": "Comidas",
}, - {
- "etiqueta": "Comidas",
}
], - "menu": [ ]
}, - "horarios": [
- {
- "abre": "22:00",
- "cierra": "03:00",
- "dia": "jueves"
}, - {
- "abre": "22:00",
- "cierra": "03:00",
- "dia": "viernes"
}, - {
- "abre": "22:00",
- "cierra": "03:00",
- "dia": "sabado"
}
], - "id": 88,
- "nombre": "CHATEAU PIANO BAR",
- "nombres_alternos": [
- "el chateau",
- "chateau",
- "chateau piano bar"
], - "politicas": {
- "asistencia": null,
- "codigo_vestimenta": "Casual",
- "edad_recomendada": null,
- "mensaje_restaurante": null,
- "tolerancia": "Se respeta la reservación 15 minutos después de la hora."
}, - "promociones": [ ],
- "eventos": [ ],
- "experiencias": [ ],
- "rango_precio": {
- "maximo": 3500,
- "minimo": 500,
- "moneda": "MXN",
- "nivel": 3
}, - "reglas": {
- "acepta_reservas_por_api": true,
- "anticipacion_maxima_dias": null,
- "anticipacion_minima_minutos": 15,
- "asistencia_minima_porcentaje": 0,
- "intervalo_minutos": 15,
- "mesas_maximo": 25,
- "personas_de_pie_maximo": 50,
- "personas_maximo": 30,
- "personas_minimo": 2,
- "tolerancia_ilimitada": false,
- "tolerancia_minutos": 15
}, - "servicios": {
- "amenidades": [
- "Acceso para discapacitados"
], - "estacionamiento": true,
- "formas_pago": [
- "Visa",
- "Master Card",
- "American Express"
], - "musica": "Música en vivo",
- "texto": "Cuenta con valet parking, estacionamiento y acceso para personas con discapacidad. Acepta Visa, Master Card y American Express. Hay música en vivo.",
- "valet_parking": true
}, - "telefono": "5525678099",
- "tipo": [
- "Vida nocturna"
], - "turnos": [
- {
- "cada_minutos": 15,
- "desde": "22:00",
- "dia": "jueves",
- "hasta": "00:30",
- "termina_dia_siguiente": true,
- "tipo": "Almuerzo",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "22:00",
- "dia": "viernes",
- "hasta": "00:30",
- "termina_dia_siguiente": true,
- "tipo": "Almuerzo",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "22:00",
- "dia": "sabado",
- "hasta": "00:30",
- "termina_dia_siguiente": true,
- "tipo": "Almuerzo",
- "vigente_desde": null,
- "vigente_hasta": null
}
], - "zona_horaria": "America/Mexico_City"
}
], - "total": 1
}Misma ficha que en la lista, para un solo restaurante.
| id required | integer >= 1 Ejemplo: 3 Id del restaurante en resbok. |
| id required | integer |
| nombre required | string |
| nombres_alternos required | Lista de strings Como pide la gente el lugar por teléfono ("el chateau", "santana condesa"). La búsqueda |
| tipo required | Lista de strings Restaurante, Vida nocturna, Club de playa, Eventos. |
| cocina required | Lista de strings |
| descripcion_corta required | string Una frase para decir por teléfono. |
| descripcion required | string Descripción completa, sin HTML. |
required | object (RangoPrecio) |
required | object (Direccion) |
| telefono required | string or null |
| sitio_web required | string or null |
| zona_horaria required | string |
required | Lista de objects (Horario) Horarios de atención publicados. Pueden venir vacíos; la disponibilidad usa los turnos de reservación ( |
required | Lista de objects (Turno) Turnos de reservación por día: las únicas horas que se pueden reservar. Ofrezcan horas entre |
required | object (Reglas) Configuración de reservaciones del restaurante en resbok: el mismo formulario del dashboard (tolerancia, restricciones, asistencia, máximo de personas, de mesas, de personas de pie e intervalo). |
required | object (Politicas) Textos listos para leer al cliente; null si no aplica. |
required | Lista de objects (Promocion) Las que publica el lugar en "Mi sitio" (las mismas de su micrositio), no vencidas. Un lugar sin promociones en Mi sitio trae lista vacía. |
required | Lista de objects (Evento) <= 10 items Próximos eventos que publica el lugar en "Mi sitio": hoy y los siguientes 14 días, máximo 10, por fecha y hora. |
required | Lista de objects (Experiencia) Experiencias que publica el lugar en "Mi sitio" con alguna fecha en los próximos 14 días. Se reservan con |
required | object (Contacto) Ligas para mandar al cliente. null si el lugar no lo tiene. |
required | object (Fotos) |
required | Servicios (object) or null null si en ese momento no se pudieron leer los datos de hostess (falla temporal): significa "no se sabe", no "no tiene". Pasa junto con servicios, calificacion, areas, aforo y fotos.galeria. |
required | Calificacion (object) or null null si en ese momento no se pudieron leer los datos de hostess (falla temporal): significa "no se sabe", no "no tiene". Pasa junto con servicios, calificacion, areas, aforo y fotos.galeria. |
required | Lista de objects or null (Area) Áreas del restaurante con mesas (sin áreas de prueba). Su |
required | Aforo (object) or null null si en ese momento no se pudieron leer los datos de hostess (falla temporal): significa "no se sabe", no "no tiene". Pasa junto con servicios, calificacion, areas, aforo y fotos.galeria. |
| activo required | boolean |
| actualizado_en required | string or null Último cambio de la ficha o de su configuración (AAAA-MM-DD HH:MM:SS). Úsenlo para saber qué volver a leer al sincronizar. |
{- "activo": true,
- "actualizado_en": "2026-09-14 16:23:27",
- "aforo": {
- "de_pie": 30,
- "estimado": true,
- "sentados": 238,
- "total": 268
}, - "areas": [
- {
- "fumar": false,
- "id": 4,
- "lugares_sentados": 72,
- "mesas": 18,
- "nombre": "No fumadores",
- "personas_maximo": 4,
- "personas_minimo": 1,
- "tipo": "Interior"
}, - {
- "fumar": false,
- "id": 5,
- "lugares_sentados": 120,
- "mesas": 15,
- "nombre": "TERRAZA",
- "personas_maximo": 4,
- "personas_minimo": 1,
- "tipo": "Terraza"
}, - {
- "fumar": false,
- "id": 176,
- "lugares_sentados": 46,
- "mesas": 23,
- "nombre": "SALON PRINCIPAL",
- "personas_maximo": 2,
- "personas_minimo": 1,
- "tipo": "Interior"
}
], - "calificacion": {
- "promedio": 5,
- "resenas": 12,
- "texto": "Tiene calificación de 5.0 de 5 con 12 reseñas."
}, - "cocina": [
- "Churrascaría"
], - "contacto": {
- "instagram": null,
- "whatsapp": null,
}, - "descripcion": "Sumérgete en la auténtica experiencia brasileña en nuestro restaurante churrascaria. Ofrecemos cortes de carne de primera calidad y una amplia variedad de opciones de barbacoa. ¡Ven y disfruta de nuestro ambiente acogedor y de nuestro servicio excepcional!",
- "descripcion_corta": "Sumérgete en la auténtica experiencia brasileña en nuestro restaurante churrascaria.",
- "direccion": {
- "alcaldia": "Coyoacán",
- "calle": "Canal de Miramontes 2053, Coapa, Girasoles III",
- "ciudad": "Coyoacán",
- "codigo_postal": "04920",
- "colonia": "Coapa",
- "estado": "Ciudad de México",
- "lat": 19.3100138,
- "lng": -99.1243748
}, - "fotos": {
- "galeria": [
- {
- "etiqueta": "Comidas",
}, - {
- "etiqueta": "Comidas",
}
], - "menu": [ ]
}, - "horarios": [ ],
- "id": 3,
- "nombre": "Churrascaría",
- "nombres_alternos": [
- "la churrascaria",
- "churrascaria coapa"
], - "politicas": {
- "asistencia": "Debe llegar al menos el 60% de las personas de la reservación.",
- "codigo_vestimenta": "Casual",
- "edad_recomendada": 50,
- "mensaje_restaurante": null,
- "tolerancia": "Se respeta la reservación 20 minutos después de la hora."
}, - "promociones": [
- {
- "id": 7,
- "titulo": "Jueves 2x1 en copeo nacional",
- "descripcion": "De 10:00 a 11:30 p.m. en toda la carta nacional.",
- "precio": null,
- "descuento_porcentaje": null,
- "descuento_monto": null,
- "prepago": false,
- "personas_minimo": null,
- "personas_maximo": null,
- "vigencia": {
- "tipo": "dias_semana",
- "horarios": [
- {
- "dia": "jueves"
}
]
}, - "vigente_desde": null,
- "vigente_hasta": null,
- "tipo": "dias",
- "dias": [
- "jueves"
], - "condiciones": [
- "Válido jueves de 10:00 a 11:30 p.m.",
- "Aplica en tequila, mezcal y ron nacionales.",
- "No acumulable con otras promociones."
]
}, - {
- "id": 8,
- "titulo": "Las mañanitas en vivo",
- "descripcion": "El elenco le canta al festejado y la casa invita el postre.",
- "precio": null,
- "descuento_porcentaje": null,
- "descuento_monto": null,
- "prepago": false,
- "personas_minimo": null,
- "personas_maximo": null,
- "vigencia": {
- "tipo": "cumpleanos"
}, - "vigente_desde": null,
- "vigente_hasta": null,
- "tipo": "cumpleanos",
- "dias": [ ],
- "condiciones": [
- "Reserva con la ocasión Cumpleaños y dinos el nombre del festejado.",
- "Un postre de cortesía por mesa.",
- "Válido el día del cumpleaños."
]
}
], - "eventos": [
- {
- "id": 9,
- "titulo": "Noche de clásicos en español",
- "resumen": "El elenco completo, del bolero a la balada, con piano y voces en vivo toda la noche.",
- "fecha": "2026-09-18",
- "cada_semana": null,
- "proxima_fecha": "2026-09-18",
- "hora": "22:00",
- "genero": "Música en vivo",
- "nota": "Elenco completo"
}, - {
- "id": 10,
- "titulo": "Sábado de grandes voces",
- "resumen": "Las voces del elenco con repertorio de grandes intérpretes.",
- "fecha": null,
- "cada_semana": "sabado",
- "proxima_fecha": "2026-09-19",
- "hora": "22:00",
- "genero": "Música en vivo",
- "nota": "Mesas limitadas"
}
], - "experiencias": [ ],
- "rango_precio": {
- "maximo": 350,
- "minimo": 200,
- "moneda": "MXN",
- "nivel": 2
}, - "reglas": {
- "acepta_reservas_por_api": true,
- "anticipacion_maxima_dias": null,
- "anticipacion_minima_minutos": 15,
- "asistencia_minima_porcentaje": 60,
- "intervalo_minutos": 15,
- "mesas_maximo": 10,
- "personas_de_pie_maximo": 30,
- "personas_maximo": 30,
- "personas_minimo": 1,
- "tolerancia_ilimitada": false,
- "tolerancia_minutos": 20
}, - "servicios": {
- "amenidades": [ ],
- "estacionamiento": true,
- "formas_pago": [
- "Visa",
- "Master Card"
], - "musica": "Dj",
- "texto": "Cuenta con valet parking y estacionamiento. Acepta Visa y Master Card. Hay DJ.",
- "valet_parking": true
}, - "telefono": "55 5678 2854",
- "tipo": [
- "Restaurante"
], - "turnos": [
- {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "domingo",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "domingo",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "domingo",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "lunes",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "lunes",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "lunes",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "martes",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "martes",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "martes",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "miercoles",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "miercoles",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "miercoles",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "jueves",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "jueves",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "jueves",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "viernes",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "viernes",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "viernes",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "09:00",
- "dia": "sabado",
- "hasta": "11:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "13:00",
- "dia": "sabado",
- "hasta": "15:30",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}, - {
- "cada_minutos": 15,
- "desde": "16:00",
- "dia": "sabado",
- "hasta": "22:00",
- "termina_dia_siguiente": false,
- "tipo": "Desayuno",
- "vigente_desde": null,
- "vigente_hasta": null
}
], - "zona_horaria": "America/Mexico_City"
}Ocasiones de resbok (las mismas del portal, los micrositios y el libro del restaurante) para mandar ocasion_id
al reservar o al cambiar. Los ids no cambian; resbok puede ajustar los nombres. Requiere el permiso catalogo.leer.
| total required | integer >= 0 |
required | Lista de objects |
{- "total": 8,
- "ocasiones": [
- {
- "id": 1,
- "nombre": "Reserva Casual",
- "es_cumpleanos": false
}, - {
- "id": 2,
- "nombre": "Cumpleaños",
- "es_cumpleanos": true
}, - {
- "id": 3,
- "nombre": "Aniversario",
- "es_cumpleanos": false
}, - {
- "id": 4,
- "nombre": "Negocios",
- "es_cumpleanos": false
}, - {
- "id": 5,
- "nombre": "Cita",
- "es_cumpleanos": false
}, - {
- "id": 6,
- "nombre": "Salida con amigos",
- "es_cumpleanos": false
}, - {
- "id": 7,
- "nombre": "Despedida",
- "es_cumpleanos": false
}, - {
- "id": 8,
- "nombre": "Otra",
- "es_cumpleanos": false
}
]
}Consulta el motor real de resbok. Si no hay lugar, explica el motivo y ofrece hasta 3 alternativas,
primero las del mismo día y las más cercanas.
Se pregunta de una de dos maneras, nunca las dos juntas:
fecha: el día del calendario real. La 00:15 del sábado se pide como fecha = sábado, aunque
pertenezca al turno del viernes.jornada la noche a la que pertenece la hora, como la dice el cliente. "El viernes a
las 2 de la mañana" se pide como jornada = viernes y hora = 02:00; la API lo traduce al calendario y
responde con la fecha real (el sábado). Así no tienen que hacer ustedes la traducción.En los dos casos, el bloque jornada de la respuesta habla de la noche a la que pertenece la hora
consultada, no del día del calendario: preguntando por el sábado a las 02:00, el texto dice "El viernes…".
La hora de cierre del turno se puede reservar. En un turno de 23:00 a 01:00, la 01:00 es una hora válida
(el hasta es inclusivo). La primera hora que ya no entra es la siguiente, la 01:15.
asistencia_minima indica cuántas personas del grupo deben llegar para respetar la mesa (null si el lugar no tiene esa regla).
Áreas: con area_id solo cuenta el lugar en esa área, también para las alternativas. areas_con_lugar dice qué
áreas tienen lugar a esa hora cuando no hay lugar o cuando se pidió un área (para ofrecer otra si la pedida está llena); si hay
lugar y no se pidió área viene null. Cuando hay lugar, ocupacion trae ultimos_lugares y un texto para leer
("Quedan pocos lugares a esa hora").
| restaurante_id required | integer >= 1 Ejemplo: restaurante_id=88 |
| hora required | string^([01]\d|2[0-3]):(00|15|30|45)$ Ejemplo: hora=23:00 HH:MM en 24 h, en cuartos de hora. |
| personas required | integer [ 1 .. 500 ] Ejemplo: personas=2 |
| fecha | string <date> Ejemplo: fecha=2026-09-18 AAAA-MM-DD del calendario, en la zona horaria del restaurante. Obligatoria salvo que se mande |
| jornada | string <date> Ejemplo: jornada=2026-09-18 AAAA-MM-DD de la noche a la que pertenece la hora , para preguntar como habla el cliente:
|
| area_id | integer >= 1 Ejemplo: area_id=5 Opcional: |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
| area_id required | integer or null El área que se pidió ( |
| zona_horaria required | string Zona horaria IANA del restaurante. |
required | AsistenciaMinima (object) or null Personas del grupo que deben llegar; null si el lugar no tiene esa regla. |
| disponible required | boolean |
| motivo required | string or null (Motivo) Enum: "cerrado" "lleno" "solo_lista_espera" "fuera_de_anticipacion" "excede_maximo" "debajo_minimo" "no_acepta_api" "cerrado_por_el_lugar" "sin_dueno" null Por qué no hay lugar (null si hay lugar).
|
| mensaje required | string or null Texto para leer al cliente cuando no hay lugar; null si hay lugar. |
required | Lista de objects (Alternativa) <= 3 items Horarios con lugar para ofrecer. Vacío si hay lugar o si el motivo no admite alternativas. |
required | Lista de objects (VentanaReservacion) Solo cuando |
required | JornadaHorario (object) or null El mismo horario dicho como lo entiende el cliente. Los turnos de resbok cruzan la medianoche: el viernes de
22:00 a 01:00 incluye la 01:00 del sábado, y esa mesa es "del viernes" para el restaurante y para el cliente.
|
required | Lista de objects or null (AreaConLugar) Áreas (de las |
required | Ocupacion (object) or null Solo cuando hay lugar (con al menos 1 mesa libre). null en los demás casos o si no se pudo calcular. |
required | Lista de objects (Evento) Eventos que el lugar publicó en "Mi sitio" para esa noche (la jornada de la hora consultada: la 01:00 del sábado cuenta como el viernes). Vacío si no hay. |
required | Lista de objects (Experiencia) Experiencias de "Mi sitio" que aplican esa noche (día y vigencia). Hora, personas y cupo se revisan al reservar con |
Lista de objects or null Solo con |
{- "alternativas": [ ],
- "asistencia_minima": null,
- "disponible": true,
- "fecha": "2026-09-18",
- "hora": "23:00",
- "horario_del_dia": [ ],
- "jornada": null,
- "mensaje": null,
- "motivo": null,
- "personas": 2,
- "area_id": null,
- "restaurante_id": 88,
- "zona_horaria": "America/Mexico_City",
- "areas_con_lugar": null,
- "ocupacion": {
- "mesas_libres": 12,
- "ultimos_lugares": false,
- "texto": null,
- "estimado": true
}, - "eventos": [
- {
- "id": 9,
- "titulo": "Noche de clásicos en español",
- "resumen": "El elenco completo, del bolero a la balada, con piano y voces en vivo toda la noche.",
- "fecha": "2026-09-18",
- "cada_semana": null,
- "proxima_fecha": "2026-09-18",
- "hora": "22:00",
- "genero": "Música en vivo",
- "nota": "Elenco completo"
}
], - "experiencias": [ ]
}Revisa la disponibilidad con las mismas reglas que GET /disponibilidad y:
201 confirmada, con mesa asignada;201 pendiente de confirmación;409 sin_lugar con alternativas, o 201 pendiente si se envía si_no_hay_lugar: pendiente;409;area_id que no es un área de ese restaurante → 422 area_invalida (tampoco queda pendiente).Con area_id la mesa se busca solo en esa área; sin él, en cualquiera, como el portal. La respuesta trae area con el área de
la mesa asignada (en una pendiente, la que se pidió).
Enviar dos veces el mismo id_externo (misma llamada: mismo restaurante y teléfono) devuelve la misma reservación
con 200 y repetida: true. Si ese id_externo ya se usó con otro restaurante o teléfono → 409 id_externo_en_uso.
Requiere el permiso reservas.crear.
| restaurante_id required | integer >= 1 |
| fecha required | string <date> Fecha real (AAAA-MM-DD) en la zona horaria del restaurante. |
| hora required | string^([01]\d|2[0-3]):(00|15|30|45)$ |
| personas required | integer [ 1 .. 500 ] |
| nombre required | string <= 128 characters |
| apellido required | string <= 128 characters |
| telefono required | string Sin |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string <= 100 characters Id de la llamada en su sistema. Repetirlo devuelve la misma reservación, no crea otra. |
| area_id | integer or null >= 1 Opcional: |
| pais | string or null^[A-Za-z]{2}$ Opcional país del teléfono en ISO 3166 de 2 letras (MX, US, ES…). Sin él, México. Uno que no existe → |
| telefono_2 | string or null Opcional segundo teléfono, misma regla que |
| pais_2 | string or null^[A-Za-z]{2}$ Opcional país del segundo teléfono (ISO de 2 letras). Sin él, México. |
| correo | string or null <email> |
| fecha_nacimiento | string or null <date> Opcional: cumpleaños del cliente (AAAA-MM-DD); se guarda en su ficha del restaurante. No puede ser futura ni anterior a 1900. |
| ocasion | string or null Texto libre; se agrega a la nota que ve el restaurante. También se traduce a una ocasión del catálogo (cumple → Cumpleaños, aniversario, negocio, cita, amigos, despedida; otro texto → Otra) si no viene |
| ocasion_id | integer or null >= 1 Ocasión del catálogo ( |
| experiencia_id | integer or null >= 1 Experiencia de |
| festejado | string or null <= 128 characters Opcional de quién es el festejo, si no es de quien reserva. Va a la nota: "Cumpleaños de: Luis" (o "Festejado: Luis" si la ocasión no es un cumpleaños). También se guarda aparte y se devuelve en |
| nombre_festejado | string or null Igual que |
| peticion_especial | string or null <= 200 characters |
| si_no_hay_lugar | string Predeterminado: "rechazar" Enum: "rechazar" "pendiente" Si está lleno o cerrado, |
| modo_prueba | boolean Predeterminado: false Valida todo y responde como si reservara, pero no guarda nada ni avisa. |
| folio required | string^[1-9]\d{5}$ 6 dígitos para dictar por teléfono. Para consultar se pide también el teléfono. |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio"
|
| mensaje_para_cliente required | string |
| correo_enviado required | boolean true solo si el proveedor de correo confirmó el envío. Si es false, envíen ustedes la confirmación. |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
required | object (JornadaReservacion) A qué noche pertenece la mesa. |
required | AreaReservacion (object) or null Área de la mesa asignada; en una pendiente, el área que se pidió. null si no tiene mesa ni área pedida. |
required | object |
required | object or null Ocasión del catálogo, guardada aparte de la nota. null si no se indicó. |
| festejado required | string or null De quién es el festejo, guardado aparte de la nota. null si no hay. |
| nota required | string or null Experiencia , ocasión, festejado y petición especial, como los ve el restaurante. |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string |
| repetida required | boolean true si ya existía con ese id_externo (no se creó otra). |
| modo_prueba required | boolean |
| qr_url | string or null <uri> Liga pública (sin token) a un PNG con el QR del folio, para mandarla al cliente; la hostess lo escanea en la puerta. Con |
null or object Experiencia reservada; null si no se pidió. | |
Lista de objects (Promocion) Promociones de cumpleaños del lugar que aplican ese día cuando la ocasión es Cumpleaños, para ofrecerlas al cliente. Solo informativo: no se aplican ni se guardan. Vacío en otra ocasión. |
| folio required | string^[1-9]\d{5}$ 6 dígitos para dictar por teléfono. Para consultar se pide también el teléfono. |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio"
|
| mensaje_para_cliente required | string |
| correo_enviado required | boolean true solo si el proveedor de correo confirmó el envío. Si es false, envíen ustedes la confirmación. |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
required | object (JornadaReservacion) A qué noche pertenece la mesa. |
required | AreaReservacion (object) or null Área de la mesa asignada; en una pendiente, el área que se pidió. null si no tiene mesa ni área pedida. |
required | object |
required | object or null Ocasión del catálogo, guardada aparte de la nota. null si no se indicó. |
| festejado required | string or null De quién es el festejo, guardado aparte de la nota. null si no hay. |
| nota required | string or null Experiencia , ocasión, festejado y petición especial, como los ve el restaurante. |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string |
| repetida required | boolean true si ya existía con ese id_externo (no se creó otra). |
| modo_prueba required | boolean |
| qr_url | string or null <uri> Liga pública (sin token) a un PNG con el QR del folio, para mandarla al cliente; la hostess lo escanea en la puerta. Con |
null or object Experiencia reservada; null si no se pidió. | |
Lista de objects (Promocion) Promociones de cumpleaños del lugar que aplican ese día cuando la ocasión es Cumpleaños, para ofrecerlas al cliente. Solo informativo: no se aplican ni se guardan. Vacío en otra ocasión. |
{- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 2,
- "area_id": 181,
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "55 0000 0001",
- "correo": "prueba@ejemplo.com",
- "ocasion": "Aniversario",
- "peticion_especial": "Mesa cerca del piano",
- "origen": "bot",
- "id_externo": "llamada-2026-09-18-000123",
- "si_no_hay_lugar": "rechazar",
- "modo_prueba": false
}{- "folio": "684108",
- "estado": "confirmada",
- "mensaje_para_cliente": "Tu reservación está confirmada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 2,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": "Ocasión: Aniversario · Mesa cerca del piano",
- "origen": "agente",
- "id_externo": "ejemplo-docs-confirmada",
- "repetida": true,
- "modo_prueba": false
}Reservaciones de hoy en adelante creadas por este mismo token para ese teléfono.
Requiere el permiso reservas.leer_propias.
| telefono required | string Ejemplo: telefono=55 0000 0001 10 dígitos de México (acepta espacios y lada +52); de otro país, con |
| pais | string^[A-Za-z]{2}$ Ejemplo: pais=US Opcional país del teléfono, ISO de 2 letras (MX, US, ES…). Sin él, México. También se puede escribir la lada en |
| total required | integer >= 0 |
required | Lista de objects (Reservacion) |
{- "total": 2,
- "reservaciones": [
- {
- "folio": "329017",
- "estado": "cancelada",
- "mensaje_para_cliente": "Esta reservación está cancelada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-16",
- "hora": "23:00",
- "personas": 2,
- "jornada": {
- "fecha": "2026-09-16",
- "dia": "miércoles",
- "es_madrugada": false,
- "texto": "La reservación es del miércoles 16 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": null,
- "origen": "bot",
- "id_externo": "prueba-cc-095713-5",
- "repetida": false,
- "modo_prueba": false
}, - {
- "folio": "608121",
- "estado": "cancelada",
- "mensaje_para_cliente": "Esta reservación está cancelada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-16",
- "hora": "23:00",
- "personas": 2,
- "jornada": {
- "fecha": "2026-09-16",
- "dia": "miércoles",
- "es_madrugada": false,
- "texto": "La reservación es del miércoles 16 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": null,
- "origen": "bot",
- "id_externo": "prueba-cc-095845-5",
- "repetida": false,
- "modo_prueba": false
}
]
}"¿Quedó mi reserva?". El folio solo no basta: el teléfono debe coincidir, para que dictar un número
al azar no revele datos de otra persona. El estado se lee en vivo de resbok.
Solo devuelve reservaciones creadas por este mismo token. Requiere el permiso reservas.leer_propias.
| folio required | string^[1-9]\d{5}$ Ejemplo: 482913 |
| telefono required | string Ejemplo: telefono=55 0000 0001 10 dígitos de México (acepta espacios y lada +52); de otro país, con |
| pais | string^[A-Za-z]{2}$ Ejemplo: pais=US Opcional país del teléfono, ISO de 2 letras (MX, US, ES…). Sin él, México. También se puede escribir la lada en |
| folio required | string^[1-9]\d{5}$ 6 dígitos para dictar por teléfono. Para consultar se pide también el teléfono. |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio"
|
| mensaje_para_cliente required | string |
| correo_enviado required | boolean true solo si el proveedor de correo confirmó el envío. Si es false, envíen ustedes la confirmación. |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
required | object (JornadaReservacion) A qué noche pertenece la mesa. |
required | AreaReservacion (object) or null Área de la mesa asignada; en una pendiente, el área que se pidió. null si no tiene mesa ni área pedida. |
required | object |
required | object or null Ocasión del catálogo, guardada aparte de la nota. null si no se indicó. |
| festejado required | string or null De quién es el festejo, guardado aparte de la nota. null si no hay. |
| nota required | string or null Experiencia , ocasión, festejado y petición especial, como los ve el restaurante. |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string |
| repetida required | boolean true si ya existía con ese id_externo (no se creó otra). |
| modo_prueba required | boolean |
| qr_url | string or null <uri> Liga pública (sin token) a un PNG con el QR del folio, para mandarla al cliente; la hostess lo escanea en la puerta. Con |
null or object Experiencia reservada; null si no se pidió. | |
Lista de objects (Promocion) Promociones de cumpleaños del lugar que aplican ese día cuando la ocasión es Cumpleaños, para ofrecerlas al cliente. Solo informativo: no se aplican ni se guardan. Vacío en otra ocasión. |
{- "folio": "684108",
- "estado": "confirmada",
- "mensaje_para_cliente": "Tu reservación está confirmada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 2,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": "Ocasión: Aniversario · Mesa cerca del piano",
- "origen": "agente",
- "id_externo": "ejemplo-docs-confirmada",
- "repetida": false,
- "modo_prueba": false
}Servicio a clientes: "¿puedo cambiar mi reserva?". Folio + teléfono, como en la consulta. También se acepta PUT.
409 sin_lugar con alternativas y conserva su horario actual.area_id): busca mesa solo en esa área. Sin area_id la mesa nueva puede ser de cualquier área.
Un área que no es de ese restaurante → 422 area_invalida.409 no_modificable.200 con repetida: true y no cambia nada.Requiere el permiso reservas.modificar.
| folio required | string^[1-9]\d{5}$ Ejemplo: 204065 |
| telefono required | string El de la reservación (10 dígitos de México; acepta espacios y lada +52). Otro país, con |
| origen required | string Enum: "bot" "agente" Quién hace el cambio; queda en la bitácora. |
| pais | string^[A-Za-z]{2}$ Opcional país del teléfono (ISO de 2 letras), el mismo con que se creó. Sin él, México. |
| fecha | string <date> |
| hora | string^([01]\d|2[0-3]):(00|15|30|45)$ |
| personas | integer [ 1 .. 500 ] |
| area_id | integer >= 1
|
| telefono_2 | string or null Segundo teléfono nuevo (con |
| pais_2 | string or null^[A-Za-z]{2}$ País del segundo teléfono (ISO de 2 letras). Sin él, México. |
| ocasion_id | integer or null >= 1 Nueva ocasión del catálogo ( |
| ocasion | string or null Igual que |
| festejado | string or null <= 128 characters Nuevo festejado; vacío o null lo borra. |
| folio required | string^[1-9]\d{5}$ 6 dígitos para dictar por teléfono. Para consultar se pide también el teléfono. |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio"
|
| mensaje_para_cliente required | string |
| correo_enviado required | boolean true solo si el proveedor de correo confirmó el envío. Si es false, envíen ustedes la confirmación. |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
required | object (JornadaReservacion) A qué noche pertenece la mesa. |
required | AreaReservacion (object) or null Área de la mesa asignada; en una pendiente, el área que se pidió. null si no tiene mesa ni área pedida. |
required | object |
required | object or null Ocasión del catálogo, guardada aparte de la nota. null si no se indicó. |
| festejado required | string or null De quién es el festejo, guardado aparte de la nota. null si no hay. |
| nota required | string or null Experiencia , ocasión, festejado y petición especial, como los ve el restaurante. |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string |
| repetida required | boolean true si ya existía con ese id_externo (no se creó otra). |
| modo_prueba required | boolean |
| qr_url | string or null <uri> Liga pública (sin token) a un PNG con el QR del folio, para mandarla al cliente; la hostess lo escanea en la puerta. Con |
null or object Experiencia reservada; null si no se pidió. | |
Lista de objects (Promocion) Promociones de cumpleaños del lugar que aplican ese día cuando la ocasión es Cumpleaños, para ofrecerlas al cliente. Solo informativo: no se aplican ni se guardan. Vacío en otra ocasión. |
{- "telefono": "55 0000 0003",
- "origen": "agente",
- "hora": "22:30",
- "personas": 3
}{- "folio": "204065",
- "estado": "confirmada",
- "mensaje_para_cliente": "Tu reservación está confirmada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 3,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": null,
- "origen": "bot",
- "id_externo": "ejemplo-docs-cambios-111238",
- "repetida": false,
- "modo_prueba": false
}Cancela la reservación y libera su lugar; el restaurante recibe el aviso.
Los datos van en la URL (para clientes que no mandan cuerpo en DELETE); también se aceptan en un cuerpo JSON.
Cancelar una reservación ya cancelada responde 200 con repetida: true.
No se puede cancelar si ya se usó o su hora ya pasó → 409 no_modificable.
Requiere el permiso reservas.cancelar.
| folio required | string^[1-9]\d{5}$ Ejemplo: 204065 |
| telefono required | string Ejemplo: telefono=55 0000 0003 El de la reservación (10 dígitos; acepta espacios y lada +52). |
| origen required | string Enum: "bot" "agente" |
| pais | string^[A-Za-z]{2}$ Ejemplo: pais=US Opcional país del teléfono, ISO de 2 letras (MX, US, ES…). Sin él, México. También se puede escribir la lada en |
| motivo | string <= 200 characters Ejemplo: motivo=Cambio de planes Máximo 200 caracteres; queda en la bitácora. |
| folio required | string^[1-9]\d{5}$ 6 dígitos para dictar por teléfono. Para consultar se pide también el teléfono. |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio"
|
| mensaje_para_cliente required | string |
| correo_enviado required | boolean true solo si el proveedor de correo confirmó el envío. Si es false, envíen ustedes la confirmación. |
| restaurante_id required | integer |
| fecha required | string <date> |
| hora required | string |
| personas required | integer |
required | object (JornadaReservacion) A qué noche pertenece la mesa. |
required | AreaReservacion (object) or null Área de la mesa asignada; en una pendiente, el área que se pidió. null si no tiene mesa ni área pedida. |
required | object |
required | object or null Ocasión del catálogo, guardada aparte de la nota. null si no se indicó. |
| festejado required | string or null De quién es el festejo, guardado aparte de la nota. null si no hay. |
| nota required | string or null Experiencia , ocasión, festejado y petición especial, como los ve el restaurante. |
| origen required | string Enum: "bot" "agente" |
| id_externo required | string |
| repetida required | boolean true si ya existía con ese id_externo (no se creó otra). |
| modo_prueba required | boolean |
| qr_url | string or null <uri> Liga pública (sin token) a un PNG con el QR del folio, para mandarla al cliente; la hostess lo escanea en la puerta. Con |
null or object Experiencia reservada; null si no se pidió. | |
Lista de objects (Promocion) Promociones de cumpleaños del lugar que aplican ese día cuando la ocasión es Cumpleaños, para ofrecerlas al cliente. Solo informativo: no se aplican ni se guardan. Vacío en otra ocasión. |
{- "folio": "204065",
- "estado": "cancelada",
- "mensaje_para_cliente": "Esta reservación está cancelada.",
- "correo_enviado": false,
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 3,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "area": {
- "area_id": 181,
- "nombre": "SALON PRINCIPAL"
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "ocasion": null,
- "festejado": null,
- "nota": null,
- "origen": "bot",
- "id_externo": "ejemplo-docs-cambios-111238",
- "repetida": false,
- "modo_prueba": false
}En el seguimiento del día siguiente por WhatsApp, el cliente contesta si fue o no fue. resbok la combina con lo que
marcó la hostess (regla del 19-sep-2026): basta un "sí" de cualquiera de los dos para que cuente como asistencia;
queda como "no llegó" solo si la hostess lo marcó y el cliente no dijo que sí, o si el cliente dijo que no y la hostess
no marcó nada. Se acepta desde la hora de la reservación y hasta 48 h después; pasado el plazo no cambia nada.
La respuesta se guarda siempre, aunque no cambie la reservación. El folio puede ser de una reservación de este token o
de cualquier canal (el de los avisos). Requiere el permiso reservas.modificar.
| folio required | string^[1-9]\d{5}$ Ejemplo: 482913 |
| asistio required | boolean true = sí fui, false = no fui |
| respondido_en | string Hora de la respuesta del cliente, |
| folio | string |
| respuesta | string Enum: "si_fui" "no_fui" |
| resultado | string Enum: "aplicada" "sin_cambio" "no_aplica" "antes_de_hora" "fuera_de_plazo" aplicada = cambió el estado; sin_cambio = la regla deja el estado actual; no_aplica = cancelada; antes_de_hora = la reservación aún no ocurre; fuera_de_plazo = pasaron las 48 h o ya la marcó el sistema. |
| estado | string or null Enum: "asistio" "no_llego" "pendiente" "cancelada" null |
| marcado_por | string or null Enum: "restaurante" "sistema" "cliente" null |
{- "asistio": true,
- "respondido_en": "2026-09-19 10:32:00"
}{- "folio": "482913",
- "respuesta": "no_fui",
- "resultado": "aplicada",
- "estado": "no_llego",
- "marcado_por": "cliente"
}Todas las reservaciones de resbok, de cualquier canal (solo lectura, permiso reservas.leer_todas).
Todas las reservaciones de resbok de ese restaurante en una noche (hostess, portal, web, teléfono, Google,
otras integraciones…), no solo las creadas por este token. La fecha que se pide es la noche: incluye su
madrugada (la 01:00 del día siguiente) y no la madrugada de ese mismo día, que es de la noche anterior. fecha y
hora de cada reservación son las del reloj; jornada dice a qué noche pertenece.
No incluye reservaciones a medio crear ni de pruebas.
Solo lectura: modificar y cancelar sigue siendo solo para reservaciones con folio de este token.
Trae datos de clientes: requiere el permiso reservas.leer_todas, que resbok otorga aparte.
| id required | integer >= 1 Ejemplo: 88 Id del restaurante en resbok. |
| fecha required | string <date> Ejemplo: fecha=2026-09-18 Día real (AAAA-MM-DD) en la zona horaria del restaurante. |
| pagina | integer >= 1 Predeterminado: 1 |
| por_pagina | integer [ 1 .. 100 ] Predeterminado: 50 |
| total required | integer >= 0 |
| pagina required | integer >= 1 |
| por_pagina required | integer [ 1 .. 100 ] |
| hay_mas required | boolean true si hay más páginas. |
required | Lista de objects (ReservacionAgenda) |
{- "total": 8,
- "pagina": 1,
- "por_pagina": 2,
- "hay_mas": true,
- "reservaciones": [
- {
- "id": 2837,
- "folio": "684108",
- "canal": "callmarket",
- "estado": "cancelada",
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 2,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "nota": "Ocasión: Aniversario · Mesa cerca del piano",
- "creada_en": "2026-09-14 04:00:05"
}, - {
- "id": 2843,
- "folio": "204065",
- "canal": "callmarket",
- "estado": "cancelada",
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 3,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "nota": null,
- "creada_en": "2026-09-14 05:12:38"
}
]
}Reservaciones de hoy en adelante (hora de México) con ese teléfono, en cualquier restaurante habilitado y por cualquier canal. Compara los últimos 10 dígitos: encuentra el número aunque se haya guardado con lada o espacios. Máximo 50, ordenadas por fecha y hora.
Requiere el permiso reservas.leer_todas.
| telefono required | string Ejemplo: telefono=55 0000 0003 10 dígitos de México (acepta espacios, guiones, paréntesis y lada +52); de otro país, con |
| pais | string^[A-Za-z]{2}$ Ejemplo: pais=US Opcional país del teléfono, ISO de 2 letras (MX, US, ES…). Sin él, México. También se puede escribir la lada en |
| total required | integer >= 0 |
required | Lista de objects (ReservacionAgenda) <= 50 items |
{- "total": 1,
- "reservaciones": [
- {
- "id": 2843,
- "folio": "204065",
- "canal": "callmarket",
- "estado": "cancelada",
- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 3,
- "jornada": {
- "fecha": "2026-09-18",
- "dia": "viernes",
- "es_madrugada": false,
- "texto": "La reservación es del viernes 18 de septiembre."
}, - "cliente": {
- "nombre": "Prueba",
- "apellido": "Demo",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba@ejemplo.com"
}, - "nota": null,
- "creada_en": "2026-09-14 05:12:38"
}
]
}resbok le avisa a su sistema cuando una reservación nace o cambia de estado, en los restaurantes habilitados.
Se configura por integración (URL https://…, qué eventos y un secreto que resbok genera y enseña una sola vez).
Cómo llega: POST a su URL con Content-Type: application/json, User-Agent: resbok-Webhook/1.0 y la cabecera
X-Firma: sha256=<HMAC-SHA256 en hexadecimal del cuerpo exacto, con su secreto>.
Qué contestar: un 2xx en menos de 10 segundos. Si no, se reintenta a 1, 2, 4, 8… minutos (tope una hora) hasta
12 veces; después queda marcado para revisión y se puede reintentar a mano.
Comprobar la firma: firmen el cuerpo tal cual llegó (sin volver a armar el JSON) y compárenlo con la cabecera.
En PHP: hash_equals('sha256=' . hash_hmac('sha256', $cuerpoCrudo, $secreto), $_SERVER['HTTP_X_FIRMA']).
Las reservaciones que creó la propia integración no le llegan como nueva (ya las conoce); sus cambios sí.
Aviso de prueba: al configurar el webhook se puede mandar uno con "folio": "PRUEBA", "estado": "prueba" y
"evento": "prueba", firmado igual, para comprobar la firma antes de encender los eventos.
Eventos que se pueden encender por integración: reserva.nueva, reserva.confirmada, reserva.pendiente,
reserva.cancelada, reserva.asistio y reserva.no_asistio. El cuerpo dice cuál fue con evento + estado.
| X-Firma required | string Ejemplo: sha256=5d41402abc4b2a76b9719d911017c592ae2f1b6a4a1b0c0e7f1d3c5b7a9e0f12
|
| folio required | string Folio de 6 dígitos de la reservación (el mismo de |
| estado required | string Enum: "confirmada" "pendiente_confirmacion" "cancelada" "asistio" "no_asistio" |
| fecha required | string <date> Fecha del calendario (una reservación de la 1 a. m. del sábado dice sábado). |
| hora required | string |
| personas required | integer |
| nombre required | string or null |
| apellido required | string or null |
| telefono required | string or null Número nacional, sin lada. |
| correo required | string or null |
| restaurante_id required | integer |
required | object |
| origen required | string Value: "masmesa" Valor fijo que identifica a resbok como quien manda el aviso (se conserva por compatibilidad). |
| evento required | string Enum: "nueva" "cambio"
|
| canal required | string Enum: "hostess" "portal" "telefono" "web" "rp" "whatsapp" "google" "widget" "callmarket" "otro" Por dónde entró la reservación; el mismo catálogo de la agenda. |
| pais required | string or null País del teléfono (ISO de 2 letras). |
| telefono_internacional required | string or null |
| marcado_por | string Enum: "restaurante" "cliente" "sistema" Solo en |
{- "folio": "632544",
- "estado": "confirmada",
- "fecha": "2026-10-03",
- "hora": "21:30",
- "personas": 4,
- "nombre": "Ana",
- "apellido": "López",
- "telefono": "5512345678",
- "correo": "ana@example.com",
- "restaurante_id": 88,
- "jornada": {
- "fecha": "2026-10-03"
}, - "origen": "masmesa",
- "evento": "nueva",
- "canal": "portal",
- "pais": "MX",
- "telefono_internacional": "+525512345678"
}