API de resbok (1.17)

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.

Dirección

https://api.resbok.com/v1 — es la única dirección de la API. Esta página se abre ahí mismo, sin token.

Qué se puede hacer

  • Catálogo: todos los lugares activos con su ficha completa (dirección, horarios, reglas, áreas, promociones, eventos y experiencias).
  • Disponibilidad: si hay lugar para un día, hora y número de personas, con alternativas y el motivo cuando no hay.
  • Reservaciones: crear con folio, consultar, modificar y cancelar; registrar si el cliente asistió.
  • Nivel alto: leer todas las reservaciones de un lugar, de cualquier canal (solo lectura).
  • Avisos (webhooks): resbok le avisa a su sistema cuando una reservación nace o cambia de estado.

Acceso

  • Token fijo por cliente en la cabecera Authorization: Bearer <token> (también se acepta X-API-Key: <token>).
  • Solo HTTPS.
  • Límite de peticiones por minuto por token; al pasarlo responde 429. Muchos tokens inválidos desde la misma IP también dan 429 (un token válido siempre pasa).
  • Cada token tiene permisos (ver catálogo, ver disponibilidad, crear, consultar, modificar, cancelar, ver todas las reservas). Sin el permiso de una operación responde 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.

Formato

  • JSON en UTF-8.
  • Fechas AAAA-MM-DD y horas HH:MM en 24 h, en la zona horaria del restaurante (zona_horaria).
  • Las horas de reservación van en cuartos de hora (:00, :15, :30, :45).

Errores

Todos los errores responden {"error": "<código>", "mensaje": "<texto>"}. El mensaje está escrito para leerse tal cual al cliente.

Reglas que aplica la API

  • Catálogo siempre al día: aparecen todos los restaurantes activos en resbok, los mismos del portal. Uno nuevo aparece solo; uno dado de baja deja de aparecer y su ficha responde 404. Sincronicen GET /restaurantes periódicamente (por ejemplo cada hora) y usen actualizado_en para saber qué cambió.
  • Buscar por teléfono (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.
  • Mínimo y máximo de personas, anticipación mínima y porcentaje de asistencia salen de la configuración de cada restaurante en resbok; si el restaurante la cambia, la API lo refleja de inmediato.

Probar conexión y token

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.

Authorizations:
bearerAuthapiKey

Respuestas

Response Schema: application/json
estado
required
string
Value: "ok"
hora_servidor
required
string

Hora del servidor (AAAA-MM-DD HH:MM:SS), el mismo reloj de actualizado_en.

Ejemplos de respuesta

Content type
application/json
{
  • "estado": "ok",
  • "hora_servidor": "2026-09-14 16:35:50"
}

Lista de restaurantes con su ficha completa

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.

Authorizations:
bearerAuthapiKey
query Parameters
q
string
Ejemplo: q=compa

Nombre del lugar o uno de sus nombres_alternos ("el chateau", "santana condesa").

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…).

Respuestas

Response Schema: application/json
total
required
integer >= 0
required
Lista de objects (FichaRestaurante)

Ejemplos de respuesta

Content type
application/json
{
  • "restaurantes": [
    ],
  • "total": 1
}

Ficha técnica de un restaurante

Misma ficha que en la lista, para un solo restaurante.

Authorizations:
bearerAuthapiKey
path Parameters
id
required
integer >= 1
Ejemplo: 3

Id del restaurante en resbok.

Respuestas

Response Schema: application/json
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 q también los usa. Puede venir vacío.

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 (turnos).

required
Lista de objects (Turno)

Turnos de reservación por día: las únicas horas que se pueden reservar. Ofrezcan horas entre desde y hasta (ambas incluidas) cada cada_minutos. Vacío = no hay turnos (no reserva en línea).

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 experiencia_id y se pagan en el lugar.

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 id es el area_id que aceptan disponibilidad, reservar y modificar. null si no se pudieron leer (ver servicios).

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.

Ejemplos de respuesta

Content type
application/json
Example
{
  • "activo": true,
  • "actualizado_en": "2026-09-14 16:23:27",
  • "aforo": {
    },
  • "areas": [
    ],
  • "calificacion": {
    },
  • "cocina": [
    ],
  • "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": {
    },
  • "horarios": [ ],
  • "id": 3,
  • "nombre": "Churrascaría",
  • "nombres_alternos": [
    ],
  • "politicas": {
    },
  • "promociones": [
    ],
  • "eventos": [
    ],
  • "experiencias": [ ],
  • "rango_precio": {
    },
  • "reglas": {
    },
  • "servicios": {
    },
  • "sitio_web": "https://churrascaria.mx/",
  • "telefono": "55 5678 2854",
  • "tipo": [
    ],
  • "turnos": [
    ],
  • "zona_horaria": "America/Mexico_City"
}

Catálogo de ocasiones

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.

Authorizations:
bearerAuthapiKey

Respuestas

Response Schema: application/json
total
required
integer >= 0
required
Lista de objects

Ejemplos de respuesta

Content type
application/json
{
  • "total": 8,
  • "ocasiones": [
    ]
}

Disponibilidad

Si hay lugar en un día, hora y número de personas, con alternativas.

¿Hay lugar?

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").

Authorizations:
bearerAuthapiKey
query Parameters
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; las dos juntas responden 422 parametros_invalidos.

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: jornada=2026-09-18&hora=02:00 es "el viernes a las 2 de la mañana" y la API consulta el sábado 19 a las 02:00. Para una hora que no es de madrugada (más de las 05:45) es lo mismo que fecha.

area_id
integer >= 1
Ejemplo: area_id=5

Opcional: id de areas[] de la ficha (terraza, salón…). Sin él, cualquier área.

Respuestas

Response Schema: application/json
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ó (area_id de la consulta); null si se preguntó por cualquier área.

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).

  • cerrado: no hay turno a esa hora o ese día. El mensaje dice el horario de reservaciones de ese día ("Ese día recibe reservaciones de 22:00 a 00:30.") o, si ese día no abre, cuál es el siguiente día que abre; horario_del_dia trae los turnos. Trae alternativas del mismo día o, si no abre, del siguiente día con reservaciones.
  • lleno: hay turno pero no mesa para ese grupo. Trae alternativas si las hay.
  • solo_lista_espera: a esa hora solo hay lista de espera.
  • fuera_de_anticipacion: la hora ya pasó o no cumple la anticipación mínima. Alternativas desde lo más pronto posible.
  • excede_maximo / debajo_minimo: el grupo no cabe en las reglas del lugar.
  • no_acepta_api: el lugar no reserva en línea; registrar solicitud pendiente.
  • cerrado_por_el_lugar: el restaurante cerró sus reservaciones de ese día (evento, reservas solo en el local, o cerrado). El mensaje lo dice y, si el cierre dura varios días, hasta cuándo. Sin alternativas; no ofrecerlo como "lleno".
  • sin_dueno nadie ha reclamado la ficha de ese lugar. NO se toma reservación ni solicitud: decir el mensaje y ofrecer los recomendados (lugares de la misma zona que sí reservan; se puede reservar en ellos con esta misma API). La llamada queda contada como demanda de ese 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 motivo = cerrado: turnos de reservación de ese día (desde/hasta; hasta puede ser del día siguiente, 22:00 a 02:00). Vacío si ese día no recibe reservaciones (el mensaje dice cuál es el siguiente día que abre) o si el motivo es otro.

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. texto viene listo para leerlo por teléfono. null cuando no hay horario que decir (ese día no abre, o el motivo no es cerrado).

required
Lista de objects or null (AreaConLugar)

Áreas (de las areas de la ficha) con lugar para ese grupo a esa hora, para ofrecer "¿terraza o salón?". Viene cuando el motivo es lleno o solo_lista_espera (qué áreas sí tienen) y cuando se pidió un area_id (haya o no lugar en ella). Vacío = ninguna área tiene lugar a esa hora. null cuando hay lugar y no se pidió área (para comparar áreas, consulten con area_id), si no aplica (cerrado o fuera de las reglas) o si no alcanzó el tiempo para revisarlas todas.

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 experiencia_id.

Lista de objects or null

Solo con motivo: sin_dueno hasta 3 lugares de la misma ciudad (misma colonia primero) con dueño que hoy reservan en línea, para ofrecerlos por teléfono. null en cualquier otro motivo.

Ejemplos de respuesta

Content type
application/json
Example
{
  • "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": {
    },
  • "eventos": [
    ],
  • "experiencias": [ ]
}

Reservaciones

Crear, consultar, modificar y cancelar las reservaciones creadas por el mismo token.

Crear reservación

Revisa la disponibilidad con las mismas reglas que GET /disponibilidad y:

  • hay lugar → 201 confirmada, con mesa asignada;
  • el lugar no reserva en línea → 201 pendiente de confirmación;
  • lleno o cerrado → 409 sin_lugar con alternativas, o 201 pendiente si se envía si_no_hay_lugar: pendiente;
  • grupo fuera de rango u hora sin anticipación → siempre 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.

Authorizations:
bearerAuthapiKey
Request Body schema: application/json
required
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 pais: 10 dígitos de México, como siempre (acepta espacios, guiones, paréntesis y lada +52). De cualquier país: con pais ("212 555 1234" y pais: "US") o con su lada ("+34 612 345 678"; la lada escrita manda sobre pais). Se guarda el número nacional, sin lada.

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: id de areas[] de la ficha. La mesa se busca solo en esa área; sin él, en cualquiera (como el portal).

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 → 422 en campos.pais.

telefono_2
string or null

Opcional segundo teléfono, misma regla que telefono (con pais_2 o su lada). Vacío o null = sin segundo teléfono. Inválido → 422 en campos.telefono_2.

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.

ocasion_id
integer or null >= 1

Ocasión del catálogo (GET /ocasiones): 2 Cumpleaños, 3 Aniversario… Manda sobre el texto ocasion. Con Cumpleaños la respuesta trae promociones_aplicables. Una que no existe → 422 en campos.ocasion_id.

experiencia_id
integer or null >= 1

Experiencia de experiencias[] de la ficha. Debe aplicar esa noche, a esa hora, para esas personas y con cupo; si no, 422 experiencia_no_aplica con motivo y nada se crea. Se paga en el lugar.

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 festejado.

nombre_festejado
string or null

Igual que festejado (nombre anterior del campo; sigue funcionando). Si llegan los dos, manda festejado.

peticion_especial
string or null <= 200 characters
si_no_hay_lugar
string
Predeterminado: "rechazar"
Enum: "rechazar" "pendiente"

Si está lleno o cerrado, pendiente registra la solicitud para que el restaurante la confirme.

modo_prueba
boolean
Predeterminado: false

Valida todo y responde como si reservara, pero no guarda nada ni avisa.

Respuestas

Response Schema: application/json
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"
  • confirmada: tiene lugar.
  • pendiente_confirmacion: registrada sin mesa; el restaurante la confirmará.
  • cancelada, asistio, no_asistio: según lo que haga el restaurante (al consultar).
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. fecha y hora de la reservación son las del calendario real; jornada.fecha es el día del turno, que es como queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior: la 01:00 del sábado es del viernes.

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 ?descargar=1 se guarda como archivo.

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.

Response Schema: application/json
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"
  • confirmada: tiene lugar.
  • pendiente_confirmacion: registrada sin mesa; el restaurante la confirmará.
  • cancelada, asistio, no_asistio: según lo que haga el restaurante (al consultar).
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. fecha y hora de la reservación son las del calendario real; jornada.fecha es el día del turno, que es como queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior: la 01:00 del sábado es del viernes.

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 ?descargar=1 se guarda como archivo.

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.

Ejemplos de petición

Content type
application/json
Example
{
  • "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
}

Ejemplos de respuesta

Content type
application/json
{
  • "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": {
    },
  • "area": {
    },
  • "cliente": {
    },
  • "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 vigentes de un teléfono

Reservaciones de hoy en adelante creadas por este mismo token para ese teléfono. Requiere el permiso reservas.leer_propias.

Authorizations:
bearerAuthapiKey
query Parameters
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 o con su lada .

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 telefono ("+1 212 555 1234").

Respuestas

Response Schema: application/json
total
required
integer >= 0
required
Lista de objects (Reservacion)

Ejemplos de respuesta

Content type
application/json
{
  • "total": 2,
  • "reservaciones": [
    ]
}

Consultar una reservación por folio

"¿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.

Authorizations:
bearerAuthapiKey
path Parameters
folio
required
string^[1-9]\d{5}$
Ejemplo: 482913
query Parameters
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 o con su lada .

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 telefono ("+1 212 555 1234").

Respuestas

Response Schema: application/json
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"
  • confirmada: tiene lugar.
  • pendiente_confirmacion: registrada sin mesa; el restaurante la confirmará.
  • cancelada, asistio, no_asistio: según lo que haga el restaurante (al consultar).
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. fecha y hora de la reservación son las del calendario real; jornada.fecha es el día del turno, que es como queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior: la 01:00 del sábado es del viernes.

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 ?descargar=1 se guarda como archivo.

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.

Ejemplos de respuesta

Content type
application/json
Example
{
  • "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": {
    },
  • "area": {
    },
  • "cliente": {
    },
  • "ocasion": null,
  • "festejado": null,
  • "nota": "Ocasión: Aniversario · Mesa cerca del piano",
  • "origen": "agente",
  • "id_externo": "ejemplo-docs-confirmada",
  • "repetida": false,
  • "modo_prueba": false
}

Modificar fecha, hora, personas o área

Servicio a clientes: "¿puedo cambiar mi reserva?". Folio + teléfono, como en la consulta. También se acepta PUT.

  • Confirmada: solo cambia si hay lugar en el nuevo horario (su propia mesa no estorba). Si no hay, responde 409 sin_lugar con alternativas y conserva su horario actual.
  • Pendiente de confirmación: cambia de horario y sigue pendiente; el restaurante la confirmará.
  • Siempre aplican las reglas del restaurante (máximo y mínimo de personas, anticipación).
  • Área (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.
  • No se puede cambiar si está cancelada, ya se usó o su hora ya pasó → 409 no_modificable.
  • Mandar el mismo horario que ya tiene responde 200 con repetida: true y no cambia nada.

Requiere el permiso reservas.modificar.

Authorizations:
bearerAuthapiKey
path Parameters
folio
required
string^[1-9]\d{5}$
Ejemplo: 204065
Request Body schema: application/json
required
telefono
required
string

El de la reservación (10 dígitos de México; acepta espacios y lada +52). Otro país, con pais o su lada .

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

id de areas[] de la ficha: busca mesa solo en esa área.

telefono_2
string or null

Segundo teléfono nuevo (con pais_2 o su lada). Vacío o null lo borra. Se puede mandar solo.

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 (GET /ocasiones). Una que no existe → 422 en campos.ocasion_id.

ocasion
string or null

Igual que ocasion_id, dicha con texto (se traduce al catálogo).

festejado
string or null <= 128 characters

Nuevo festejado; vacío o null lo borra.

Respuestas

Response Schema: application/json
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"
  • confirmada: tiene lugar.
  • pendiente_confirmacion: registrada sin mesa; el restaurante la confirmará.
  • cancelada, asistio, no_asistio: según lo que haga el restaurante (al consultar).
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. fecha y hora de la reservación son las del calendario real; jornada.fecha es el día del turno, que es como queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior: la 01:00 del sábado es del viernes.

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 ?descargar=1 se guarda como archivo.

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.

Ejemplos de petición

Content type
application/json
Example
{
  • "telefono": "55 0000 0003",
  • "origen": "agente",
  • "hora": "22:30",
  • "personas": 3
}

Ejemplos de respuesta

Content type
application/json
Example
{
  • "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": {
    },
  • "area": {
    },
  • "cliente": {
    },
  • "ocasion": null,
  • "festejado": null,
  • "nota": null,
  • "origen": "bot",
  • "id_externo": "ejemplo-docs-cambios-111238",
  • "repetida": false,
  • "modo_prueba": false
}

Cancelar

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.

Authorizations:
bearerAuthapiKey
path Parameters
folio
required
string^[1-9]\d{5}$
Ejemplo: 204065
query Parameters
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 telefono ("+1 212 555 1234").

motivo
string <= 200 characters
Ejemplo: motivo=Cambio de planes

Máximo 200 caracteres; queda en la bitácora.

Respuestas

Response Schema: application/json
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"
  • confirmada: tiene lugar.
  • pendiente_confirmacion: registrada sin mesa; el restaurante la confirmará.
  • cancelada, asistio, no_asistio: según lo que haga el restaurante (al consultar).
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. fecha y hora de la reservación son las del calendario real; jornada.fecha es el día del turno, que es como queda en el libro del restaurante. La madrugada (hasta las 05:45) pertenece a la noche anterior: la 01:00 del sábado es del viernes.

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 ?descargar=1 se guarda como archivo.

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.

Ejemplos de respuesta

Content type
application/json
Example
{
  • "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": {
    },
  • "area": {
    },
  • "cliente": {
    },
  • "ocasion": null,
  • "festejado": null,
  • "nota": null,
  • "origen": "bot",
  • "id_externo": "ejemplo-docs-cambios-111238",
  • "repetida": false,
  • "modo_prueba": false
}

Registrar la respuesta del cliente sobre su asistencia

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.

Authorizations:
bearerAuthapiKey
path Parameters
folio
required
string^[1-9]\d{5}$
Ejemplo: 482913
Request Body schema: application/json
required
asistio
required
boolean

true = sí fui, false = no fui

respondido_en
string

Hora de la respuesta del cliente, Y-m-d H:i:s (opcional; si falta, ahora).

Respuestas

Response Schema: application/json
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

Ejemplos de petición

Content type
application/json
{
  • "asistio": true,
  • "respondido_en": "2026-09-19 10:32:00"
}

Ejemplos de respuesta

Content type
application/json
{
  • "folio": "482913",
  • "respuesta": "no_fui",
  • "resultado": "aplicada",
  • "estado": "no_llego",
  • "marcado_por": "cliente"
}

Nivel alto

Todas las reservaciones de resbok, de cualquier canal (solo lectura, permiso reservas.leer_todas).

Agenda de un restaurante por día

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.

Authorizations:
bearerAuthapiKey
path Parameters
id
required
integer >= 1
Ejemplo: 88

Id del restaurante en resbok.

query Parameters
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

Respuestas

Response Schema: application/json
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)

Ejemplos de respuesta

Content type
application/json
{
  • "total": 8,
  • "pagina": 1,
  • "por_pagina": 2,
  • "hay_mas": true,
  • "reservaciones": [
    ]
}

Rastrear reservaciones por teléfono

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.

Authorizations:
bearerAuthapiKey
query Parameters
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 o con su lada .

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 telefono ("+1 212 555 1234").

Respuestas

Response Schema: application/json
total
required
integer >= 0
required
Lista de objects (ReservacionAgenda) <= 50 items

Ejemplos de respuesta

Content type
application/json
{
  • "total": 1,
  • "reservaciones": [
    ]
}

Avisos (webhooks)

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.

Una reservación nació o cambió de estado Webhook

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.

header Parameters
X-Firma
required
string
Ejemplo: sha256=5d41402abc4b2a76b9719d911017c592ae2f1b6a4a1b0c0e7f1d3c5b7a9e0f12

sha256= seguido del HMAC-SHA256 (hexadecimal) del cuerpo exacto, con el secreto de la integración.

Request Body schema: application/json
required
folio
required
string

Folio de 6 dígitos de la reservación (el mismo de GET /reservaciones/{folio}).

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"

nueva: la reservación acaba de nacer. cambio: cambió de estado.

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 asistio / no_asistio. restaurante: lo marcó la hostess. cliente: lo decidió la respuesta del cliente en el seguimiento. sistema: resbok lo marcó sola porque nadie tocó la reservación en 48 h; un asistio del sistema no prueba que el cliente fue.

Respuestas

Ejemplos de petición

Content type
application/json
Example
{
  • "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": {
    },
  • "origen": "masmesa",
  • "evento": "nueva",
  • "canal": "portal",
  • "pais": "MX",
  • "telefono_internacional": "+525512345678"
}