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

# Calendario y reservas

> Deja que los asistentes consulten la disponibilidad y reserven citas durante la llamada, mediante Cal.com, Calendly, Google Calendar, Outlook o el motor de reservas integrado con páginas de reserva públicas

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 soporta esto de dos formas que puedes combinar libremente:

1. **Integraciones de calendario**: conecta un proveedor externo de programación (Cal.com, Calendly, Google Calendar, Outlook) una sola vez, asígnalo a un asistente, y el asistente obtiene automáticamente herramientas de reserva en cada llamada.
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 integrable en `/book/{workspace}/{slug}`, correos de invitación ICS y una integración `native` contra la que tus asistentes pueden reservar. No necesitas ninguna cuenta externa.

## Proveedores de un vistazo

| Proveedor                    | Disponibilidad                                                         | Reserva                                                                                | Credenciales                                            |
| ---------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| **Cal.com**                  | ✓ huecos libres de un tipo de evento                                   | ✓ reserva directa                                                                      | Clave de API (`cal_…`) + ID numérico del tipo de evento |
| **Calendly**                 | ✓ horarios disponibles de un tipo de evento                            | ✓ reserva directa (planes de pago de Calendly) o enlace de programación de un solo uso | Token de acceso personal + URI del tipo de evento       |
| **Google Calendar**          | ✓ libre/ocupado de un calendario conectado                             | ✓ creación de eventos con invitación al invitado                                       | Conexión OAuth (una sola vez)                           |
| **Outlook / Microsoft 365**  | ✓ libre/ocupado vía Microsoft Graph                                    | ✓ creación de eventos con invitación al invitado                                       | Conexión OAuth (una sola vez)                           |
| **Native (motor integrado)** | ✓ calculado a partir de la disponibilidad semanal de tu tipo de evento | ✓ reserva directa + correo ICS                                                         | ninguna                                                 |

<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 del plan de pago durante la llamada se marcan con el estado `link_mode`.
</Note>

## Conectar una integración

Ve a **Herramientas → Integraciones** y elige la tarjeta del proveedor:

* **Cal.com**: pega tu clave de API (Cal.com → Settings → Developer → API Keys) y el ID numérico del tipo de evento (visible en la URL del tipo de evento). La zona horaria es opcional; asegúrate de que coincida con la del tipo de evento en Cal.com.
* **Calendly**: pega un token de acceso personal (Calendly → Integrations & apps → API & webhooks) y elige el tipo de evento. Selecciona el modo de reserva (`api` o `link`) y el canal del enlace.
* **Google / Outlook**: haz clic en **Conectar** y completa el consentimiento de OAuth. La conexión se guarda por espacio de trabajo y la reutilizan todas las integraciones y tipos de evento que la referencien.
* **Native**: elige uno de tus tipos de evento de reserva (ver más abajo).

Toda integración se **verifica antes de guardarse**: una clave de API, token o ID de tipo de evento inválidos se rechazan con un error claro y nunca se almacenan. Los valores secretos nunca salen del servidor: las respuestas los enmascaran como `•••` (envía `•••` al actualizar para conservar el valor guardado).

## Asignar a un asistente

Abre la configuración del asistente y marca las integraciones que debe usar (o llama a `PUT /api/v1/assistants/{id}/integrations`). Por **cada integración asignada**, el asistente obtiene estas herramientas en cada llamada:

| Herramienta                                    | Tipo                                                             | Qué hace                                                                                                                                                                                                                            |
| ---------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `check_availability(start_date, end_date?)`    | solo lectura, interrumpible                                      | Obtiene los huecos libres 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 flows, análisis y webhooks. Si el hueco ya se acaba de ocupar, se le 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.                                                                                                                                                          |

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

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

## El motor de reservas integrado

Crea tipos de evento en **Reservas** dentro del panel (o vía API/MCP):

* **Nombre, slug y duración**: el slug es único dentro del espacio de trabajo y se convierte en la URL de la página pública `/book/{workspace}/{slug}` (`workspace` = `booking_handle` del tenant).
* **Disponibilidad semanal**: franjas horarias por día de la semana en la zona horaria del tipo de evento, por ejemplo, de lunes a viernes de 09:00 a 17:00.
* **Márgenes y reglas**: margen antes/después de cada reserva, aviso mínimo, horizonte de reserva (`max_days_ahead`) e incremento entre huecos.
* **Sincronización de calendario** (opcional): vincula un calendario de Google/Outlook conectado; sus horarios ocupados se restan de los huecos ofrecidos, y las reservas confirmadas se envían como eventos de calendario (los invitados reciben la invitación del proveedor).

### Página de reserva pública e inserción

Cada tipo de evento activo tiene una página pública con la marca de tu espacio de trabajo en `https://<your-domain>/book/{workspace}/{slug}`, sin necesidad de iniciar sesión. Insértala donde quieras:

```html theme={null}
<iframe src="https://<your-domain>/book/acme/intro-call"
        style="width:100%;min-height:640px;border:0" loading="lazy"></iframe>
```

Los visitantes eligen un hueco (mostrado en su propia zona horaria), indican su nombre y correo, y reciben un **correo de confirmación con una invitación de calendario ICS** más un enlace de cancelación. Las reservas duplicadas son imposibles: una restricción de exclusión a nivel de base de datos protege el hueco incluso cuando un visitante web y un asistente reservan en el mismo instante; quien pierde la carrera recibe un mensaje amistoso de "hueco recién ocupado".

### Reservar desde llamadas

Crea una integración con el proveedor **`native`** apuntando al tipo de evento y asígnala a un asistente: las reservas hechas a mitad de llamada aterrizan en el mismo calendario con `source: "call"` y un enlace al registro de la llamada.

## Restricción por plan

Toda la función está controlada por el flag de plan **`calendar_integrations`** (administrador de la plataforma → Planes). Sin él, crear integraciones o tipos de evento devuelve `403`; las páginas de reserva públicas existentes dejan de aceptar nuevas reservas.

## API y MCP

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

`GET /api/v1/bookings` y `list_bookings` admiten filtros por tipo de evento, origen y fecha. Usa `view=upcoming|unconfirmed|recurring|past|cancelled` para obtener las mismas vistas de reservas que el panel, o usa un filtro `status` exacto; `view` y `status` son mutuamente excluyentes.

| 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`         |
| `GET/PUT /api/v1/assistants/{id}/integrations`                                              | `get_assistant_integrations`, `set_assistant_integrations`                                                       | `integrations:*` o `assistants:*` |
| `GET/POST /api/v1/booking-event-types`, `GET/PATCH/DELETE /api/v1/booking-event-types/{id}` | `get_booking_event_types`, `create_booking_event_type`, `update_booking_event_type`, `delete_booking_event_type` | `bookings:read/write`             |
| `GET /api/v1/bookings`, `GET /api/v1/bookings/{id}`, `POST /api/v1/bookings/{id}/cancel`    | `list_bookings`, `get_booking`, `cancel_booking`                                                                 | `bookings:read/write`             |

Cancelar una reserva envía una actualización ICS `METHOD:CANCEL`, de modo que la cita desaparece automáticamente del calendario del invitado.
