Download OpenAPI specification:
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 restaurantes 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 — la dirección de la API desde el 1-oct-2026. Esta página se abre ahí mismo, sin token.https://mesas.masmesa.com/callcenter/v1 — la dirección anterior. Sigue funcionando igual (mismas rutas, mismos
tokens, mismas respuestas): quien ya está conectado no tiene que cambiar nada. Las integraciones nuevas usan la primera.Etapa A: catálogo y disponibilidad.
Etapa B: crear reservaciones con folio y consultarlas.
Etapa C: modificar y cancelar (servicio a clientes).
Etapa D: nivel alto: leer todas las reservaciones de resbok, de cualquier canal (solo lectura).
Etapa E (pedido de CallMarket): turnos de reservación por día en la ficha; direccion.colonia con la
colonia real y direccion.alcaldia nueva; nombres_alternos (también en la búsqueda q); GET /salud.
Etapa E2 (pedido de CallMarket): cuando está cerrado, mensaje con el horario de reservaciones de ese
día (o el siguiente día que abre), horario_del_dia y alternativas del siguiente día con reservaciones; promociones con
vigente_desde y vigente_hasta.
Etapa H1 ("Lucy hostess"): la ficha trae contacto (Instagram, Facebook, micrositio, Google Maps),
fotos (principal, logo, galería), servicios (con texto para leer), calificacion, areas y aforo estimado.
Etapa H2 ("Lucy hostess"): area_id opcional para consultar, reservar y modificar en un área
(terraza, salón…); areas_con_lugar y ocupacion ("últimos lugares") en la disponibilidad; area en la reservación.
Versión 1.8: la ficha trae contacto.pagina_masmesa y fotos.menu; contacto.micrositio solo con dominios que el lugar usa.
Versión 1.9: jornada — el horario y la reservación dicen a qué noche pertenecen, porque los turnos
cruzan la medianoche. Además, un restaurante con los turnos mal cargados ya no se ofrece como reservable.
Versión 1.10: se puede preguntar por la noche (jornada) en vez de por el día del calendario, y el
texto de la jornada habla siempre de esa noche.
Versión 1.11: teléfonos de cualquier país, con pais o con su lada.
Versión 1.12: segundo teléfono opcional, fecha de nacimiento validada y festejado.
Versión 1.13: ocasión del catálogo, festejado guardado aparte, promociones y eventos reales de "Mi sitio".
Versión 1.14: experiencias de "Mi sitio" (paquetes que se reservan como una mesa y se pagan en el lugar).
Versión 1.15: el aviso (webhook) sale por todas las reservaciones de los restaurantes habilitados, de cualquier
canal, con más datos (evento, canal, cliente, jornada).
Versión 1.16: respuesta del cliente al seguimiento de asistencia (POST /reservaciones/{folio}/respuesta-cliente),
marcado_por: "cliente" en los avisos y el motivo sin_dueno con lugares recomendados.
Versión 1.17 (esta): la madrugada pertenece a la noche anterior también en la agenda, qr_url con el QR del folio,
webhooks por integración y la dirección nueva https://api.resbok.com/v1.
https://api.resbok.com/v1. La anterior sigue funcionando sin cambios.qr_url en las respuestas de reservación (POST /reservaciones, GET /reservaciones/{folio}, las listas y la
agenda): liga pública a un PNG con el QR del folio. Se le puede mandar al cliente por WhatsApp; lo muestra en la
puerta y la hostess lo escanea. Con ?descargar=1 el navegador lo guarda como archivo.GET /restaurantes/{id}/reservaciones?fecha=2026-09-25 devuelve toda la noche del 25, incluida
su madrugada del 26, y ya no la madrugada del 25 (que es de la noche del 24). fecha y hora de cada reservación
siguen siendo las del reloj; jornada dice a qué noche pertenece.POST /reservaciones/{folio}/respuesta-cliente: lo que contestó el cliente ("sí fui" / "no fui") al día siguiente.
Basta un "sí" del cliente o de la hostess para que cuente como asistencia.marcado_por: "sistema").sin_dueno en GET /disponibilidad: nadie ha reclamado la ficha de ese lugar; no se toma reservación ni
solicitud y la respuesta trae hasta 3 recomendados de la misma zona que sí reservan.nombre, apellido, telefono, correo, restaurante_id, jornada, origen,
evento (nueva | cambio), canal, pais, telefono_internacional y, al marcar asistencia, marcado_por.experiencias[] con título, resumen, precio_texto listo para leer ("$4,500 el paquete
(hasta 8 personas)"), personas_texto, días (cada_semana), hora_desde/hora_hasta, proximas_fechas (14 días) y
cupo_por_dia. El precio es solo informativo: se paga en el lugar, no se cobra en línea.experiencias que aplican esa noche (la 01:00 del sábado cuenta como el viernes).experiencia_id opcional en POST /reservaciones. Se revisa que aplique esa noche, a esa
hora, para esas personas y que quede cupo; si no, 422 experiencia_no_aplica con mensaje para leer al cliente y
motivo (dia, hora, personas, sin_cupo, no_disponible), y no se crea nada. Si aplica, la respuesta trae
experiencia (id, titulo, total_estimado, se_paga_en_el_lugar) y la nota del restaurante empieza con
"Experiencia: …". modo_prueba revisa lo mismo sin ocupar cupo.ocasion_id al crear y al modificar (GET /ocasiones: 1 Reserva Casual, 2 Cumpleaños,
3 Aniversario, 4 Negocios, 5 Cita, 6 Salida con amigos, 7 Despedida, 8 Otra). El texto ocasion de siempre sigue
funcionando y además se traduce al catálogo. La reservación trae ocasion ({id, nombre}) y festejado, guardados
aparte de la nota; la nota sigue igual. Una ocasión que no existe → 422 en campos.ocasion_id.POST /reservaciones responde
promociones_aplicables con las de cumpleaños del lugar que aplican ese día, para ofrecerlas. Solo informativo.promociones[] de la ficha ahora son las que el lugar publica en "Mi sitio" (las mismas de su
micrositio), con los campos nuevos tipo (dias | cumpleanos), dias y condiciones, y vigencia.tipo puede
ser cumpleanos. Antes salían de las "experiencias" de resbok, que solo tenían datos de prueba: un lugar que no
publica promociones en Mi sitio ahora trae la lista vacía. Los campos de precio y descuento siguen, en null, y
prepago en false.eventos (próximos 14 días, máximo 10) y GET /disponibilidad trae los eventos de
esa noche, para decir "este viernes hay DJ".telefono_2 + pais_2 al crear (POST /reservaciones) y al modificar
(PATCH /reservaciones/{folio}), con la misma regla que telefono + pais. Al modificar se puede mandar solo, y
vacío o null lo borra. Inválido → 422 en campos.telefono_2 ("El segundo teléfono no es válido para el país
indicado."); país que no existe → campos.pais_2. Con horario nuevo sin lugar no se cambia nada.cliente.telefono_2, cliente.pais_2 y cliente.telefono_2_internacional, null si no hay.fecha_nacimiento (ya existía) se guarda en la ficha del cliente del restaurante; ahora además no puede ser
futura ni anterior a 1900 → 422 en campos.fecha_nacimiento.festejado opcional (máx. 128): de quién es el festejo si no es de quien reserva. Va a la nota que ve el
restaurante como "Cumpleaños de: Luis" (o "Festejado: Luis" si la ocasion no es un cumpleaños). nombre_festejado
sigue funcionando igual. Antes la nota decía "Festejado: Luis" también en cumpleaños. No se devuelve como campo:
queda en nota, que el restaurante puede editar.telefono de 10 dígitos sin pais es de México, con los mismos mensajes de error.pais opcional (ISO de 2 letras: MX, US, ES…) al crear, consultar, modificar y cancelar, y en
GET /reservaciones, GET /reservaciones/{folio} y GET /agenda/reservaciones. También se acepta el teléfono con
su lada ("+1 212 555 1234", "+34 612 345 678"); la lada escrita manda sobre pais.422 con "El teléfono no es válido para el país indicado."; país que no existe → 422 en campos.pais.pais, consúltenla con el mismo pais (o con la lada).cliente.pais y cliente.telefono_internacional ("+525512345678", listo para marcar), junto a
cliente.telefono, que sigue siendo el número nacional. En la agenda son null si el número guardado por otro
canal no se reconoce.GET /disponibilidad acepta jornada=AAAA-MM-DD en lugar de fecha: es la noche a la que pertenece la hora,
como la dice el cliente. jornada=2026-09-18&hora=02:00 ("el viernes a las 2 de la mañana") consulta el sábado 19
a las 02:00 y responde con la fecha real. Las dos juntas, o ninguna, responden 422 parametros_invalidos.
El bloque jornada de la respuesta ahora habla de la noche a la que pertenece la hora consultada, con el
horario de esa noche. Antes tomaba el día del calendario: preguntando por el sábado a las 02:00 decía "El sábado…",
que confundía a quien había preguntado por el viernes. Si ya leen ese texto, ahora dice lo que esperaban.
Aclaración (no cambia el comportamiento): la hora de cierre del turno se puede reservar. En un turno de 23:00 a 01:00, la 01:00 es válida; la primera que ya no entra es la 01:15.
Motivo cerrado_por_el_lugar en GET /disponibilidad: el restaurante cerró sus reservaciones de ese día
(evento, reservas solo en el local o cerrado). No trae alternativas y no debe ofrecerse como "lleno".
disponibilidad: campo nuevo jornada (fecha, dia, ventanas, texto), con el horario dicho como lo entiende
el cliente y listo para leerse por teléfono: "El viernes 18 de septiembre recibe reservaciones de 22:00 a 01:00.
La 01:00 es de la madrugada del sábado y cuenta como la noche del viernes." Es del día que se consultó, y null
cuando no hay horario que decir (ese día no abre, o el motivo no es cerrado).horario_del_dia trae termina_al_dia_siguiente.jornada (fecha, dia, es_madrugada, texto) con la noche a la que pertenece la mesa.
fecha y hora siguen siendo las del calendario real; jornada.fecha es el día del turno, el mismo con que la
reservación queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior.no_acepta_api y ya no
devuelven horario, en vez de anunciar un rango que después rechazaban a cualquier hora.contacto.pagina_masmesa (página del lugar en www.masmesa.com) y fotos.menu (fotos o ligas de la carta, las mismas del micrositio).contacto.micrositio ya no trae dominios que el restaurante dejó de usar (cuando su sitio web capturado apunta a otra parte).GET /disponibilidad: parámetro opcional area_id; campos nuevos area_id, areas_con_lugar y ocupacion.POST /reservaciones y PATCH /reservaciones/{folio}: campo opcional area_id. Un área que no es del restaurante → 422 area_invalida.area (área de la mesa asignada).contacto, fotos, servicios, calificacion, areas, aforo.disponibilidad: campo nuevo horario_del_dia (vacío salvo motivo = cerrado). El mensaje de cerrado ahora
agrega el horario del día; si su código compara el texto exacto, cámbienlo por motivo.promociones[]: campos nuevos vigente_desde y vigente_hasta.direccion.colonia ahora es la colonia como la dice la gente (Polanco, Condesa). Antes traía la alcaldía, que ahora
viene en direccion.alcaldia. Puede venir null si resbok todavía no la captura para un lugar nuevo.colonia busca en la colonia y en la alcaldía.politicas.tolerancia ya no viene null cuando la tolerancia es "Ilimitado": trae el texto para leerlo.nombres_alternos, turnos, direccion.alcaldia y en reglas: tolerancia_ilimitada,
mesas_maximo, personas_de_pie_maximo, intervalo_minutos (todo el formulario de configuración del dashboard).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": "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 Example: q=compa Nombre del lugar o uno de sus |
| ciudad | string Example: ciudad=Metepec Ciudad o alcaldía. |
| estado | string Example: estado=Ciudad de México Estado. |
| colonia | string Example: colonia=Polanco Colonia (Polanco, Condesa) o alcaldía (Miguel Hidalgo, Cuauhtémoc). |
| tipo | string Example: tipo=Vida nocturna Tipo de lugar (Restaurante, Vida nocturna, Club de playa, Eventos). |
| cocina | string Example: cocina=Mexicana Tipo de cocina (Mexicana, Bar, Discoteca…). |
{- "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 Example: 3 Id del restaurante en resbok. |
{- "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"
}(1.13) 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": 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 (versión 1.10): 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 (versión 1.7): 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 Example: restaurante_id=88 |
| fecha | string <date> Example: fecha=2026-09-18 AAAA-MM-DD del calendario, en la zona horaria del restaurante. Obligatoria salvo que se mande |
| jornada | string <date> Example: jornada=2026-09-18 AAAA-MM-DD de la noche a la que pertenece la hora (versión 1.10), para preguntar como habla el cliente:
|
| hora required | string^([01]\d|2[0-3]):(00|15|30|45)$ Example: hora=23:00 HH:MM en 24 h, en cuartos de hora. |
| personas required | integer [ 1 .. 500 ] Example: personas=2 |
| area_id | integer >= 1 Example: area_id=5 Opcional: |
{- "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 ] |
| area_id | integer or null >= 1 Opcional: |
| nombre required | string <= 128 characters |
| apellido required | string <= 128 characters |
| telefono required | string Sin |
| pais | string or null^[A-Za-z]{2}$ Opcional (1.11): 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 (1.12): segundo teléfono, misma regla que |
| pais_2 | string or null^[A-Za-z]{2}$ Opcional (1.12): 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. Desde la 1.12 no puede ser futura ni anterior a 1900. |
| ocasion | string or null Texto libre; se agrega a la nota que ve el restaurante. Desde la 1.13 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 (1.13) Ocasión del catálogo ( |
| experiencia_id | integer or null >= 1 (1.14) Experiencia de |
| festejado | string or null <= 128 characters Opcional (1.12): 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). Desde la 1.13 también se guarda aparte y se devuelve en |
| nombre_festejado | string or null Igual que |
| peticion_especial | string or null <= 200 characters |
| 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. |
| si_no_hay_lugar | string Default: "rechazar" Enum: "rechazar" "pendiente" Si está lleno o cerrado, |
| modo_prueba | boolean Default: false Valida todo y responde como si reservara, pero no guarda nada ni avisa. |
{- "restaurante_id": 88,
- "fecha": "2026-09-18",
- "hora": "22:30",
- "personas": 2,
- "area_id": 181,
- "nombre": "Prueba",
- "apellido": "CallMarket",
- "telefono": "55 0000 0001",
- "correo": "prueba.callmarket@masmesa.test",
- "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": "CallMarket",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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 Example: 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}$ Example: pais=US Opcional (1.11): 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": 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": "CallMarket",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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": "CallMarket",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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}$ Example: 482913 |
| telefono required | string Example: 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}$ Example: pais=US Opcional (1.11): 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": "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": "CallMarket",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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, versión 1.7): 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}$ Example: 204065 |
| telefono required | string El de la reservación (10 dígitos de México; acepta espacios y lada +52). Otro país, con |
| pais | string^[A-Za-z]{2}$ Opcional (1.11): país del teléfono (ISO de 2 letras), el mismo con que se creó. Sin él, México. |
| origen required | string Enum: "bot" "agente" Quién hace el cambio; queda en la bitácora. |
| 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 (1.12) Segundo teléfono nuevo (con |
| pais_2 | string or null^[A-Za-z]{2}$ (1.12) País del segundo teléfono (ISO de 2 letras). Sin él, México. |
| ocasion_id | integer or null >= 1 (1.13) Nueva ocasión del catálogo ( |
| ocasion | string or null (1.13) Igual que |
| festejado | string or null <= 128 characters (1.13) Nuevo festejado; vacío o null lo borra. |
{- "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": "CallMarket",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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}$ Example: 204065 |
| telefono required | string Example: telefono=55 0000 0003 El de la reservación (10 dígitos; acepta espacios y lada +52). |
| pais | string^[A-Za-z]{2}$ Example: pais=US Opcional (1.11): país del teléfono, ISO de 2 letras (MX, US, ES…). Sin él, México. También se puede escribir la lada en |
| origen required | string Enum: "bot" "agente" |
| motivo | string <= 200 characters Example: motivo=Cambio de planes Máximo 200 caracteres; queda en la bitácora. |
{- "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": "CallMarket",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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}$ Example: 482913 |
| asistio required | boolean true = sí fui, false = no fui |
| respondido_en | string Hora de la respuesta del cliente, |
{- "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 un día (hostess, portal, web, teléfono, Google, CallMarket…), no solo las creadas por este token. La madrugada aparece en su día real. 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 Example: 88 Id del restaurante en resbok. |
| fecha required | string <date> Example: fecha=2026-09-18 Día real (AAAA-MM-DD) en la zona horaria del restaurante. |
| pagina | integer >= 1 Default: 1 |
| por_pagina | integer [ 1 .. 100 ] Default: 50 |
{- "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": "CallMarket",
- "telefono": "5500000001",
- "pais": "MX",
- "telefono_internacional": "+525500000001",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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": "CallMarket",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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 Example: 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}$ Example: pais=US Opcional (1.11): 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": 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": "CallMarket",
- "telefono": "5500000003",
- "pais": "MX",
- "telefono_internacional": "+525500000003",
- "telefono_2": null,
- "pais_2": null,
- "telefono_2_internacional": null,
- "correo": "prueba.callmarket@masmesa.test"
}, - "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 Example: 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"
}