Comprobar reservas dobles y conflictos en salas de reuniones
Una planificación de 09:00 a 10:30 y unas entrevistas de 10:00 a 11:00 chocan entre las 10:00 y las 10:30, mientras que una revisión que empieza a las 11:00 no da problema. Se listan todos los pares solapados, no solo el primero. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Una sala de reuniones compartida puede parecer disponible aunque dos reservas ocupen discretamente el mismo tramo del día. Esta herramienta revisa una lista de reservas de una sola sala, valida cada intervalo y comunica todas las parejas que se superponen. Utiliza horas claras del mismo día en formato de 24 horas y considera que, al finalizar una reserva, ese instante queda disponible para la siguiente. El resultado es determinista y sirve para revisar agendas, validar importaciones o preparar un informe de conflictos antes de publicar un calendario.
Prepare las reservas de una sala
Envíe en la lista bookings las reservas correspondientes a una única sala. Limitar cada solicitud a una sala y un día permite interpretar el resultado sin ambigüedad: toda pareja comunicada representa una disputa real por el mismo espacio físico. Siempre que sea posible, utilice identificadores estables de su sistema de agenda, pues la respuesta señala los conflictos mediante esos identificadores y no mediante la posición de las filas.
La herramienta rechaza listas vacías, registros mal formados, identificadores repetidos, horas imposibles y entradas que superen el límite publicado. También rechaza una reserva cuyo final sea anterior al inicio, en lugar de suponer que continúa después de medianoche. Si el origen incluye fechas, zonas horarias o reservas nocturnas, divida o normalice esos datos antes de usar esta capacidad.
Así evitará que una hora local se interprete de manera diferente en un servidor, navegador u hoja de cálculo y obtendrá resultados idénticos en cada ejecución.
Entienda cuándo existe un conflicto
Las reservas se evalúan como intervalos semiabiertos: el inicio pertenece a la reserva, mientras que el instante exacto del final queda libre para la siguiente. Por ello, una reserva de 09:00 a 10:00 y otra de 10:00 a 11:00 son consecutivas y no entran en conflicto. Si la segunda comienza a las 09:59, la pareja sí aparece en el resultado.
Cada conflicto incluye los dos identificadores y el comienzo y final del periodo compartido. Una entrada de duración cero, con inicio igual al final, es válida, pero no ocupa tiempo ni puede superponerse con otra reserva. El algoritmo devuelve todas las parejas conflictivas, no solamente la primera ni una por reserva.
Esto resulta esencial cuando varias citas coinciden alrededor de la misma hora: tres reservas que se superponen mutuamente generan tres parejas y ofrecen al responsable el conjunto completo de relaciones que debe investigar. Los resultados se ordenan siempre por hora; como último criterio de desempate se conserva el orden original, de modo que las comparaciones automáticas y los registros de auditoría permanezcan estables.
Integre el informe en su proceso de agenda
El resultado principal indica cuántas reservas se revisaron, si existen conflictos y cuántas parejas conflictivas se encontraron. Cuando haya conflictos, utilice los límites de la superposición para explicar el tramo exacto disputado, en vez de mostrar una alerta imprecisa sobre una doble reserva. La capacidad no elige deliberadamente un ganador, no desplaza reuniones ni combina reservas contiguas; esas decisiones dependen de las prioridades de cada organización y deben permanecer en su flujo de agenda.
Ejecútela antes de publicar el calendario de una sala, tras importar reservas desde otro sistema o cuando una edición masiva cambie muchas horas.
Qué puede hacer con ella
Validar una importación de calendario
Revise las reservas importadas antes de que sustituyan o amplíen la agenda de su calendario principal.
Proteger una actualización masiva
Detecte los conflictos introducidos cuando una persona administradora modifica muchas horas de reunión en una sola operación.
Crear un informe de conflictos
Enumere las parejas exactas y los periodos compartidos que la coordinación de instalaciones debe resolver.
Preguntas frecuentes
¿Qué formato de hora debo utilizar?
Utilice horas en formato de 24 horas, HH:MM o HH:MM:SS, por ejemplo 09:30 o 14:05:20.
¿Entran en conflicto las reservas consecutivas?
No. Si una reserva termina justo cuando comienza otra, la sala se considera disponible para la segunda.
¿Qué ocurre si el final es anterior al inicio?
Debe normalizar o dividir los intervalos nocturnos antes de revisarlos.
¿La herramienta se detiene tras la primera superposición?
No. Comunica todas las parejas conflictivas, incluidas todas las combinaciones de un grupo de reservas simultáneas.
¿Puedo revisar varias salas en una solicitud?
No. Cada solicitud representa una sala. Agrupe las reservas por sala y revise cada grupo por separado.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/biz/meeting-room-double-booking-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"bookings":[{"booking_id":"planning","start":"09:00","end":"10:30"},{"booking_id":"interviews","start":"10:00","end":"11:00"},{"booking_id":"review","start":"11:00","end":"11:30"}]}'const res = await fetch("https://api.kit.forhosting.com/biz/meeting-room-double-booking-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"bookings": [
{
"booking_id": "planning",
"start": "09:00",
"end": "10:30"
},
{
"booking_id": "interviews",
"start": "10:00",
"end": "11:00"
},
{
"booking_id": "review",
"start": "11:00",
"end": "11:30"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/biz/meeting-room-double-booking-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"bookings": [
{
"booking_id": "planning",
"start": "09:00",
"end": "10:30"
},
{
"booking_id": "interviews",
"start": "10:00",
"end": "11:00"
},
{
"booking_id": "review",
"start": "11:00",
"end": "11:30"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/biz/meeting-room-double-booking-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"bookings":[{"booking_id":"planning","start":"09:00","end":"10:30"},{"booking_id":"interviews","start":"10:00","end":"11:00"},{"booking_id":"review","start":"11:00","end":"11:30"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"bookings":[{"booking_id":"planning","start":"09:00","end":"10:30"},{"booking_id":"interviews","start":"10:00","end":"11:00"},{"booking_id":"review","start":"11:00","end":"11:30"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/biz/meeting-room-double-booking-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"bookings": [
{
"booking_id": "planning",
"start": "09:00",
"end": "10:30"
},
{
"booking_id": "interviews",
"start": "10:00",
"end": "11:00"
},
{
"booking_id": "review",
"start": "11:00",
"end": "11:30"
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "biz.meeting_room_double_booking_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_items | 1000 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Prepare las reservas de una sala
Cada fila necesita un booking_id exclusivo y valores start y end expresados en formato de 24 horas, ya sea HH:MM o HH:MM:SS.
Integre el informe en su proceso de agenda
La lista conflicting_pairs puede alimentar un panel de avisos, un mensaje de rechazo de importación o un informe dirigido a quienes gestionan las reservas. Un resultado limpio presenta has_conflicts como false y una lista vacía, algo práctico para una regla sencilla de continuar o detener el proceso. Funciona sin red, almacenamiento, aleatoriedad ni fecha actual, y cada solicitud API usa el precio $0.002, por lo que una misma entrada sirve para pruebas repetibles y validación de producción.
Preguntas técnicas
¿Cuánto cuesta una solicitud API?
Cada solicitud API cuesta $0.002. La versión para navegador utiliza la misma lógica de comprobación determinista.