> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Calendario y reservas

> Deja que los asistentes consulten disponibilidad y reserven citas en llamada con Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel o el motor integrado

Agendar citas es el caso de uso clásico de un agente de voz: el asistente consulta los huecos libres durante la llamada, ofrece un par de opciones y reserva la que elige quien llama. La plataforma admite esto de dos formas que puedes combinar libremente:

1. **Calendar integrations** — conecta un proveedor externo de programación (Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel) una sola vez, asígnalo a un asistente, y el asistente obtiene automáticamente herramientas de reserva en cada llamada. Google Calendar y Outlook se conectan en el mismo sitio, pero alimentan la sincronización de calendario del motor integrado en lugar de la reserva durante la llamada — consulta la nota debajo de la tabla.
2. **El motor de reservas integrado** — define tus propios tipos de evento con disponibilidad semanal y obtén una página de reserva pública e incrustable en `/book/{workspace}/{slug}`, correos de invitación ICS y una integración `native` contra la que tus asistentes pueden reservar. No se necesita ninguna cuenta externa. Consulta [Calendario integrado](/es/assistants/native-calendar) para ver el panorama completo.

## Proveedores de un vistazo

| Proveedor                    | Disponibilidad                                                                | Reserva                                                                                                       | Credenciales                                                                                                      |
| ---------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Cal.com**                  | ✓ huecos abiertos de un tipo de evento                                        | ✓ reserva directa                                                                                             | Clave de API (`cal_…`) + endpoint de API (US, EU o autoalojado), tipo de evento elegido de una lista sincronizada |
| **Calendly**                 | ✓ horarios disponibles de un tipo de evento seleccionado                      | ✓ reserva directa (planes de pago de Calendly), enlace de programación de un solo uso, cancelación confirmada | Conexión OAuth (una vez)                                                                                          |
| **Acuity Scheduling**        | ✓ huecos en vivo o disponibilidad de clases para un tipo de cita seleccionado | ✓ reserva directa, cancelación y reprogramación confirmadas (las series no se pueden reprogramar)             | Conexión OAuth (una vez)                                                                                          |
| **eTermin**                  | ✓ huecos en vivo para un servicio seleccionado + calendario/persona           | ✓ reserva directa                                                                                             | Public Key + Secret Key (Account Settings → API), servicio y calendario/persona elegidos de listas sincronizadas  |
| **HighLevel**                | ✓ huecos libres en vivo de un calendario seleccionado                         | ✓ reserva directa                                                                                             | Una conexión de HighLevel existente (desde Automations → Connections) + calendario                                |
| **Google Calendar**          | ✓ libre/ocupado de un calendario conectado, para el motor integrado           | ✓ creación de eventos con invitación a participantes, desde el motor integrado                                | Conexión OAuth (una vez)                                                                                          |
| **Outlook / Microsoft 365**  | ✓ libre/ocupado de un calendario conectado, para el motor integrado           | ✓ creación de eventos con invitación a participantes, desde el motor integrado                                | Conexión OAuth (una vez)                                                                                          |
| **Native (motor integrado)** | ✓ calculado a partir de la disponibilidad semanal de tu tipo de evento        | ✓ reserva directa + correo ICS                                                                                | ninguna — consulta [Calendario integrado](/es/assistants/native-calendar)                                         |

<Note>
  **Google Calendar y Outlook son destinos de sincronización, no proveedores de reserva durante la llamada.** Conectarlos pone sus horarios ocupados y la creación de eventos a disposición del [motor de reservas integrado](/es/assistants/native-calendar#el-motor-de-reservas-integrado); los asistentes todavía no pueden llamarlos directamente durante una conversación. Para reservar en esos calendarios durante la llamada, coloca delante un tipo de evento de Cal.com, Calendly, Acuity o HighLevel, o usa un tipo de evento integrado con la sincronización de calendario activada.
</Note>

<Note>
  **Modo de enlace de Calendly**: la API de programación de Calendly requiere un plan de pago de Calendly. Si tu plan no permite reservar directamente, configura el `booking_mode` de la integración en `link` — el asistente entonces acuerda una hora aproximada con quien llama y envía un **enlace de programación de un solo uso** por SMS o correo (`link_channel`) en lugar de reservar directamente. Las integraciones que topan con la restricción de plan de pago durante la llamada se marcan con el estado `link_mode`.
</Note>

## Conectar una integración

Ve a **Booking → Integrations** y elige la tarjeta de un proveedor:

<Tabs>
  <Tab title="Cal.com">
    Pega tu clave de API (Cal.com → Settings → Developer → API Keys) y elige el **API endpoint**: US (por defecto), EU, o Custom para una instancia de Cal.com autoalojada. Selecciona **Load event types** para obtener tus eventos por nombre y duración — no hace falta copiar un ID numérico desde la URL. La integración también lee automáticamente las preguntas de reserva personalizadas del tipo de evento; usa **Refresh fields** si las cambias más adelante en Cal.com. Zona horaria personalizable de forma opcional — asegúrate de que coincida con la del tipo de evento en Cal.com.
  </Tab>

  <Tab title="Calendly">
    Haz clic en **Connect with Calendly**, aprueba el acceso y luego elige un tipo de evento activo por **nombre y duración**. Una misma conexión de cuenta puede reutilizarse en varias integraciones. Si el tipo de evento tiene más de una ubicación configurada en Calendly, elige la que debe usar el asistente en **Meeting location**. Elige el modo de reserva, el canal del enlace y los permisos Book/Cancel.
  </Tab>

  <Tab title="Acuity Scheduling">
    Haz clic en **Connect with Acuity**, aprueba el acceso y luego elige un tipo de cita. Opcionalmente, selecciona un calendario o una persona específicos, o deja que el servicio elija cualquier calendario disponible. Activa o desactiva Book, Cancel y Reschedule para cada integración.
  </Tab>

  <Tab title="eTermin">
    Pega tu **Public Key** y tu **Secret Key** (eTermin → Account Settings → API), y luego selecciona **Load services** para obtener tus servicios por nombre y duración. Elegir un servicio carga solo los calendarios/personas que eTermin ofrece para él — elige uno y ajusta la duración si debe diferir de la duración predeterminada del servicio. Una vez guardada la integración, aparece una **Web Push URL**: pégala en los ajustes **API → API & Web Push** de eTermin (activa **Send Web Push**, prefiere el formato JSON) para que eTermin notifique a la plataforma cada vez que se crea, modifica o cancela una cita en su lado. El editor muestra entonces cuándo llegó el último evento — la forma más rápida de confirmar que la conexión está activa. Opcionalmente se puede definir un secreto compartido en ambos lados, que se verifica mediante la cabecera `X-Webhook-Secret`.
  </Tab>

  <Tab title="HighLevel">
    Primero conecta una cuenta de HighLevel en **Automations → Connections** si aún no lo has hecho. De vuelta en **Booking → Integrations**, elige **Connect HighLevel**, selecciona esa conexión y luego elige uno de sus calendarios activos. Los interruptores Book, Cancel y Reschedule se guardan por integración, pero por ahora los asistentes solo obtienen disponibilidad y reserva para HighLevel — todavía no existe una herramienta de cancelación o reprogramación para HighLevel.
  </Tab>

  <Tab title="Google / Outlook">
    Haz clic en **Connect** y completa el consentimiento OAuth. La conexión puede reutilizarse en varios tipos de evento del espacio de trabajo.
  </Tab>

  <Tab title="Native">
    Elige uno de tus [tipos de evento de reserva](/es/assistants/native-calendar#el-motor-de-reservas-integrado).
  </Tab>
</Tabs>

Toda integración se **verifica antes de guardarse**. Las credenciales o los ajustes de evento no válidos se rechazan con un error claro. Los valores secretos nunca vuelven a mostrarse después de guardarse.

Eliminar la última integración que usa una cuenta de Acuity revoca su token de OAuth mediante el endpoint de desconexión de Acuity y elimina la conexión local. Una cuenta sin uso también puede eliminarse con **Disconnect account** en el editor de Acuity; las cuentas compartidas no se pueden desconectar hasta que se eliminen sus integraciones restantes.

Las integraciones existentes con token de acceso personal siguen funcionando, pero aparecen como
**Legacy connection — reconnect with Calendly**. Reconectar las actualiza a
OAuth y elimina el PAT de la integración.

## Asignar a un asistente

Abre los ajustes del asistente y marca las integraciones que debe usar (o llama a `PUT /api/v1/assistants/{id}/integrations`). Cada integración asignada añade sus propias herramientas de reserva a cada llamada:

| Herramienta                                                    | Tipo                                                              | Qué hace                                                                                                                                                                                                                      |
| -------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `check_availability(start_date, end_date?)`                    | solo lectura, interrumpible                                       | Obtiene los huecos abiertos del rango de fechas y los lee en la zona horaria del asistente (con un límite, para que el agente nunca recite 200 huecos).                                                                       |
| `book_appointment(name, email, start, notes?)`                 | escritura — se ejecuta con una frase de relleno, no interrumpible | Reserva el hueco elegido. Si tiene éxito, la hora de inicio y el ID de la reserva se guardan como variables de llamada para flujos, análisis y webhooks. Si el hueco acaba de ocuparse, se indica al agente que ofrezca otro. |
| `send_booking_link(email?, phone?)`                            | solo en modo de enlace de Calendly                                | Crea un enlace de programación de un solo uso y lo envía por SMS o correo.                                                                                                                                                    |
| `find_appointment(email, name)`                                | gestión de Calendly/Acuity                                        | Busca citas próximas para el tipo de evento/cita seleccionado. Se requieren tanto el correo exacto de la reserva como el nombre completo.                                                                                     |
| `cancel_appointment(event_id / appointment_id, confirmed)`     | escritura — no interrumpible                                      | Cancela únicamente un evento o cita devuelto por `find_appointment` durante la misma llamada, después de que el asistente lo repita y reciba una confirmación explícita.                                                      |
| `reschedule_appointment(appointment_id, new_start, confirmed)` | gestión de Acuity                                                 | Mueve únicamente una cita de Acuity devuelta en la misma llamada, después de comprobar la disponibilidad y de que quien llama confirme explícitamente la nueva hora.                                                          |

Toda integración recibe `check_availability` y `book_appointment`. Las herramientas de gestión solo se añaden donde el proveedor las admite: **Calendly** (buscar y cancelar), **Acuity** (buscar, cancelar y reprogramar, según los interruptores que hayas definido), y el **motor integrado**, que añade un conjunto común a todo el espacio de trabajo que identifica a quien llama primero por número de teléfono y recurre al correo más el nombre completo como respaldo. Los calendarios de **Cal.com**, **eTermin** y **HighLevel** por ahora solo ofrecen disponibilidad y reserva — el asistente puede leer huecos y reservar en ellos, pero no buscar, cancelar ni mover una cita existente durante una llamada.

Si se asigna más de una integración, los nombres de las herramientas reciben el nombre de la integración como sufijo (por ejemplo, `check_availability_sales`). Los huecos siempre se dicen en la **[zona horaria](/es/assistants/timezone) del asistente** — configúrala en los ajustes del asistente.

<Note>
  Las reservas de Calendly no se pueden reprogramar mediante su API — quien llama y quiere otra hora recibe en su lugar un `cancel_appointment` y un `book_appointment` nuevos, o reprograma mediante el enlace de su correo de confirmación de Calendly.
</Note>

<Tip>
  Indica al asistente **cuándo** reservar en su prompt, por ejemplo: *"Antes de ofrecer cualquier hora, llama a check\_availability. En cuanto quien llama confirme un hueco, llama a book\_appointment con su nombre y correo."*
</Tip>

## Restricción por plan

Tu plan debe incluir **Calendar integrations**. Si no está incluido, no puedes crear integraciones.

## Solución de problemas

<AccordionGroup>
  <Accordion title="Cal.com: «Invalid API key» o los tipos de evento no cargan">
    Confirma que la clave sigue activa en Cal.com y que pegaste una clave de producción (las claves de producción de Cal.com empiezan por `cal_live_`), y luego vuelve a seleccionar **Load event types**. Si obtienes un error de autenticación en lugar de una lista vacía, probablemente elegiste el endpoint de API equivocado — una cuenta de Cal.com en la UE necesita el endpoint EU (o Custom para una instancia autoalojada), no el US por defecto.
  </Accordion>

  <Accordion title="Cal.com: el asistente sigue pidiendo un correo, o la reserva nunca se completa">
    `book_appointment` necesita una dirección de correo válida, porque Cal.com rechaza una reserva sin ella. Las direcciones dictadas («anna arroba example punto com») y las diéresis alemanas se convierten automáticamente antes de enviar la solicitud, así que la mayoría de direcciones dictadas funcionan; si lo que oyó el asistente sigue sin ser utilizable, se le indica que vuelva a preguntar en lugar de reservar. Indícale en el prompt que recoja y confirme el correo antes de reservar, y que reutilice una dirección que ya tenga como [variable de llamada](/es/assistants/variables) en lugar de preguntarla dos veces.
  </Accordion>

  <Accordion title="Calendly: «Specified location kind is not configured for this event type»">
    La única ubicación del tipo de evento en Calendly es un enlace de videoconferencia (Google Meet, Zoom, Teams), y el agente de voz no puede generar enlaces de reunión. En Calendly, edita el tipo de evento y añade **Custom** o **Phone Call → Inbound call** como ubicación — Custom es la opción más segura y funciona en todos los casos. Si el tipo de evento termina con más de una ubicación, elige la correcta en **Meeting location** dentro de la integración.
  </Accordion>

  <Accordion title="Calendly: faltan algunos tipos de evento de equipo">
    En una organización de Calendly, las cuentas admin y owner ven los tipos de evento de todos los miembros, incluidos los eventos Round Robin y Collective; una cuenta de miembro normal solo ve los suyos.
  </Accordion>

  <Accordion title="Las reservas se comportan distinto en una prueba de navegador que en una llamada real">
    Una prueba **Web Call** se ejecuta sin número de teléfono, así que todo lo que el flujo de reserva deriva del número de quien llama (enviar un enlace de programación por SMS, buscar una cita por teléfono) no puede funcionar igual. Usa **Test → Call** en la cabecera del asistente para una ejecución realista: el asistente marca un número que introduces tú, o tú marcas su número entrante.
  </Accordion>
</AccordionGroup>

¿Sigues atascado? Contacta con soporte indicando el nombre de la integración, el error mostrado en el editor del asistente y una transcripción de la llamada que no logró reservar.

## API y MCP

Todo lo anterior está disponible en la [API REST pública](/es/api-reference/introduction) y como herramientas de MCP en `https://<your-domain>/mcp`:

| REST                                                                          | Herramienta MCP                                                                                          | Alcance                           |
| ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------- |
| `GET/POST /api/v1/integrations`, `GET/PATCH/DELETE /api/v1/integrations/{id}` | `list_integrations`, `get_integration`, `create_integration`, `update_integration`, `delete_integration` | `integrations:read/write`         |
| `POST /api/v1/integrations/calendly/oauth-url`                                | `create_calendly_oauth_url`                                                                              | `integrations:write`              |
| `GET /api/v1/integrations/calendly/connections`                               | `list_calendly_connections`                                                                              | `integrations:read`               |
| `GET /api/v1/integrations/calendly/event-types?connection_id=…`               | `list_calendly_event_types`                                                                              | `integrations:read`               |
| `POST /api/v1/integrations/acuity/oauth-url`                                  | `create_acuity_oauth_url`                                                                                | `integrations:write`              |
| `GET /api/v1/integrations/acuity/connections`                                 | `list_acuity_connections`                                                                                | `integrations:read`               |
| `GET /api/v1/integrations/acuity/appointment-types?connection_id=…`           | `list_acuity_appointment_types`                                                                          | `integrations:read`               |
| `GET /api/v1/integrations/acuity/calendars?connection_id=…`                   | `list_acuity_calendars`                                                                                  | `integrations:read`               |
| `GET/PUT /api/v1/assistants/{id}/integrations`                                | `get_assistant_integrations`, `set_assistant_integrations`                                               | `integrations:*` o `assistants:*` |

Los tipos de evento, las conexiones y los registros de reserva del motor integrado se explican en [Calendario integrado](/es/assistants/native-calendar).
