# ¿Qué es Salescaling?

Salescaling es la plataforma de observabilidad comercial para grabar reuniones, analizar conversaciones y mejorar el rendimiento de ventas.

## ¿Qué es Salescaling?

Salescaling es una plataforma de observabilidad de procesos comerciales diseñada para ofrecerte visibilidad total de tus interacciones y ayudarte a tomar decisiones más informadas, acelerando el crecimiento y mejorando tus resultados.

<figure><img src="/files/edXLdModhXEdOy7dRBer" alt=""><figcaption></figcaption></figure>

***

## Registro e inicio de sesión

1. Accede a [app.salescaling.com](https://app.salescaling.com).
2. Regístrate con tu cuenta de Google, Microsoft o correo electrónico.
3. Verifica tu cuenta si es necesario.

***

## Invita al bot a tus reuniones

* Desde la página **/meetings**, puedes hacer clic en "Record Meeting" y copiar el enlace de la reunión para que el bot se una a ella, o [conectar tu calendario](https://github.com/salescaling/web-platform/blob/docs/apps/docs/getting-started/settings/integraciones.md#calendarios).
* El **bot**, nuestro asistente virtual, se une automáticamente a tus reuniones para grabarlas y analizarlas una vez conectado el calendario.
* Puedes gestionar las reuniones que el bot grabará desde la página [**/bot-manager**](https://github.com/salescaling/web-platform/tree/main/apps/docs/guias-practicas/compartir-contenido.md).

***

## Visualiza tus reuniones

* En la página **/meetings**, puedes ver todas tus reuniones pasadas.
* Accede a transcripciones, resúmenes y clips de cada reunión.
* Usa los filtros para encontrar las reuniones que necesites.

***

## Revisa tu desempeño

* Accede a la página [**/analytics**](/guias-practicas/analitica-y-reportes) para ver métricas como duración, participación del cliente, y [AI Score](https://app.gitbook.com/o/6VLf27xiEWrRDMXUUrGY/s/wlqjdbsSjPxjbXypmcqu/~/changes/15/configuraciones-de-la-plataforma/configuracion-de-la-ia/tipos-de-actividad-definir-el-score).
* Encuentra *insights* sobre lo que funcionó y lo que puede mejorar.

***

## Comparte momentos clave

* Crea **clips** y **listas de reproducción** para compartir con tu equipo o utilizarlos como material de formación.
* Nuestra IA genera clips automáticamente de las reuniones cuando hayas [configurado los tipos de reunión](https://github.com/salescaling/web-platform/blob/docs/apps/docs/getting-started/settings/tipos-reuniones.md).
* Puedes hacerlo desde cada reunión.

***

## Ajustes importantes

Visita la página [**/settings**](https://app.salescaling.com/settings/profile) para:

* Configurar tu equipo, sus roles y permisos.
* Activar [integraciones](/configuraciones-de-la-plataforma/integraciones) como Google Calendar o Zoom.
* Gestionar tu [facturación](/configuraciones-de-la-plataforma/gestion-de-la-organizacion/facturacion) y preferencias de seguridad.
* Generar claves API para integraciones técnicas.
* Configurar las [notificaciones](/configuraciones-de-la-plataforma/configuraciones-tecnicas/notificaciones) de tu equipo.
* Configurar los [tipos de reunión](https://app.gitbook.com/o/6VLf27xiEWrRDMXUUrGY/s/wlqjdbsSjPxjbXypmcqu/~/changes/15/configuraciones-de-la-plataforma/configuracion-de-la-ia/tipos-de-actividad-definir-el-score) para que la IA genere clips automáticamente.
* Configurar [reglas de privacidad](/configuraciones-de-la-plataforma/configuraciones-tecnicas/reglas-de-privacidad) para controlar quién tiene acceso automático a tus reuniones y llamadas.

***

## ¿Eres manager?

Como manager puedes:

* Ver el desempeño de tu equipo.
* Configurar [metodologías de ventas personalizadas](/estrategias-y-casos-de-uso/como-implementar-un-ciclo-de-coaching-basado-en-datos).
* Recibir *insights* agregados por equipo o individuo.
* Controlar la configuración del *bot*, las integraciones y más.

Consulta la sección [Roles y permisos](/primeros-pasos/roles-permisos) para más detalles.

***

¿Tienes dudas? Revisa nuestras otras secciones o contáctanos en <support@salescaling.com>.


# Registro e inicio de sesión

Regístrate e inicia sesión en Salescaling con Google, Microsoft o correo electrónico de forma segura.

## Inicio de Sesión

El inicio de sesión en [**Salescaling**](https://auth.salescaling.com/u/login/identifier?state=hKFo2SAwRXNBMk4wdEpJMmtaTXBuSlZPV1l6Z2wxQjN1R1pSeaFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIEZQOGt0WUcyTWNTa1JPQkFEcS05bm5GdXNzM3UyZWF6o2NpZNkgT0R6THZGN1JRRlBuS0k2OFlDTTZBYUdWTlNDdzE0RTc) se realiza a través de un sistema de autenticación moderno y seguro. Esta metodología permite que el acceso a la plataforma se gestione directamente con las credenciales de su cuenta de **Google** o **Microsoft**, lo que simplifica el proceso y refuerza la seguridad al no requerir la creación de una contraseña adicional.

### Pasos para iniciar sesión:

1. Ve a la página de [inicio de sesión](https://auth.salescaling.com/u/login/identifier?state=hKFo2SAwRXNBMk4wdEpJMmtaTXBuSlZPV1l6Z2wxQjN1R1pSeaFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIEZQOGt0WUcyTWNTa1JPQkFEcS05bm5GdXNzM3UyZWF6o2NpZNkgT0R6THZGN1JRRlBuS0k2OFlDTTZBYUdWTlNDdzE0RTc).
2. Selecciona el método de inicio de sesión que prefieras (Google o Microsoft).
3. Sigue las instrucciones del proveedor seleccionado.
4. Una vez autenticado, serás redirigido automáticamente a la plataforma.

## Registro

Hay dos formas de registrarte en Salescaling:

### 1. Registro por Invitación

Es la forma más común y recomendada para equipos y organizaciones.

1. Recibirás un correo electrónico con un enlace de invitación.
2. Haz clic en el enlace, serás dirigido a la página de registro.
3. Completa el registro utilizando tu cuenta de Google, Microsoft o correo electrónico
4. Una vez completado, tendrás acceso a la plataforma con los permisos asignados por el administrador.

### 2. Registro Directo

Si eres el primer usuario de tu organización, puedes registrarte directamente:

1. Ve a la [página de registro](https://app.salescaling.com/auth/signup).
2. Selecciona el método de registro (Google, Microsoft o correo electrónico).
3. Sigue las instrucciones del proveedor seleccionado.
4. Una vez completado, tendrás acceso a la plataforma.

{% hint style="info" %}
Si tu organización ya utiliza **Salescaling**, es posible que la organización no permita el registro directo. En este caso, contacta con el administrador de tu organización para que te invite a la plataforma.
{% endhint %}

## Notas Importantes

* El registro por correo electrónico se realiza mediante **OTP**, por lo tanto, todos los métodos de inicio de sesión y registro se realizan sin contraseñas.
* Podrás acceder a tu cuenta de **Salescaling** desde cualquier dispositivo con conexión a internet.
* Los permisos y roles son asignados por los administradores de tu organización.
* El primer usuario registrado en tu organización será el propietario de la misma.
* Puedes tener acceso a múltiples organizaciones con diferentes roles en cada una, siempre que hayas sido invitado.

## Soporte

Si tienes problemas para iniciar sesión o registrarte, por favor contacta con el soporte técnico de tu organización o con el equipo de **Salescaling**.


# Cómo grabar tu primera reunión

Graba tu primera reunión en Salescaling conectando tu calendario, invitando al bot o usando la extensión de Chrome.

Hay varias formas de comenzar a grabar reuniones con Salescaling. A continuación, te explicamos las opciones disponibles:

## 1. Conectar tu calendario (recomendado)

Esta es la forma más sencilla y recomendada. El *bot* se unirá automáticamente a tus reuniones.

### Pasos para conectar tu calendario:

1. Diríjase a **Settings >** [**Integraciones**](https://app.salescaling.com/settings/integrations)**.**
2. Seleccione el proveedor de calendario correspondiente (Google Calendar o Microsoft Calendar).
3. Siga el proceso de autorización.
4. Una vez conectado, el *bot* se unirá automáticamente a tus reuniones.

{% hint style="info" %}
Para más detalles sobre la configuración del calendario, consulta la [documentación de integración de calendarios](/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas).
{% endhint %}

## 2. Programar el b*ot* manualmente

Si prefieres programar el *bot* para reuniones específicas, sigue estos pasos:

1. Vaya a la página [**Bot Manager**](https://app.salescaling.com/bot-manager)**.**
2. Haga clic en **Record meeting**.
3. Introduzca la fecha y hora de la reunión.
4. Añada la URL de la reunión (debe ser de un proveedor soportado).
5. Confirme la programación.

{% hint style="info" %}
Para ver la lista de proveedores soportados, consulta nuestras [Preguntas Frecuentes](https://docs.salescaling.com/primeros-pasos/pages/iSM04wZFziqQepdGFdc6#qué-proveedores-de-videoconferencia-soporta-salescaling).
{% endhint %}

## 3. Subir una reunión grabada

Si ya se tiene una reunión grabada que se quiere analizar:

1. Vaya a la página [**Meetings**](https://app.salescaling.com/meetings)**.**
2. Haga clic en **Upload recording**.
3. Seleccione el archivo de vídeo (máximo 2GB).
4. Espere a que se procese la subida.

{% hint style="info" %}
**Nota**: Esta opción es menos precisa en la detección de hablantes y el análisis de la conversación. Estamos trabajando en mejorar esta funcionalidad.
{% endhint %}

## 4. Subir a través de la API

Puedes crear reuniones y subir tus grabaciones [a través de nuestra API](https://github.com/salescaling/web-platform/tree/main/apps/docs/primeros-pasos/broken-reference/README.md).

## Recomendaciones

* Para obtener los mejores resultados, conecte su calendario.
* Existen algunas particularidades en el funcionamiento del *bot* en las reuniones, consulta la [documentación del bot](https://github.com/salescaling/web-platform/tree/main/apps/docs/guias-practicas/compartir-contenido.md) para más detalles.
* Las reuniones deben ser de proveedores soportados.
* Consulte la [documentación de integración de calendarios](/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas) para más detalles.

## Soporte

En caso de encontrar problemas durante la configuración de la primera reunión grabada, se recomienda contactar con el [soporte técnico](https://www.salescaling.com/en/contact) de la organización o directamente con el equipo de **Salescaling**.


# Roles y permisos

Salescaling ofrece cuatro tipos de rol, cada uno con diferentes accesos y permisos:

* **Read Only**: Acceso básico de solo lectura.
* **Regular**: Usuario estándar con permisos para gestionar sus propios recursos.
* **Admin**: Administrador con acceso a la mayoría de las funcionalidades.
* **Owner**: Propietario con acceso total a la plataforma.

## Resumen de Permisos por Rol

### Usuarios

| Permiso                                  | Read Only | Regular | Admin | Owner |
| ---------------------------------------- | --------- | ------- | ----- | ----- |
| Invitar usuarios                         | ❌         | ❌       | ✅     | ✅     |
| Ver mi perfil                            | ✅         | ✅       | ✅     | ✅     |
| Ver listado de usuarios                  | ❌         | ✅       | ✅     | ✅     |
| Editar información de mi perfil          | ✅         | ✅       | ✅     | ✅     |
| Editar información de todos los usuarios | ❌         | ❌       | ✅     | ✅     |
| Editar roles de usuarios                 | ❌         | ❌       | ✅     | ✅     |
| Eliminar mi usuario                      | ✅         | ✅       | ✅     | ✅     |
| Eliminar usuarios (excepto owner)        | ❌         | ❌       | ✅     | ✅     |
| Eliminar todos los usuarios              | ❌         | ❌       | ❌     | ✅     |

### Calendarios

| Permiso                              | Read Only | Regular | Admin | Owner |
| ------------------------------------ | --------- | ------- | ----- | ----- |
| Integrar calendario                  | ❌         | ✅       | ✅     | ✅     |
| Ver eventos de mi calendario         | ❌         | ✅       | ✅     | ✅     |
| Ver eventos de todos los calendarios | ❌         | ❌       | ✅     | ✅     |

### Reuniones

| Permiso                                              | Read Only | Regular | Admin | Owner |
| ---------------------------------------------------- | --------- | ------- | ----- | ----- |
| Subir reunión manualmente                            | ❌         | ✅       | ✅     | ✅     |
| Ver reuniones donde participo                        | ✅         | ✅       | ✅     | ✅     |
| Ver reuniones de mi equipo                           | ✅         | ✅       | ✅     | ✅     |
| Ver todas los reuniones de la organización           | ❌         | ❌       | ✅     | ✅     |
| Editar reuniones donde participo                     | ❌         | ✅       | ✅     | ✅     |
| Editar cualquier reunión                             | ❌         | ❌       | ✅     | ✅     |
| Eliminar reuniones donde participo                   | ❌         | ❌       | ✅     | ✅     |
| Eliminar reuniones donde soy organizador             | ❌         | ✅       | ✅     | ✅     |
| Eliminar cualquier reunión                           | ❌         | ❌       | ✅     | ✅     |
| Ver contenido del chat                               | ✅         | ✅       | ✅     | ✅     |
| Interactuar con el chat                              | ❌         | ✅       | ✅     | ✅     |
| Generar email de seguimiento                         | ❌         | ✅       | ✅     | ✅     |
| Compartir mis meetings                               | ❌         | ✅       | ✅     | ✅     |
| Compartir cualquier meeting                          | ❌         | ❌       | ✅     | ✅     |
| Ver mi reporte de *feedback*                         | ✅         | ✅       | ✅     | ✅     |
| Ver reporte de *feedback* de todos los participantes | ❌         | ❌       | ✅     | ✅     |

### Llamadas telefónicas

| Permiso                                               | Read Only | Regular | Admin | Owner |
| ----------------------------------------------------- | --------- | ------- | ----- | ----- |
| Subir llamada telefónica manualmente                  | ❌         | ✅       | ✅     | ✅     |
| Ver llamadas telefónicas donde participo              | ✅         | ✅       | ✅     | ✅     |
| Ver llamadas telefónicas de mi equipo                 | ✅         | ✅       | ✅     | ✅     |
| Ver todas las llamadas telefónicas de la organización | ❌         | ❌       | ✅     | ✅     |
| Editar llamadas telefónicas donde participo           | ❌         | ✅       | ✅     | ✅     |
| Editar cualquier llamada telefónica                   | ❌         | ❌       | ✅     | ✅     |
| Eliminar llamadas telefónicas donde participo         | ❌         | ❌       | ✅     | ✅     |
| Eliminar llamadas telefónicas donde soy organizador   | ❌         | ✅       | ✅     | ✅     |
| Eliminar cualquier llamada telefónica                 | ❌         | ❌       | ✅     | ✅     |
| Ver contenido del chat                                | ✅         | ✅       | ✅     | ✅     |
| Interactuar con el chat                               | ❌         | ✅       | ✅     | ✅     |
| Generar mail de seguimiento                           | ❌         | ✅       | ✅     | ✅     |
| Compartir mis llamadas telefónicas                    | ❌         | ✅       | ✅     | ✅     |
| Compartir cualquier llamada telefónica                | ❌         | ❌       | ✅     | ✅     |
| Ver mi reporte de *feedback*                          | ✅         | ✅       | ✅     | ✅     |
| Ver reporte de *feedback* de todos los participantes  | ❌         | ❌       | ✅     | ✅     |

### *Bots*

| Permiso                     | Read Only | Regular | Admin | Owner |
| --------------------------- | --------- | ------- | ----- | ----- |
| Crear *bot* manualmente     | ❌         | ✅       | ✅     | ✅     |
| Desactivar mis *bots*       | ❌         | ✅       | ✅     | ✅     |
| Desactivar cualquier *bot*  | ❌         | ❌       | ✅     | ✅     |
| Ver info de mis *bots*      | ❌         | ✅       | ✅     | ✅     |
| Ver info de cualquier *bot* | ❌         | ❌       | ✅     | ✅     |

### Clips

| Permiso                             | Read Only | Regular | Admin | Owner |
| ----------------------------------- | --------- | ------- | ----- | ----- |
| Crear clips en mis reuniones        | ❌         | ✅       | ✅     | ✅     |
| Crear clips en cualquier reunión    | ❌         | ❌       | ✅     | ✅     |
| Ver clips de mis reuniones          | ✅         | ✅       | ✅     | ✅     |
| Ver clips de cualquier reunión      | ❌         | ❌       | ✅     | ✅     |
| Editar clips en mis reuniones       | ❌         | ✅       | ✅     | ✅     |
| Editar clips en cualquier reunión   | ❌         | ❌       | ✅     | ✅     |
| Eliminar clips en mis reuniones     | ❌         | ✅       | ✅     | ✅     |
| Eliminar clips en cualquier reunión | ❌         | ❌       | ✅     | ✅     |

### Ajustes y Configuración

| Permiso                                | Read Only | Regular | Admin | Owner |
| -------------------------------------- | --------- | ------- | ----- | ----- |
| Ver ajustes de mi cuenta               | ✅         | ✅       | ✅     | ✅     |
| Editar ajustes de mi cuenta            | ✅         | ✅       | ✅     | ✅     |
| Ver ajustes reuniones                  | ❌         | ❌       | ✅     | ✅     |
| Editar ajustes reuniones               | ❌         | ❌       | ✅     | ✅     |
| Ver ajustes de llamadas telefónicas    | ❌         | ❌       | ✅     | ✅     |
| Editar ajustes de llamadas telefónicas | ❌         | ❌       | ✅     | ✅     |
| Ver mis ajustes de notificaciones      | ❌         | ✅       | ✅     | ✅     |
| Editar mis ajustes de notificaciones   | ❌         | ✅       | ✅     | ✅     |
| Conectar calendario                    | ❌         | ✅       | ✅     | ✅     |
| Desconectar calendario                 | ❌         | ✅       | ✅     | ✅     |

### Listas de reproducción

| Permiso                                         | Read Only | Regular | Admin | Owner |
| ----------------------------------------------- | --------- | ------- | ----- | ----- |
| Ver mis listas de reproducción                  | ❌         | ✅       | ✅     | ✅     |
| Ver todas las listas de reproducción            | ❌         | ❌       | ✅     | ✅     |
| Añadir clips a mis listas de reproducción       | ❌         | ✅       | ✅     | ✅     |
| Añadir clips a todas las listas de reproducción | ❌         | ❌       | ✅     | ✅     |
| Crear listas de reproducción                    | ❌         | ✅       | ✅     | ✅     |
| Editar mis listas de reproducción               | ❌         | ✅       | ✅     | ✅     |
| Editar todas las listas de reproducción         | ❌         | ❌       | ✅     | ✅     |
| Eliminar mis listas de reproducción             | ❌         | ✅       | ✅     | ✅     |
| Eliminar todas las listas de reproducción       | ❌         | ❌       | ✅     | ✅     |

### Equipos

| Permiso                       | Read Only | Regular | Admin | Owner |
| ----------------------------- | --------- | ------- | ----- | ----- |
| Crear equipos                 | ❌         | ❌       | ✅     | ✅     |
| Ver mis equipos               | ❌         | ✅       | ✅     | ✅     |
| Ver todos los equipos         | ❌         | ❌       | ✅     | ✅     |
| Gestionar usuarios en equipos | ❌         | ❌       | ✅     | ✅     |
| Editar detalles de equipos    | ❌         | ❌       | ✅     | ✅     |
| Eliminar equipos              | ❌         | ❌       | ✅     | ✅     |

### Organización

| Permiso                       | Read Only | Regular | Admin | Owner |
| ----------------------------- | --------- | ------- | ----- | ----- |
| Ver información general       | ✅         | ✅       | ✅     | ✅     |
| Editar información            | ❌         | ❌       | ✅     | ✅     |
| Ver ajustes de facturación    | ❌         | ❌       | ✅     | ✅     |
| Editar ajustes de facturación | ❌         | ❌       | ✅     | ✅     |
| Eliminar organización         | ❌         | ❌       | ❌     | ✅     |
| Integrar CRM                  | ❌         | ❌       | ✅     | ✅     |
| Ver ajustes de API            | ❌         | ❌       | ✅     | ✅     |
| Editar ajustes de API         | ❌         | ❌       | ✅     | ✅     |
| Ver ajustes de Equipos        | ❌         | ❌       | ✅     | ✅     |
| Editar ajustes de Equipos     | ❌         | ❌       | ✅     | ✅     |

## Notas Importantes

{% hint style="info" %}
A medida que se añaden nuevas funcionalidades, los permisos se irán actualizando.
{% endhint %}

## Soporte

Si necesitas ajustar los permisos de tu organización o tienes dudas sobre los roles disponibles, contacta con el soporte técnico de tu organización o con el equipo de Salescaling.


# Análisis de Grabaciones

## **1. Explorador**

El Explorador de Grabaciones es el centro de mando principal para la gestión de todas las conversaciones grabadas. La interfaz es la misma para Meetings y Calls, lo que permite encontrar y gestionar cualquier actividad de forma rápida y consistente.

<figure><img src="/files/70pw4YaDR6jlMs5Mif5f" alt=""><figcaption></figcaption></figure>

**Búsqueda y filtros unificados (1):**

La barra superior permite localizar cualquier grabación con precisión usando criterios como **Fecha**, **Usuario**, **Empresa**, Tags y el **AI Score**. La única diferencia es el filtro de tipo: **Meeting** **Type** o **Call** **Type**.

**Vistas guardadas (2):**

Es posible guardar combinaciones de filtros de uso frecuente como una "**Vista**" (View) para acceder a ella con un solo clic.

**Iniciar o subir grabaciones (3):**

Desde la esquina superior derecha, se pueden añadir nuevas actividades, ya sea grabando una reunión al momento **(Record Meeting)** o subiendo un archivo de vídeo o audio existente **(Upload recording / call)**.

**Acciones rápidas (4):**

El menú de tres puntos (...) al final de cada fila permite:

* Copiar el resumen de la IA.
* Compartir la grabación.
* Eliminar la grabación.

## **2. Revisión de grabación al detalle**

Al hacer clic en cualquier grabación desde el Explorador, accedes a la **Vista de Detalle,** el centro de análisis profundo de Salescaling. La interfaz es la misma para **Meetings** y **Calls** (excepto que en las Calls no se muestra el reproductor de vídeo).

**El reproductor y la transcripción interactiva**

* El panel derecho contiene el **reproductor (1)** y la **transcripción completa (2)**, sincronizada con el audio/vídeo.
* Este panel tiene tres vistas:

  * **Transcription (2):** Texto completo de la grabación.
  * **Speakers (3):** Resumen de participación de cada persona.
  * **Questions (4):** Listado de todas las preguntas detectadas.

  <figure><img src="/files/9UIDaSHTVw8S5AwgBjrm" alt=""><figcaption></figcaption></figure>

**Pestañas de análisis (panel izquierdo)**

* **Summary**: Presenta un desglose interactivo del **AI Score**, donde es posible hacer clic en cada criterio para ver la evidencia en el vídeo.
* **Clips:** Momentos clave, generados por la IA o creados manualmente.
* **Chat con IA:** Pregunta a la IA sobre el contenido de la reunión.
* **Feedback:** Comentarios estructurados para cada participante.
* **Analytics:** Gráficos sobre la dinámica de la conversación (tiempo de habla, etc.).

<figure><img src="/files/a6TQ0SwD1NQ9rP3MBShk" alt=""><figcaption></figcaption></figure>


# Uso del Bot de Reuniones

Para configurar el nombre del bot, la autenticación en Google Meet y el comportamiento por plataforma, consulta [Identidad del bot de reuniones](/configuraciones-de-la-plataforma/configuraciones-tecnicas/identidad-del-bot-de-reuniones) en **Settings > Meetings**.

## **El Bot Manager**

El [**Bot Manager**](https://app.salescaling.com/bot-manager?isPast=false) es el centro de control para la supervisión y gestión de la agenda del asistente de IA de Salescaling. Mientras que las reglas generales de la organización deciden a qué reuniones se unirá el bot por defecto, el Bot Manager ofrece al usuario un control final, permitiendo realizar ajustes manuales para reuniones específicas.

Su principal objetivo es darte flexibilidad y control total sobre tu privacidad y sobre qué conversaciones se graban.

<figure><img src="/files/xfFnn8zeNUvQbiW0npCJ" alt=""><figcaption></figcaption></figure>

Funcionalidades Clave:

### **1. Revisa la Agenda del Bot**

La pantalla principal funciona como un calendario, mostrando en la pestaña **Upcoming** todas las reuniones futuras a las que el bot tiene previsto unirse. Esto proporciona una visibilidad completa y permite anticipar qué conversaciones serán analizadas. En la pestaña **Past** se puede consultar el historial de reuniones a las que ya ha asistido.

### **2. Gestiona la Asistencia Reunión por Reunión (Control Manual)**

Esta es la función más importante del Bot Manager. Para cada reunión futura, se muestra un interruptor de activación **(ON/OFF)**.

<figure><img src="/files/MhhiV1xSveBlWXOvL1F3" alt=""><figcaption></figcaption></figure>

* Este control es especialmente útil para reuniones personales, entrevistas o cualquier conversación que no deba ser grabada. Al desactivar el interruptor, el bot no intentará unirse a esa reunión específica. Esta acción es un veto manual que proporciona un control granular sin necesidad de contactar a un administrador para alterar las reglas generales.

### **3. Audita los Cambios (Activity Log)**

A través del menú de tres puntos (...) al final de la fila de cada reunión, se puede acceder al **Activity Log** (Registro de Actividad).

* Esta ventana muestra un historial detallado de los estados del bot para esa reunión, ofreciendo total transparencia. Si surge la duda de por qué un bot no se unió a una llamada, el Activity Log indicará si fue desactivado manualmente o si ocurrió otro evento.

  <figure><img src="/files/a4JVPdi3Hko6ei7AlF59" alt="" width="283"><figcaption></figcaption></figure>

  A continuación, se describe el significado de cada estado que puede aparecer en la línea de tiempo:

  * **Ready (Preparado):** El sistema ha reconocido la reunión y ha preparado al bot para que se una a la hora programada.
  * **Joining Call (Uniéndose a la llamada):** El bot está intentando activamente entrar en la videollamada.
  * **In Waiting Room (En la sala de espera):** El bot ha llegado a la reunión pero está esperando a que el anfitrión lo admita manualmente.
  * **In Call Not Recording (En la llamada, sin grabar):** El bot ha sido admitido, pero aún no ha comenzado a grabar, generalmente mientras espera los permisos de grabación.
  * **In Call Recording (En la llamada, grabando):** El bot está dentro de la reunión y grabando activamente.
  * **Call Ended (Llamada Finalizada):** La participación del bot ha terminado. Debajo puede aparecer un motivo (ej: "Bot Kicked From Waiting Room" si fue expulsado, o "Timeout Exceeded" si todos los participantes se fueron).
  * **Recording Done (Grabación Completada):** El archivo de la grabación se ha procesado y guardado.
  * **Done (Finalizado):** El proceso del bot para esta reunión ha concluido.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>Veo una reunión en mi agenda del Bot Manager a la que no quiero que el bot se una. ¿Qué hago?</summary>

Simplemente busca esa reunión en la lista de **Upcoming** y haz clic en el interruptor verde para ponerlo en posición de apagado (OFF). El bot ya no intentará unirse a esa reunión.

</details>

<details>

<summary>Desactivé el bot para una reunión por error. ¿Puedo volver a activarlo?</summary>

Sí. Mientras la reunión no haya pasado, puedes volver al Bot Manager en cualquier momento y hacer clic de nuevo en el interruptor para ponerlo en posición de encendido (ON).

</details>


# Agentes de Voz de IA

> ⚠️ **Funcionalidad en Fase Beta**
>
> Los Agentes de Voz de IA están actualmente en fase beta y no están disponibles para todos los clientes. Si estás interesado en probar esta funcionalidad, contacta con nuestro equipo de soporte.

## Introducción

Los **Agentes de Voz de IA** son asistentes virtuales inteligentes que pueden realizar llamadas telefónicas de forma automática, mantener conversaciones naturales con tus contactos y tomar decisiones inteligentes sobre seguimientos y reintentos.

### Beneficios Principales

* 🤖 **Automatización completa**: El agente realiza llamadas sin intervención humana
* 🧠 **Inteligencia artificial**: Detecta automáticamente cuándo programar seguimientos
* ⏰ **Ahorro de tiempo**: Libera a tu equipo de tareas repetitivas
* 📊 **Seguimiento inteligente**: El sistema aprende de cada conversación
* 🎯 **Personalización**: Cada llamada incluye contexto de conversaciones anteriores

## Cómo Funciona

### Proceso de Llamadas

Cuando creas una llamada con un agente de voz, el sistema sigue este flujo:

1. **Validación inicial**: Verifica que el número no esté en la [lista de no llamar](/guias-practicas/gestion-de-blacklist)
2. **Verificación de horario**: Comprueba que sea un momento apropiado para llamar
3. **Inicio de llamada**: El agente marca el número automáticamente
4. **Conversación**: El agente mantiene una conversación natural siguiendo su prompt configurado
5. **Análisis post-llamada**: La IA analiza la conversación para detectar seguimientos necesarios

### Estados de las Llamadas

Durante su ciclo de vida, una llamada puede pasar por diferentes estados:

| Estado              | Descripción                     | Qué significa                                     |
| ------------------- | ------------------------------- | ------------------------------------------------- |
| 🆕 **Creada**       | Llamada creada pero no iniciada | La llamada está registrada en el sistema          |
| 📅 **Programada**   | Programada para fecha futura    | Se ejecutará automáticamente en la fecha indicada |
| ⏳ **En Cola**       | En cola de procesamiento        | Esperando turno para ser ejecutada                |
| 📞 **Llamando**     | Marcando el número              | El sistema está intentando conectar               |
| 🔄 **En Progreso**  | Llamada activa                  | El agente está conversando con el contacto        |
| ✅ **Completada**    | Finalizada exitosamente         | La conversación terminó correctamente             |
| ❌ **Fallida**       | Error en la llamada             | Hubo un problema técnico                          |
| 🚫 **Cancelada**    | Cancelada manualmente           | Usuario canceló la llamada programada             |
| 📧 **Buzón de Voz** | Llegó a contestador             | El sistema detectó un buzón de voz                |

### Resultados de las Llamadas

Después de cada conversación, el sistema clasifica automáticamente el resultado:

* ✅ **Reunión Programada**: El contacto aceptó agendar una reunión
* 📵 **Ocupado/Buzón**: No se pudo contactar con la persona
* 🚫 **No Interesado**: El contacto rechazó la oferta

## Detección Inteligente de Seguimientos

Una de las características más potentes de los agentes de voz es su capacidad para detectar automáticamente cuándo es necesario programar una llamada de seguimiento.

### ¿Cómo Funciona?

Después de cada llamada, la **inteligencia artificial analiza la transcripción completa** de la conversación para identificar señales que indiquen la necesidad de un seguimiento.

### ✅ Cuándo se Programa un Seguimiento Automático

El sistema programa automáticamente una nueva llamada cuando detecta:

1. **Solicitud explícita del cliente**

   ```
   Cliente: "Llámame mañana a las 3 de la tarde"
   → Sistema programa llamada para mañana a las 15:00
   ```
2. **Cliente muestra interés pero está ocupado**

   ```
   Cliente: "Me interesa pero estoy en una reunión, contacta conmigo la próxima semana"
   → Sistema programa llamada para dentro de 7 días
   ```
3. **Cliente proporciona número alternativo**

   ```
   Cliente: "No soy yo quien decide, habla con María al 675 412 661"
   → Sistema programa llamada al número de María con contexto de la conversación
   ```
4. **Fecha/hora específica mencionada**

   ```
   Cliente: "Llama el lunes por la mañana"
   → Sistema calcula la fecha del próximo lunes y programa la llamada
   ```

### ❌ Cuándo NO se Programa Seguimiento

El sistema es inteligente y **NO programa seguimientos** cuando:

* ❌ El cliente rechaza claramente la oferta
* ❌ El cliente dice que no está interesado
* ❌ El cliente pide explícitamente no ser contactado (se añade a [blacklist](/guias-practicas/gestion-de-blacklist))
* ❌ Ya se agendó una reunión formal en el calendario
* ❌ La llamada fue directamente a buzón de voz sin respuesta
* ❌ El cliente colgó inmediatamente

### Niveles de Confianza

Cada detección de seguimiento incluye un **nivel de confianza**:

* 🟢 **Alto**: Solicitud explícita con fecha/hora específica
* 🟡 **Medio**: Interés claro pero sin fecha específica
* 🟠 **Bajo**: Señales indirectas o ambiguas

## Reintentos Automáticos

El sistema gestiona automáticamente los reintentos cuando una llamada no tiene éxito.

### Cuándo se Programa un Reintento

* 📧 **Buzón de voz**: Nadie contestó la llamada
* 📵 **Línea ocupada**: El número estaba ocupado
* ⏰ **Mal momento**: El cliente pidió ser llamado en otro momento

### Cálculo Inteligente de la Fecha de Reintento

El sistema calcula automáticamente cuándo volver a llamar:

| Situación                          | Tiempo de Espera | Ejemplo                                         |
| ---------------------------------- | ---------------- | ----------------------------------------------- |
| Cliente mencionó fecha específica  | Usar esa fecha   | "Llámame el viernes" → Programa para el viernes |
| Dijo "más tarde" sin especificar   | 24 horas         | Reintenta al día siguiente                      |
| Dijo "próxima semana"              | 7 días           | Reintenta en una semana                         |
| Estaba ocupado pero mostró interés | 2-3 días         | Reintenta en 2-3 días                           |
| Buzón de voz sin contexto          | 48 horas         | Reintenta en 2 días                             |

### Contexto de Llamadas Anteriores

Cuando el sistema programa un reintento, **incluye automáticamente un resumen de la conversación anterior**. Esto permite que el agente:

* 📝 Haga referencia a la conversación previa
* 🎯 Continúe desde donde se quedó
* 💡 Personalice el mensaje según el contexto

**Ejemplo:**

```
Primera llamada:
Cliente: "Suena interesante pero ahora no puedo hablar"

Segunda llamada (reintento):
Agente: "Hola, te llamo como habíamos quedado. La última vez 
        mencionaste que te interesaba nuestra solución..."
```

### Números Alternativos

Si durante una conversación el cliente proporciona el número de otra persona (por ejemplo, el decisor real), el sistema:

1. 🔍 **Detecta el número alternativo** automáticamente
2. 👤 **Identifica el nombre y rol** de la persona si se mencionó
3. 📞 **Programa la llamada** al nuevo número
4. 📋 **Incluye el contexto** de por qué se debe contactar a esa persona

**Ejemplo:**

```
Cliente: "No soy yo quien decide esto, tienes que hablar con 
         Jonay, es el director comercial. Su número es 675 412 661"

→ Sistema detecta:
  - Número alternativo: 675 412 661
  - Nombre: Jonay
  - Rol: Director comercial
  - Contexto: Es el decisor, referido por [nombre del cliente inicial]

→ Programa llamada a Jonay con toda esta información
```

## Horarios de Llamadas

### Números de Teléfono

Para que tu agente de voz pueda realizar llamadas, necesitas tener un **número de teléfono activo** asignado al agente.

> 📞 **Compra de Números**
>
> Para adquirir números de teléfono nacionales o internacionales, contacta con nuestro equipo de soporte:
>
> * 📧 Email: <support@salescaling.com>
> * 💬 Chat en vivo en la plataforma
>
> Disponemos de números en múltiples países y podemos ayudarte a elegir el más adecuado para tu caso de uso.

### Configuración de Horarios

Los agentes de voz pueden tener **horarios configurados** para respetar:

* 🕐 **Horas laborales**: Solo llamar en horario de oficina
* 📅 **Días de la semana**: Evitar fines de semana
* 🌍 **Zonas horarias**: Respetar la zona horaria del contacto
* 🚫 **Excepciones**: Días festivos o periodos de vacaciones

### Validación Automática

Antes de cada llamada, el sistema:

1. ✅ Verifica si es un momento apropiado según el horario configurado
2. ⏰ Si no puede llamar ahora, calcula el **próximo slot disponible**
3. 📅 Programa automáticamente la llamada para ese momento

**Ejemplo:**

```
Intento de llamada: Sábado 10:00 AM
Horario configurado: Lunes a Viernes, 9:00 AM - 6:00 PM

→ Sistema detecta que es fin de semana
→ Calcula próximo slot: Lunes 9:00 AM
→ Programa la llamada automáticamente para el lunes
```

## Protección con Lista de No Llamar

El sistema integra automáticamente la [gestión de blacklist](/guias-practicas/gestion-de-blacklist) para proteger tu organización.

### Validación Automática

Antes de **cada llamada**, el sistema:

1. 🔍 Verifica si el número está en la lista de no llamar
2. 🚫 Si está blacklisted, **bloquea la llamada automáticamente**
3. 📝 Registra el intento en los logs
4. ➡️ Continúa con el siguiente contacto en la cola

### Detección Automática Durante Llamadas

Si durante una conversación el cliente solicita no ser contactado:

1. 🤖 La IA detecta la solicitud automáticamente
2. 📋 Clasifica el nivel de riesgo (alto, medio, bajo)
3. 🚫 Añade el número a la blacklist
4. ⛔ Cancela cualquier llamada futura programada a ese número

Para más información, consulta la [guía completa de gestión de blacklist](/guias-practicas/gestion-de-blacklist).

## Gestión de Llamadas Programadas

### Ver Llamadas Programadas

Puedes ver todas las llamadas programadas en la **lista de conversaciones** de cada agente:

1. Navega a **Agentes de Voz** > **\[Nombre del agente]**
2. En la pestaña **Conversaciones**, verás:
   * 📅 Estado: "Programada"
   * ⏰ Fecha y hora de la próxima llamada
   * 📝 Razón del seguimiento (si aplica)

### Cancelar una Llamada Programada

Si necesitas cancelar una llamada antes de que se ejecute:

1. Encuentra la llamada en la lista de conversaciones
2. Haz clic en el menú de acciones (⋮)
3. Selecciona **"Cancelar llamada programada"**
4. Confirma la acción

⚠️ **Nota**: Una vez cancelada, la llamada no se ejecutará automáticamente. Si cambias de opinión, tendrás que programarla manualmente de nuevo.

### Información Mostrada

Para cada llamada programada, el sistema muestra:

* 📅 **Fecha y hora exacta** de ejecución
* 📝 **Razón del seguimiento**: Por qué se programó
* 🎯 **Nivel de confianza**: Qué tan seguro está el sistema
* 🔗 **Llamada original**: Link a la conversación que generó el seguimiento
* 👤 **Contacto**: Información del contacto a llamar

## Casos de Uso Prácticos

### Ejemplo 1: Cliente Ocupado con Fecha Específica

**Conversación:**

```
Agente: "Buenos días, te llamo para presentarte nuestra solución..."
Cliente: "Estoy en una reunión ahora, ¿puedes llamarme mañana a las 3 de la tarde?"
Agente: "Por supuesto, te llamaré mañana a las 3. ¡Que tengas buen día!"
```

**Resultado:**

* ✅ Sistema programa automáticamente llamada para mañana 15:00
* 🟢 Nivel de confianza: **Alto** (fecha y hora específicas)
* 📝 Razón: "Cliente solicitó ser contactado mañana a las 3pm"
* 📋 Contexto incluido para la próxima llamada

***

### Ejemplo 2: Contacto Alternativo (Decisor)

**Conversación:**

```
Agente: "¿Estarías interesado en una demo de nuestra plataforma?"
Cliente: "No soy yo quien decide esto, tienes que hablar con María, 
         la directora comercial. Su número es 675 412 661"
Agente: "Perfecto, contactaré con María. ¿Sabes cuál sería un buen momento?"
Cliente: "Por las mañanas suele estar más disponible"
```

**Resultado:**

* ✅ Sistema detecta número alternativo: **675 412 661**
* 👤 Nombre: **María**
* 💼 Rol: **Directora comercial**
* ⏰ Programa llamada para mañana por la mañana (9-12h)
* 📋 Contexto: "Referido por \[nombre del cliente], quien indicó que María es la decisora"
* 🟢 Nivel de confianza: **Alto**

***

### Ejemplo 3: Interés pero Sin Fecha Específica

**Conversación:**

```
Agente: "¿Te gustaría conocer más sobre cómo podemos ayudarte?"
Cliente: "Suena interesante pero ahora no puedo hablar, llámame la próxima semana"
Agente: "Perfecto, te contactaré la próxima semana. ¡Hasta pronto!"
```

**Resultado:**

* ✅ Sistema programa llamada para **dentro de 7 días**
* 🟡 Nivel de confianza: **Medio** (sin fecha exacta)
* 📝 Razón: "Cliente mostró interés y pidió ser contactado la próxima semana"
* 📋 Resumen de la conversación incluido para continuidad

***

### Ejemplo 4: Buzón de Voz

**Situación:**

```
Agente marca el número → Suena 5 veces → Salta buzón de voz
Sistema detecta: "Mensaje de buzón de voz"
```

**Resultado:**

* 📧 Estado: **Buzón de voz**
* ⏰ Sistema programa reintento automático para **48 horas después**
* 🟠 Nivel de confianza: **Bajo** (no hubo conversación)
* 📝 Razón: "No contestó, llegó a buzón de voz"

***

### Ejemplo 5: No Programar Seguimiento

**Conversación:**

```
Agente: "Te llamo para ofrecerte nuestra solución de..."
Cliente: "No me interesa, por favor no me llamen más"
Agente: "Entendido, disculpa las molestias. Que tengas buen día"
```

**Resultado:**

* ❌ **NO se programa seguimiento**
* 🚫 Número añadido a [blacklist](/guias-practicas/gestion-de-blacklist) automáticamente
* 🔴 Nivel de riesgo: **Alto**
* 📝 Razón: "Cliente solicitó explícitamente no ser contactado"
* ⛔ Cualquier llamada futura a este número será bloqueada

## Mejores Prácticas

### ✅ Hacer

* **Revisar regularmente las llamadas programadas**: Asegúrate de que los seguimientos tienen sentido
* **Configurar horarios apropiados**: Respeta las horas laborales de tus contactos
* **Mantener actualizada la blacklist**: Revisa periódicamente la lista de no llamar
* **Revisar transcripciones**: Analiza las conversaciones para mejorar el prompt del agente
* **Monitorear resultados**: Observa qué tipo de llamadas tienen mejor tasa de éxito
* **Personalizar el prompt**: Ajusta el comportamiento del agente según tu caso de uso
* **Probar antes de escalar**: Realiza pruebas con un grupo pequeño antes de importar miles de contactos

### ❌ Evitar

* **No cancelar seguimientos sin revisar**: Los seguimientos automáticos suelen estar bien fundamentados
* **No ignorar llamadas fallidas repetidamente**: Si un número falla constantemente, investiga por qué
* **No configurar horarios**: Sin horarios configurados, el agente puede llamar en momentos inapropiados
* **No revisar la blacklist**: Números blacklisted deben ser respetados siempre
* **No sobrecargar con llamadas**: Demasiadas llamadas en poco tiempo puede ser contraproducente
* **No usar prompts genéricos**: Personaliza el mensaje para tu audiencia específica

## Limitaciones de la Beta

Como esta funcionalidad está en **fase beta**, ten en cuenta:

* ⚠️ **Disponibilidad limitada**: No todos los clientes tienen acceso aún
* 🔧 **Mejoras continuas**: La detección de IA se está perfeccionando constantemente
* 🐛 **Posibles errores**: Pueden ocurrir falsos positivos/negativos en la detección
* 📊 **Métricas en desarrollo**: Algunas estadísticas aún se están implementando
* 🌍 **Idiomas**: Actualmente optimizado para español, otros idiomas en desarrollo
* 💬 **Feedback bienvenido**: Tus comentarios nos ayudan a mejorar el sistema

### Reportar Problemas

Si encuentras algún problema o tienes sugerencias:

1. 📧 Envía un email a <support@salescaling.com>
2. 💬 Usa el chat en vivo en la plataforma
3. 📝 Describe el problema con el máximo detalle posible
4. 🔗 Incluye el ID de la llamada si es relevante

## Preguntas Frecuentes

<details>

<summary>¿Cómo sé si una llamada está programada?</summary>

En la lista de conversaciones del agente, verás el estado **"Programada"** junto con la fecha y hora de ejecución. También puedes filtrar la lista para ver solo llamadas programadas.

</details>

<details>

<summary>¿Puedo cancelar una llamada programada automáticamente?</summary>

Sí, puedes cancelar cualquier llamada programada desde el menú de acciones (⋮) en la lista de conversaciones. La llamada no se ejecutará y quedará marcada como "Cancelada".

</details>

<details>

<summary>¿Qué pasa si el cliente da un número incorrecto?</summary>

Si el número alternativo proporcionado por el cliente es inválido, el sistema intentará llamar pero fallará. La llamada quedará marcada como "Fallida" y no se programarán más reintentos automáticos a ese número.

</details>

<details>

<summary>¿El sistema respeta los horarios de no llamar?</summary>

Sí, absolutamente. Si configuras un horario de llamadas para tu agente, el sistema **siempre** verificará que sea un momento apropiado antes de ejecutar cualquier llamada. Si no lo es, la llamada se reprograma automáticamente para el próximo slot disponible.

</details>

<details>

<summary>¿Cómo se manejan los números internacionales?</summary>

El sistema normaliza automáticamente los números telefónicos para manejar diferentes formatos (con/sin prefijo internacional, con/sin espacios, etc.). Esto evita duplicados y asegura que la blacklist funcione correctamente.

</details>

<details>

<summary>¿Puedo ver la transcripción de las llamadas?</summary>

Sí, cada llamada completada incluye una transcripción completa de la conversación. Puedes acceder a ella haciendo clic en la llamada desde la lista de conversaciones.

</details>

<details>

<summary>¿Qué pasa si quiero cambiar la fecha de una llamada programada?</summary>

Actualmente, para cambiar la fecha debes cancelar la llamada programada y crear una nueva manualmente con la fecha deseada. Estamos trabajando en una función de reprogramación directa.

</details>

<details>

<summary>¿El agente puede agendar reuniones en mi calendario?</summary>

Sí, si configuras la integración con tu calendario y proporcionas al agente acceso a tu disponibilidad, puede agendar reuniones directamente durante la conversación.

</details>

<details>

<summary>¿Cuántos reintentos automáticos hace el sistema?</summary>

Por defecto, el sistema programa un reintento automático por llamada fallida o buzón de voz. Si el segundo intento también falla, no se programan más reintentos automáticos, pero puedes programar llamadas manualmente si lo deseas.

</details>

<details>

<summary>¿Puedo desactivar los seguimientos automáticos?</summary>

Actualmente los seguimientos automáticos están habilitados por defecto para todos los agentes de voz. Si prefieres gestionar los seguimientos manualmente, puedes cancelar las llamadas programadas automáticamente y crear las tuyas propias.

</details>

<details>

<summary>¿Cómo puedo comprar un número de teléfono para mi agente?</summary>

Para adquirir números de teléfono nacionales o internacionales, debes contactar con nuestro equipo de soporte:

* 📧 Email: <support@salescaling.com>
* 💬 Chat en vivo en la plataforma

Nuestro equipo te ayudará a elegir el número más adecuado según tu ubicación y necesidades. Disponemos de números en múltiples países.

</details>

<details>

<summary>¿Puedo usar mi propio número de teléfono?</summary>

Actualmente, los agentes de voz funcionan con números proporcionados por Salescaling. Si necesitas un número específico o quieres portar tu número existente, contacta con soporte para evaluar las opciones disponibles.

</details>

## Soporte

Si necesitas ayuda con los Agentes de Voz de IA:

* 📧 **Email**: <support@salescaling.com>
* 💬 **Chat en vivo**: Disponible en la plataforma (esquina inferior derecha)
* 📚 **Documentación**: [docs.salescaling.com](https://docs.salescaling.com)
* 🎥 **Tutoriales en video**: Próximamente
* 📞 **Soporte telefónico**: Disponible para clientes enterprise

### Recursos Relacionados

* [Tools (Herramientas) para Agentes de Voz](/guias-practicas/agentes-de-voz-ia/tools-agentes-voz)
* [Gestión de Lista de No Llamar (Blacklist)](/guias-practicas/gestion-de-blacklist)
* [Uso del Bot de Reuniones](/guias-practicas/uso-bot-reuniones)
* [Integraciones de Calendarios](/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas)
* [API de Webhooks](/api/webhooks)

***

**Última actualización**: Diciembre 2024\
**Versión**: Beta 1.0


# Tools (Herramientas) para Agentes de Voz

> ⚠️ **Funcionalidad en Fase Beta**
>
> Las Tools para Agentes de Voz están actualmente en fase beta. Si estás interesado en probar esta funcionalidad, contacta con nuestro equipo de soporte.

## Introducción

Las **Tools** (herramientas) son extensiones que permiten a tus agentes de voz realizar acciones durante las conversaciones, como consultar bases de datos, agendar reuniones, actualizar CRM, verificar disponibilidad de productos, y mucho más.

### Beneficios Principales

* 🔧 **Extensibilidad**: Conecta tu agente con cualquier sistema externo
* 🤖 **Automatización inteligente**: El agente decide cuándo usar cada tool
* 🔄 **Integración en tiempo real**: Obtén datos actualizados durante la conversación
* 🎯 **Personalización**: Crea tools específicas para tu negocio
* 📊 **Trazabilidad**: Registra todas las llamadas a tools para auditoría

## ¿Qué es una Tool?

Una **Tool** es una función que tu agente de voz puede llamar durante una conversación para:

1. **Obtener información** de sistemas externos (bases de datos, APIs, CRM)
2. **Realizar acciones** (crear registros, enviar emails, actualizar datos)
3. **Tomar decisiones** basadas en datos en tiempo real

### Cómo Funciona

```
┌─────────────┐      ┌──────────────┐      ┌─────────────┐
│   Cliente   │ ───> │ Agente de Voz│ ───> │  Tu Webhook │
│   (Llamada) │      │   (Decide)   │      │  (Tool)     │
└─────────────┘      └──────────────┘      └─────────────┘
                            │                      │
                            │  <─── Respuesta ─────┘
                            │
                            ▼
                     Continúa conversación
                     con la información
```

**Flujo detallado:**

1. **El cliente habla**: "¿Tienen disponibilidad para el martes a las 3pm?"
2. **El agente analiza**: Detecta que necesita consultar disponibilidad
3. **Llama a tu tool**: Envía una petición HTTP a tu webhook con los parámetros
4. **Tu sistema responde**: Devuelve la información solicitada
5. **El agente continúa**: "Sí, tenemos disponibilidad el martes a las 3pm. ¿Te gustaría agendar?"

## Tipos de Tools

### Tools de Sistema (SYSTEM)

Son tools predefinidas por Salescaling que están disponibles para todos los agentes:

* 🗓️ **Calendar Scheduler**: Agenda reuniones en calendarios integrados
* 📧 **Email Sender**: Envía emails automáticos
* 📝 **Note Creator**: Crea notas en el CRM

> ℹ️ **Nota**: Las tools de sistema **no pueden ser editadas ni eliminadas**. Solo puedes visualizar su configuración.

### Tools de Usuario (USER)

Son tools personalizadas que tú creas para tu caso de uso específico:

* 🔍 **Consultar disponibilidad de productos**
* 💰 **Verificar precios en tiempo real**
* 👤 **Buscar información de cliente en CRM**
* 📦 **Comprobar estado de pedidos**
* ✅ **Validar códigos promocionales**
* 🎫 **Reservar tickets o servicios**

## Crear una Tool

### Paso 1: Navegar a Tools

1. Ve a **Agentes de Voz** en el menú principal
2. Haz clic en la pestaña **Tools**
3. Haz clic en **"Create tool"**

### Paso 2: Configuración Básica

#### Nombre

El nombre debe ser descriptivo y en inglés (snake\_case):

```
✅ Correcto:
- check_product_availability
- get_customer_info
- schedule_meeting

❌ Incorrecto:
- tool1
- mi herramienta
- Check Product
```

> 💡 **Tip**: El nombre se usa internamente. Usa nombres claros que describan la acción.

#### Descripción

La descripción es **crucial** porque el agente la usa para decidir cuándo llamar a la tool.

```
✅ Buena descripción:
"Verifica la disponibilidad de un producto específico en el inventario.
Devuelve si hay stock, la cantidad disponible y el tiempo estimado de entrega."

❌ Mala descripción:
"Consulta productos"
```

**Mejores prácticas para descripciones:**

* Sé específico sobre qué hace la tool
* Menciona qué información necesita (parámetros)
* Indica qué información devuelve
* Usa un lenguaje claro y directo
* Escribe en español (el agente entiende ambos idiomas)

### Paso 3: Configurar el Webhook

#### URL del Webhook

La URL de tu endpoint que recibirá las llamadas:

```
https://api.tuempresa.com/tools/check-availability
```

**Requisitos:**

* ✅ Debe ser HTTPS (seguro)
* ✅ Debe estar accesible públicamente
* ✅ Debe responder en menos de 10 segundos
* ✅ Debe devolver JSON válido

#### Método HTTP

Selecciona el método apropiado:

* **GET**: Para consultar información sin modificar datos
* **POST**: Para crear o modificar datos (recomendado)
* **PUT**: Para actualizar recursos existentes
* **PATCH**: Para actualizaciones parciales
* **DELETE**: Para eliminar recursos

> 💡 **Recomendación**: Usa POST para la mayoría de tools, ya que permite enviar parámetros complejos en el body.

#### Secret del Webhook (Opcional)

Un secreto que se enviará en el header `X-Webhook-Secret` para autenticar las peticiones:

```
X-Webhook-Secret: tu_secreto_super_seguro_123
```

**Uso recomendado:**

```javascript
// En tu webhook
app.post('/tools/check-availability', (req, res) => {
  const secret = req.headers['x-webhook-secret'];
  
  if (secret !== process.env.WEBHOOK_SECRET) {
    return res.status(401).json({ error: 'Unauthorized' });
  }
  
  // Procesar la petición...
});
```

### Paso 4: Definir Input Schema

El **Input Schema** define qué parámetros enviará el agente a tu webhook.

#### Ejemplo: Tool de Disponibilidad de Productos

**Propiedades del Input Schema:**

| Nombre       | Tipo   | Descripción                      |
| ------------ | ------ | -------------------------------- |
| `product_id` | string | ID del producto a consultar      |
| `quantity`   | number | Cantidad deseada                 |
| `location`   | string | Ubicación del cliente (opcional) |

**Petición que recibirás:**

```json
{
  "product_id": "PROD-12345",
  "quantity": 2,
  "location": "Madrid"
}
```

#### Tipos de Datos Soportados

* **string**: Texto (nombres, IDs, descripciones)
* **number**: Números (cantidades, precios, IDs numéricos)

> ℹ️ **Nota**: Próximamente se añadirán más tipos (boolean, array, object).

#### Mejores Prácticas

* ✅ Usa nombres descriptivos en inglés (snake\_case)
* ✅ Añade descripciones claras a cada propiedad
* ✅ Solo incluye parámetros necesarios
* ✅ Considera qué información puede extraer el agente de la conversación

### Paso 5: Definir Output Schema (Opcional)

El **Output Schema** define qué información devolverá tu webhook al agente.

#### ¿Es Obligatorio?

**No**, pero es **altamente recomendado** porque:

* 📊 Documenta qué devuelve tu tool
* 🤖 Ayuda al agente a entender la respuesta
* 🔍 Facilita el debugging
* ✅ Valida que la respuesta sea correcta

#### Ejemplo: Respuesta de Disponibilidad

**Propiedades del Output Schema:**

| Nombre          | Tipo   | Descripción             |
| --------------- | ------ | ----------------------- |
| `available`     | string | "yes" o "no"            |
| `quantity`      | number | Cantidad disponible     |
| `delivery_days` | number | Días hasta la entrega   |
| `message`       | string | Mensaje para el cliente |

**Respuesta que debes devolver:**

```json
{
  "available": "yes",
  "quantity": 15,
  "delivery_days": 2,
  "message": "Tenemos 15 unidades disponibles con entrega en 2 días"
}
```

## Implementar el Webhook

### Estructura de la Petición

Cuando el agente llama a tu tool, envía una petición con esta estructura:

**Headers:**

```
Content-Type: application/json
X-Webhook-Secret: tu_secreto (si lo configuraste)
User-Agent: Salescaling-VoiceAgent/1.0
```

**Body:**

```json
{
  "tool_name": "check_product_availability",
  "call_id": "call_abc123",
  "agent_id": "agent_xyz789",
  "parameters": {
    "product_id": "PROD-12345",
    "quantity": 2,
    "location": "Madrid"
  },
  "context": {
    "customer_phone": "+34612345678",
    "conversation_id": "conv_456"
  }
}
```

### Ejemplo de Implementación

#### Node.js (Express)

```javascript
const express = require('express');
const app = express();

app.use(express.json());

app.post('/tools/check-availability', async (req, res) => {
  try {
    // 1. Validar el secret
    const secret = req.headers['x-webhook-secret'];
    if (secret !== process.env.WEBHOOK_SECRET) {
      return res.status(401).json({ error: 'Unauthorized' });
    }

    // 2. Extraer parámetros
    const { product_id, quantity, location } = req.body.parameters;

    // 3. Consultar tu base de datos
    const product = await db.products.findOne({ id: product_id });
    
    if (!product) {
      return res.json({
        available: 'no',
        quantity: 0,
        delivery_days: 0,
        message: 'Producto no encontrado'
      });
    }

    // 4. Verificar disponibilidad
    const available = product.stock >= quantity;
    const deliveryDays = calculateDeliveryDays(location);

    // 5. Devolver respuesta
    return res.json({
      available: available ? 'yes' : 'no',
      quantity: product.stock,
      delivery_days: deliveryDays,
      message: available 
        ? `Tenemos ${product.stock} unidades disponibles`
        : `Solo tenemos ${product.stock} unidades disponibles`
    });

  } catch (error) {
    console.error('Error:', error);
    return res.status(500).json({ 
      error: 'Internal server error',
      message: 'No pudimos verificar la disponibilidad'
    });
  }
});

app.listen(3000, () => {
  console.log('Webhook listening on port 3000');
});
```

#### Python (Flask)

```python
from flask import Flask, request, jsonify
import os

app = Flask(__name__)

@app.route('/tools/check-availability', methods=['POST'])
def check_availability():
    try:
        # 1. Validar el secret
        secret = request.headers.get('X-Webhook-Secret')
        if secret != os.getenv('WEBHOOK_SECRET'):
            return jsonify({'error': 'Unauthorized'}), 401

        # 2. Extraer parámetros
        data = request.get_json()
        product_id = data['parameters']['product_id']
        quantity = data['parameters']['quantity']
        location = data['parameters'].get('location', 'España')

        # 3. Consultar base de datos
        product = db.get_product(product_id)
        
        if not product:
            return jsonify({
                'available': 'no',
                'quantity': 0,
                'delivery_days': 0,
                'message': 'Producto no encontrado'
            })

        # 4. Verificar disponibilidad
        available = product['stock'] >= quantity
        delivery_days = calculate_delivery_days(location)

        # 5. Devolver respuesta
        return jsonify({
            'available': 'yes' if available else 'no',
            'quantity': product['stock'],
            'delivery_days': delivery_days,
            'message': f"Tenemos {product['stock']} unidades disponibles"
        })

    except Exception as e:
        print(f'Error: {e}')
        return jsonify({
            'error': 'Internal server error',
            'message': 'No pudimos verificar la disponibilidad'
        }), 500

if __name__ == '__main__':
    app.run(port=3000)
```

### Manejo de Errores

Tu webhook debe manejar errores gracefully:

```javascript
// ✅ Buena práctica
return res.status(200).json({
  available: 'no',
  quantity: 0,
  delivery_days: 0,
  message: 'No pudimos verificar la disponibilidad en este momento. ¿Puedo ayudarte con algo más?'
});

// ❌ Mala práctica
return res.status(500).json({ error: 'Database error' });
// Esto hará que el agente no sepa qué decir al cliente
```

**Regla de oro**: Siempre devuelve un status 200 con un mensaje útil para el cliente, incluso cuando hay errores internos.

## Asignar Tools a Agentes

Una vez creada la tool, debes asignarla a los agentes que la usarán:

### Paso 1: Editar el Agente

1. Ve a **Agentes de Voz** > **Agents**
2. Haz clic en el agente que quieres editar
3. Busca la sección **"Tools"**

### Paso 2: Seleccionar Tools

1. Haz clic en **"Add tool"**
2. Selecciona las tools que quieres habilitar
3. Guarda los cambios

### Paso 3: Actualizar el Prompt (Importante)

Debes **actualizar el prompt del agente** para que sepa cuándo usar cada tool:

```
Eres un asistente de ventas de una tienda de electrónica.

TOOLS DISPONIBLES:
- check_product_availability: Usa esta tool cuando el cliente pregunte 
  si un producto está disponible o cuántas unidades hay en stock.
  
- get_customer_info: Usa esta tool cuando necesites información del 
  cliente (historial de compras, dirección, etc.)

INSTRUCCIONES:
- Cuando el cliente mencione un producto, usa check_product_availability 
  para verificar el stock antes de confirmar.
- Si el cliente es recurrente, usa get_customer_info para personalizar 
  la conversación.
- Siempre confirma la información antes de finalizar la venta.
```

> 💡 **Tip**: Sé explícito sobre cuándo y cómo usar cada tool. El agente seguirá tus instrucciones.

## Ejemplos de Uso

### Ejemplo 1: Verificar Disponibilidad de Producto

**Conversación:**

```
Cliente: "Hola, ¿tienen el iPhone 15 Pro en stock?"
Agente: [Llama a check_product_availability]
Agente: "Sí, tenemos 8 unidades del iPhone 15 Pro disponibles. 
         ¿En qué color lo prefieres?"
```

**Tool Call:**

```json
{
  "tool_name": "check_product_availability",
  "parameters": {
    "product_id": "IPHONE-15-PRO",
    "quantity": 1
  }
}
```

**Respuesta:**

```json
{
  "available": "yes",
  "quantity": 8,
  "delivery_days": 1,
  "message": "Tenemos 8 unidades disponibles con entrega mañana"
}
```

***

### Ejemplo 2: Agendar Reunión

**Conversación:**

```
Cliente: "Me gustaría agendar una demo para el martes a las 3pm"
Agente: [Llama a schedule_meeting]
Agente: "Perfecto, he agendado tu demo para el martes 15 de enero 
         a las 3pm. Te enviaré un email de confirmación."
```

**Tool Call:**

```json
{
  "tool_name": "schedule_meeting",
  "parameters": {
    "date": "2024-01-15",
    "time": "15:00",
    "type": "demo",
    "customer_email": "cliente@example.com"
  }
}
```

**Respuesta:**

```json
{
  "success": "yes",
  "meeting_id": "MTG-789",
  "calendar_link": "https://calendar.google.com/...",
  "message": "Reunión agendada exitosamente"
}
```

***

### Ejemplo 3: Validar Código Promocional

**Conversación:**

```
Cliente: "Tengo un código de descuento: VERANO2024"
Agente: [Llama a validate_promo_code]
Agente: "¡Genial! Tu código VERANO2024 te da un 20% de descuento 
         en toda la tienda. ¿Qué te gustaría comprar?"
```

**Tool Call:**

```json
{
  "tool_name": "validate_promo_code",
  "parameters": {
    "code": "VERANO2024",
    "customer_id": "CUST-456"
  }
}
```

**Respuesta:**

```json
{
  "valid": "yes",
  "discount_percent": 20,
  "expires_at": "2024-08-31",
  "message": "Código válido: 20% de descuento hasta el 31 de agosto"
}
```

## Testing y Debugging

### Probar tu Tool

1. **Crea una llamada de prueba**:
   * Ve a tu agente
   * Haz clic en "Nueva llamada"
   * Usa tu propio número para probar
2. **Menciona el caso de uso**:
   * Di algo que active la tool
   * Ejemplo: "¿Tienen el producto XYZ disponible?"
3. **Revisa los logs**:
   * Ve a la conversación completada
   * Busca la sección "Tool Calls"
   * Verifica la petición y respuesta

### Logs de Tool Calls

Cada llamada a una tool se registra con:

* ⏰ **Timestamp**: Cuándo se llamó
* 📤 **Request**: Qué parámetros se enviaron
* 📥 **Response**: Qué devolvió tu webhook
* ⏱️ **Duration**: Cuánto tardó
* ✅/❌ **Status**: Si fue exitosa o falló

### Debugging Común

#### Error: "Tool call timeout"

**Causa**: Tu webhook tardó más de 10 segundos en responder.

**Solución**:

* Optimiza las consultas a base de datos
* Usa caché para datos frecuentes
* Considera respuestas asíncronas

#### Error: "Invalid JSON response"

**Causa**: Tu webhook no devolvió JSON válido.

**Solución**:

```javascript
// ✅ Correcto
return res.json({ available: 'yes' });

// ❌ Incorrecto
return res.send('yes');
```

#### Error: "Webhook unreachable"

**Causa**: Tu webhook no es accesible públicamente.

**Solución**:

* Verifica que la URL sea correcta
* Asegúrate de que tu servidor esté corriendo
* Comprueba el firewall y reglas de seguridad
* Usa HTTPS, no HTTP

#### El agente no llama a la tool

**Causa**: El prompt no es claro sobre cuándo usar la tool.

**Solución**:

* Actualiza el prompt con instrucciones explícitas
* Menciona la tool por nombre en el prompt
* Da ejemplos de cuándo usarla

## Mejores Prácticas

### ✅ Hacer

* **Respuestas rápidas**: Optimiza para responder en < 2 segundos
* **Mensajes claros**: Devuelve mensajes que el agente pueda usar directamente
* **Manejo de errores**: Siempre devuelve una respuesta útil, incluso en errores
* **Validación**: Valida los parámetros antes de procesarlos
* **Logging**: Registra todas las llamadas para debugging
* **Idempotencia**: Las mismas entradas deben dar las mismas salidas
* **Documentación**: Documenta qué hace cada tool y cómo usarla

### ❌ Evitar

* **Timeouts largos**: No hagas consultas que tarden > 10 segundos
* **Respuestas técnicas**: No devuelvas mensajes de error técnicos
* **Datos sensibles**: No incluyas información confidencial en respuestas
* **Side effects no documentados**: No hagas acciones no descritas en la tool
* **Dependencias externas**: Minimiza llamadas a APIs externas lentas
* **Respuestas ambiguas**: Sé específico en tus respuestas

## Seguridad

### Autenticación

Siempre valida el webhook secret:

```javascript
const secret = req.headers['x-webhook-secret'];
if (secret !== process.env.WEBHOOK_SECRET) {
  return res.status(401).json({ error: 'Unauthorized' });
}
```

### Validación de Datos

Valida todos los parámetros recibidos:

```javascript
const { product_id, quantity } = req.body.parameters;

if (!product_id || typeof product_id !== 'string') {
  return res.json({
    available: 'no',
    message: 'ID de producto inválido'
  });
}

if (!quantity || quantity < 1) {
  return res.json({
    available: 'no',
    message: 'Cantidad inválida'
  });
}
```

### Rate Limiting

Implementa rate limiting para prevenir abuso:

```javascript
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1 minuto
  max: 100 // máximo 100 peticiones por minuto
});

app.use('/tools/', limiter);
```

### HTTPS Obligatorio

Siempre usa HTTPS para tus webhooks:

```
✅ https://api.tuempresa.com/tools/...
❌ http://api.tuempresa.com/tools/...
```

## Limitaciones Actuales

Como esta funcionalidad está en **fase beta**, ten en cuenta:

* ⚠️ **Timeout**: Las tools deben responder en < 10 segundos
* 🔢 **Tipos de datos**: Solo string y number (más tipos próximamente)
* 📊 **Llamadas por conversación**: Máximo 10 tool calls por conversación
* 🌍 **Idiomas**: Optimizado para español e inglés
* 📝 **Schemas complejos**: Arrays y objetos anidados próximamente

## Preguntas Frecuentes

<details>

<summary>¿Cuántas tools puedo crear?</summary>

No hay límite en el número de tools que puedes crear. Sin embargo, recomendamos mantener un número manejable (5-10) para facilitar el mantenimiento.

</details>

<details>

<summary>¿Puedo editar una tool después de crearla?</summary>

Sí, puedes editar cualquier tool de tipo USER. Las tools de tipo SYSTEM no pueden ser editadas.

</details>

<details>

<summary>¿Qué pasa si mi webhook está caído?</summary>

Si tu webhook no responde, el agente continuará la conversación sin la información de la tool y le dirá al cliente que no pudo verificar la información en ese momento.

</details>

<details>

<summary>¿Puedo usar la misma tool en múltiples agentes?</summary>

Sí, puedes asignar la misma tool a múltiples agentes. Esto es útil para tools genéricas como verificación de disponibilidad.

</details>

<details>

<summary>¿Cómo sé cuántas veces se ha llamado a mi tool?</summary>

Puedes ver las estadísticas de uso de cada tool en la página de Tools. También puedes revisar los logs de cada conversación individual.

</details>

<details>

<summary>¿Puedo pasar contexto adicional a mi webhook?</summary>

Sí, cada llamada incluye un objeto `context` con información de la llamada (call\_id, agent\_id, customer\_phone, etc.) que puedes usar para logging o personalización.

</details>

<details>

<summary>¿Qué pasa si devuelvo un formato incorrecto?</summary>

Si tu respuesta no coincide con el output schema definido, el agente intentará interpretar la respuesta de la mejor manera posible. Sin embargo, es recomendable siempre seguir el schema definido.

</details>

<details>

<summary>¿Puedo hacer que una tool llame a otra tool?</summary>

No directamente. Cada tool es independiente. Si necesitas encadenar acciones, debes hacerlo en tu webhook antes de devolver la respuesta.

</details>

<details>

<summary>¿Cómo puedo probar mi webhook localmente?</summary>

Puedes usar herramientas como [ngrok](https://ngrok.com/) para exponer tu servidor local con una URL pública temporal:

```bash
ngrok http 3000
# Usa la URL https://xxxx.ngrok.io en tu tool
```

</details>

<details>

<summary>¿Las tools funcionan en todos los idiomas?</summary>

Sí, las tools funcionan independientemente del idioma del agente. Los parámetros se extraen de la conversación en cualquier idioma soportado.

</details>

## Soporte

Si necesitas ayuda con las Tools:

* 📧 **Email**: <support@salescaling.com>
* 💬 **Chat en vivo**: Disponible en la plataforma
* 📚 **Documentación**: [docs.salescaling.com](https://docs.salescaling.com)
* 🔗 **API Reference**: [API de Webhooks](/api/webhooks)

### Recursos Relacionados

* [Agentes de Voz de IA](/guias-practicas/agentes-de-voz-ia)
* [API de Webhooks](/api/webhooks)
* [Gestión de Blacklist](/guias-practicas/gestion-de-blacklist)

***


# Gestión de Lista de No Llamar

## Introducción

El sistema de blacklist permite gestionar teléfonos que no deben ser contactados, protegiendo tu organización y respetando la voluntad de las personas que solicitan no recibir más llamadas.

## Características Principales

### Detección Automática con IA

El sistema analiza automáticamente todas las conversaciones telefónicas para detectar cuando una persona expresa su voluntad de no ser llamada:

* **Análisis en tiempo real**: Cada llamada completada es analizada por IA
* **Clasificación de riesgo**: Se evalúa la explicitud de la solicitud
* **Detección inteligente**: Identifica amenazas legales, solicitudes educadas o menciones indirectas

### Niveles de Riesgo

#### Alto Riesgo (Rojo)

* Solicitud explícita y directa
* Amenazas legales o menciones de demandas
* Lenguaje fuerte o enojado
* **Acción**: No contactar bajo ninguna circunstancia

#### Riesgo Medio (Naranja)

* Solicitud clara pero educada
* Petición directa de no ser contactado
* **Acción**: Respetar la solicitud inmediatamente

#### Bajo Riesgo (Amarillo)

* Mención indirecta
* Expresión de molestia sin solicitud explícita
* **Acción**: Evaluar caso por caso

## Cómo Funciona

### 1. Detección Automática

Cuando una llamada finaliza:

1. El sistema analiza la transcripción completa
2. La IA detecta si hay una solicitud de no contacto
3. Si se detecta, se crea automáticamente un registro en la blacklist
4. El teléfono queda bloqueado para futuras llamadas

### 2. Marcado Manual

Los usuarios pueden marcar manualmente un teléfono como "No Llamar":

1. Desde el detalle de cualquier llamada
2. Desde la página de gestión de blacklist
3. Proporcionando una razón y nivel de riesgo

## Gestión de la Blacklist

### Ver la Lista

1. Navega a **Configuración** > **Lista de No Llamar**
2. Verás todos los teléfonos bloqueados con:
   * Número de teléfono
   * Razón del bloqueo
   * Nivel de riesgo
   * Método de detección (automático/manual)
   * Fecha de bloqueo

### Agregar Manualmente

1. Haz clic en **"Agregar Teléfono"**
2. Ingresa:
   * Número de teléfono
   * Razón detallada (mínimo 10 caracteres)
   * Nivel de riesgo
3. Haz clic en **"Agregar a Blacklist"**

### Remover de la Lista

⚠️ **Precaución**: Solo remueve teléfonos si estás seguro de que fue un error.

1. Encuentra el teléfono en la lista
2. Haz clic en el ícono de papelera
3. Confirma la acción

## Prevención de Llamadas

### Bloqueo Automático

Cuando intentas crear una llamada a un número blacklisted:

* **Voice Agent Calls**: La llamada no se crea y recibes un error
* **Importación masiva**: Los contactos blacklisted se marcan y no se llaman
* **API pública**: Se retorna un error 400 con mensaje descriptivo

### Indicadores Visuales

Los teléfonos blacklisted se muestran con:

* **Badge rojo**: "No Llamar" en listas de llamadas
* **Alerta visual**: En el detalle de contactos
* **Tooltip informativo**: Con razón y fecha del bloqueo

## Mejores Prácticas

### ✅ Hacer

* **Revisar regularmente** la lista de blacklist
* **Documentar bien** las razones al agregar manualmente
* **Respetar siempre** las solicitudes de alto riesgo
* **Capacitar al equipo** sobre la importancia del sistema

### ❌ Evitar

* **No remover** registros sin investigar primero
* **No ignorar** las alertas de blacklist
* **No llamar manualmente** a números blacklisted
* **No desactivar** el sistema de detección automática

## Casos de Uso

### Ejemplo 1: Detección Automática de Alto Riesgo

**Transcripción:**

```
Agente: "Buenos días, ¿cómo está?"
Cliente: "¡Dejen de llamarme! Si me vuelven a contactar, 
         voy a denunciarlos por acoso. Eliminen mi número 
         de su base de datos AHORA."
```

**Resultado:**

* ✅ Detección automática: Sí
* 🔴 Nivel de riesgo: Alto
* 📝 Razón: "Amenaza legal explícita y solicitud de eliminación"
* 🚫 Acción: Teléfono bloqueado inmediatamente

### Ejemplo 2: Solicitud Educada (Riesgo Medio)

**Transcripción:**

```
Agente: "Le llamo para ofrecerle..."
Cliente: "Disculpe, pero preferiría que no me contacten más. 
         No estoy interesado y no deseo recibir más llamadas."
```

**Resultado:**

* ✅ Detección automática: Sí
* 🟠 Nivel de riesgo: Medio
* 📝 Razón: "Solicitud clara de no contacto"
* 🚫 Acción: Teléfono bloqueado

### Ejemplo 3: No es Blacklist

**Transcripción:**

```
Agente: "¿Le interesa nuestro producto?"
Cliente: "No, gracias. No me interesa en este momento."
```

**Resultado:**

* ❌ Detección automática: No
* ℹ️ Razón: Solo expresó desinterés en el producto, no solicitó no ser contactado
* ✅ Acción: No se bloquea el teléfono

## Integración con Voice Agents

### Configuración

El sistema funciona automáticamente con todos los Voice Agents:

1. Cada llamada completada se analiza
2. La detección ocurre en segundo plano
3. No requiere configuración adicional

### Reintentos Automáticos

Si un Voice Agent intenta llamar a un número blacklisted:

* La llamada se rechaza antes de iniciarse
* Se registra el intento en los logs
* El batch de llamadas continúa con el siguiente contacto

## Cumplimiento Legal

### GDPR y Protección de Datos

El sistema de blacklist ayuda a cumplir con:

* **Derecho al olvido**: Respeta solicitudes de no contacto
* **Consentimiento**: Documenta cuando se retira el consentimiento
* **Transparencia**: Registra razones y fechas de bloqueo

### Recomendaciones Legales

1. **Conservar registros**: Mantén evidencia de las solicitudes
2. **Tiempo de respuesta**: Bloquea inmediatamente tras la solicitud
3. **Documentación**: Registra claramente las razones
4. **Auditoría**: Revisa periódicamente la lista

## Preguntas Frecuentes

### ¿Qué pasa si marco un número por error?

Puedes removerlo de la blacklist desde la página de gestión. Sin embargo, es mejor prevenir errores siendo cuidadoso al marcar manualmente.

### ¿La detección automática puede fallar?

La IA es muy precisa, pero no perfecta. Por eso también existe la opción de marcado manual. Si notas un falso positivo, puedes removerlo.

### ¿Puedo ver qué llamada originó el blacklist?

Sí, cada registro de blacklist incluye un enlace a la llamada originaria (si fue detección automática).

### ¿Se sincronizan los blacklists entre equipos?

Sí, la blacklist es a nivel de organización (tenant). Todos los equipos respetan la misma lista.

### ¿Qué pasa con números internacionales?

El sistema normaliza automáticamente los números telefónicos para evitar duplicados por diferencias de formato.

## Soporte

Si tienes dudas o problemas con el sistema de blacklist:

* 📧 Email: <support@salescaling.com>
* 💬 Chat en vivo: Disponible en la plataforma
* 📚 Documentación: [docs.salescaling.com](https://docs.salescaling.com)


# Voice Notes (Notas de voz)

## Introducción

Las **Voice Notes** permiten capturar notas de audio rápidas fuera de reuniones o llamadas formales: un comentario tras una visita, un recordatorio tras un mensaje o cualquier insight comercial que quieras dejar registrado.

Al guardar una nota, Salescaling:

1. Transcribe el audio
2. Genera un título y un resumen con IA
3. Propone contactos y empresas mencionados en la nota
4. Deja la nota disponible en la bandeja para revisarla, asociarla al CRM y enriquecerla con campos dinámicos

## Acceso

1. En el menú lateral, abre **Voice Notes**.
2. Llegarás a la bandeja en `/voice-notes`, con el listado de notas agrupadas por fecha.

La grabación está disponible para roles de pago. El resto de usuarios puede consultar las notas según sus permisos.

## Grabar una nota

### Desde el ordenador

1. En **Voice Notes**, pulsa **Record Audio**.
2. Concede permiso al micrófono si el navegador lo solicita.
3. Pulsa el botón de grabación y habla con claridad (mejor sin ruido de fondo).
4. Detén la grabación cuando termines.
5. Espera al procesamiento: la plataforma sube el audio y prepara la transcripción.
6. En la pantalla de revisión:
   * Escucha la nota si lo necesitas
   * Confirma los contactos y/o la empresa sugeridos por la IA
   * Si no aparece el correcto, búscalo en el directorio
7. Guarda los cambios para asociar las entidades a la nota.

### Desde el móvil

En pantallas pequeñas verás un botón flotante de micrófono:

1. Púlsalo para empezar a grabar (cápsula de grabación).
2. Detén la grabación cuando termines.
3. La nota se sube en segundo plano; puedes seguir usando la app.
4. Cuando esté lista, se abre la revisión para confirmar contactos y empresa.

## Qué hace la IA tras grabar

| Resultado         | Descripción                                                                                           |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| **Título**        | Nombre corto generado a partir del contenido                                                          |
| **Resumen**       | Puntos clave de la nota                                                                               |
| **Transcripción** | Texto completo, segmentado y sincronizado con el audio                                                |
| **Candidatos**    | Contactos y empresas detectados en la mención; los de alta confianza pueden asociarse automáticamente |

Mientras procesa, la nota puede mostrarse como pendiente o en progreso. Cuando termina, el resumen y la transcripción quedan disponibles en el detalle.

## Explorar la bandeja

La bandeja de Voice Notes funciona de forma similar al explorador de Meetings y Calls.

### Filtros

Puedes filtrar por:

* **Fecha de creación**
* **Usuario** (quién grabó la nota)
* **Empresa** asociada
* **Palabras clave en la transcripción**
* **Favoritos** (bookmarks)

También puedes buscar por nombre de la nota.

### Vistas guardadas

Guarda combinaciones de filtros frecuentes como una **Vista** para recuperarlas con un clic.

### Acciones en cada fila

Desde la lista puedes:

* Abrir el detalle de la nota
* Reproducir el audio
* Asignar o cambiar contactos y empresas
* Gestionar campos dinámicos
* Ver asociaciones CRM (si tienes un CRM conectado)
* Eliminar la nota

Las notas capturadas por WhatsApp se identifican con el icono de WhatsApp.

## Detalle de una nota

Al abrir una nota verás:

### Cabecera

* Título editable
* Fecha, duración y propietario
* Contactos y empresas asignados
* Campos dinámicos
* Asociaciones CRM (si aplica)

### Pestañas

* **Summary**: resumen generado por la IA
* **Transcription**: transcripción sincronizada con el reproductor de audio

### Asignaciones

Puedes asociar o corregir en cualquier momento:

* Uno o varios **contactos**
* Una o varias **empresas**
* **Oportunidades** y otras entidades CRM cuando la integración está activa

Esto mantiene la nota enlazada a tu pipeline y facilita el seguimiento comercial.

## Buenas prácticas

* Habla cerca del micrófono y evita ruido de fondo.
* Menciona de forma clara el nombre del contacto o de la empresa si quieres que la IA los detecte.
* Revisa y confirma las sugerencias tras grabar; así evitas asociaciones incorrectas.
* Usa favoritos y vistas guardadas para las notas que revisas a menudo (coaching, follow-ups, etc.).
* Completa los campos dinámicos relevantes para que el equipo tenga el mismo contexto.

## Preguntas frecuentes

### ¿Cuánto tarda el procesamiento?

Depende de la duración del audio. Suele completarse en unos segundos. Mientras tanto, la nota aparece en la bandeja con estado de procesamiento.

### ¿Puedo editar el título o las asociaciones después?

Sí. El título es editable desde el detalle, y puedes cambiar contactos, empresas y asociaciones CRM en cualquier momento.

### ¿Quién puede ver mis notas?

La visibilidad sigue los permisos y el acceso por equipo/organización de tu cuenta, igual que el resto de actividades en Salescaling.

### ¿Las Voice Notes sustituyen a Meetings o Calls?

No. Complementan esas actividades para momentos en los que no hay una reunión o llamada grabada, pero sí información comercial que conviene conservar.


# Coaching y Formación

La sección de Coaching y Formación transforma las conversaciones en material **educativo** y **accionable** para el equipo. Permite identificar los momentos más impactantes de cualquier reunión, guardarlos, organizarlos y compartirlos para elevar el rendimiento de los vendedores.

### **1. Crear y Gestionar Clips**

Los *Clips* son fragmentos cortos y específicos de las grabaciones que capturan momentos clave: un buen manejo de objeciones, una excelente apertura, una pregunta poderosa o un error común. Son la base para un coaching basado en evidencia.

<figure><img src="/files/rIiCXevBqhdmfNLpKxSF" alt="" width="471"><figcaption></figcaption></figure>

### La **Clip Library** (Biblioteca de Clips)

Esta [biblioteca](https://app.salescaling.com/clips) es el explorador central donde se almacenan todos los clips generados, ya sean creados por la IA automáticamente o manualmente por el usuario.

<figure><img src="/files/UIeYlDlf5shVsnWaNgyW" alt=""><figcaption></figcaption></figure>

* **Búsqueda y Filtros**: Ofrece una potente barra de herramientas para localizar clips con precisión usando criterios como **Fecha,Empresa, Smart Category** (categorías inteligentes de la IA) y **Activity channel** (fuente de la grabación).
* **Creación Rápida**: Es posible crear un clip directamente desde la **Vista de Detalle** de cualquier grabación, seleccionando el fragmento deseado.
* **Gestión Individual**:
  * El menú de tres puntos (...) al final de la fila de cada clip **permite copiar el enlace** para compartirlo de forma individual o **eliminar el clip** de la biblioteca.
* **Agrupar en Playlists**: El botón principal **+Add to playlist** permite seleccionar uno o varios clips y añadirlos rápidamente a una playlist existente o crear una nueva.

### **2. Crear y Organizar Playlists**

[**Las Playlists**](https://app.salescaling.com/playlists) son la herramienta más poderosa para el coaching y la formación. Permiten agrupar clips en colecciones temáticas y estructuradas, facilitando la creación de módulos de aprendizaje o el análisis comparativo.

<figure><img src="/files/kl0LcVC8ShEpRd838E5W" alt=""><figcaption></figcaption></figure>

#### La Biblioteca de Playlists

Desde esta sección es posible crear nuevas playlists **(+New Playlist)** y gestionar las existentes.

* **Edición y Organización**: Al hacer clic en una playlist, se pueden realizar las siguientes acciones:
  * **Añadir más clips** en cualquier momento.
  * **Reordenar los clips** arrastrándolos para estructurar tu contenido.
  * **Compartir** la playlist completa con el equipo o con terceros.
  * **Eliminar** la playlist si ya no la necesitas.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Los clips creados por la IA son diferentes de los que creo manualmente?</summary>

No, una vez creados, todos los ***clips*** funcionan de la misma manera en tu biblioteca y pueden ser añadidos a playlists. La diferencia principal es su origen: unos son generados automáticamente por la **IA** al detectar momentos clave, y otros los defines tú.

</details>

<details>

<summary>Si elimino un clip, ¿se borra también la grabación original de la que proviene?</summary>

No. Eliminar un clip solo lo quita de tu **Clip Library** y de cualquier **Playlist** donde estuviera. La grabación original completa permanece intacta y disponible en tu **Explorador de Grabaciones**.

</details>

<details>

<summary>¿Puedo compartir un clip o una playlist con alguien que no usa <strong>Salescaling</strong>?</summary>

Sí, puedes compartir clips y playlists generando un "enlace público" (*shareable link*). Cualquier persona que tenga ese enlace podrá ver el contenido sin necesidad de tener una cuenta en **Salescaling**.

</details>


# Analítica y reportes

Usa el dashboard global y las analíticas por grabación para medir rendimiento, calidad de conversaciones y dinámica del equipo comercial.

## 1.Dashboard Global de Analytics

El Dashboard Global de Analytics es el **centro de inteligencia** de negocio de la plataforma. Ofrece una visión "**macro**" del rendimiento de todo el equipo a lo largo del tiempo, permitiendo identificar patrones, medir el impacto de la formación y tomar decisiones estratégicas basadas en datos agregados.

Es posible filtrar toda la información del dashboard porperiodos de tiemp&#x6F;**,** [**Activity Type**](/configuraciones-de-la-plataforma/configuracion-de-la-ia/tipos-de-actividad) y Activity Channe&#x6C;**.**

El **dashboard** se divide en dos pestañas principales:

### 1.1 Mide el Volumen y la Calidad de tu Actividad

Esta sección se centra en el volumen y la calidad general de las interacciones de tu equipo.

* Métricas Clave:
  * **Total Meetings:** El número total de reuniones grabadas en el periodo.
  * **Average Meeting Time:** La duración media de las reuniones.
  * **Average AI Score:** La puntuación de calidad media de todas las reuniones analizadas.

{% hint style="info" %}
Fíjate en el **Average AI Score**. Si este número baja, puede ser un indicador temprano de que el equipo necesita un refuerzo en vuestra metodología de ventas.
{% endhint %}

* Gráficos:
  * **Activities by Activity Type:** Un desglose visual del número de reuniones por cada tipo.
  * **Smart Categories:** Análisis basado en categorías temáticas inteligentes.

### 1.2 Analiza la Dinámica de tus Conversaciones

<figure><img src="/files/QcWgLkzzV7AiCNaMS10I" alt=""><figcaption></figcaption></figure>

Esta sección analiza qué ocurre dentro de las conversaciones y las dinámicas entre los participantes.

* **Métricas Clave:**
  * **Total Questions:** El número total de preguntas detectadas.
  * **Total Speaking Time:** La suma de todo el tiempo hablado.
  * **Spoken vs Silence Time:** La proporción de tiempo que se dedica a hablar frente a los silencios.
* **Gráficos:**
  * **Most Used Keywords:** Identifica los temas más recurrentes en las conversaciones.
  * **Top Speakers:** Muestra qué usuarios son los que más tiempo hablan.

{% hint style="info" %}
El gráfico **Top Speakers** es muy útil para analizar si los comerciales están hablando demasiado y escuchando poco. Una buena conversación de ventas suele tener un tiempo de habla repartido.
{% endhint %}

## 2. Analíticas de una Sola Grabación

A diferencia del Dashboard Global, **Salescaling** ofrece una vista **"micro"** de analíticas detalladas dentro de cada grabación individual. Estas métricas se encuentran en la **Vista de Detalle** de cualquier reunión o llamada, dentro de la pestaña [Analytics](https://app.salescaling.com/analytics). Permiten entender la dinámica y el ritmo de una conversación específica.

<figure><img src="/files/9spfBjh6DH4Z72FlYHCr" alt=""><figcaption></figcaption></figure>

### 2.1 ¿Quién Llevó la Voz Cantante?

Esta tabla desglosa la contribución de cada persona en la conversación, permitiendo ver de un vistazo quién lideró el diálogo.

* **Time talking / Average time %:** Muestra el tiempo total y el porcentaje de tiempo que habló cada participante.
* **Longest Monologue:** Identifica el monólogo (intervención ininterrumpida) más largo de cada persona, útil para detectar si alguien está dominando demasiado la conversación.
* **Interventions:** Mide el número de veces que cada persona intervino, lo que puede indicar el nivel de interacción.

### 2.2 Línea de Tiempo Visual de Participación

Este gráfico complementa la tabla anterior, mostrando visualmente cuándo habló cada participante a lo largo de la línea de tiempo de la grabación. Las barras verdes representan los momentos de habla.

### 2.3 Número Total de Preguntas

La IA cuenta el número total de preguntas detectadas en la conversación. Para ver el texto de cada pregunta, se puede ir a la pestaña **Questions** de la transcripción.

\\


# Colaboración y Compartir Contenido

Compartir grabaciones es fundamental para la colaboración, el coaching y para mantener a todo el equipo alineado. **Salescaling** ofrece **opciones para compartir** flexibles y potentes, tanto para grabaciones individuales como para colecciones de clips (Playlists).

{% hint style="info" %}
Se recomienda usar la **invitación directa** para contenido sensible o colaboración interna, ya que ofrece un control total sobre los permisos. El enlace público es ideal para compartir momentos clave con personas externas que no necesitan una cuenta para visualizar el contenido.
{% endhint %}

### **1.Compartir Grabaciones**

Es posible compartir cualquier grabación individual directamente desde el Explorador de Grabaciones.

Pasos para compartir:

1. **Localice** la grabación que se desea compartir en la lista de [**Meetings**](https://app.salescaling.com/meetings) o [**Calls**](https://app.salescaling.com/calls).
2. Haga clic en el menú de tres puntos **(...)** al final de la fila.
3. Seleccione la opción **Share**.

Se abrirá una ventana con dos formas de compartir:

<figure><img src="/files/qai91iD9yuvnLwuzk5ZD" alt="" width="375"><figcaption></figcaption></figure>

**Invitar a Usuarios o Equipos Específicos:** Permite buscar y añadir a miembros de la organización. Es posible [asignarles un rol específico](/primeros-pasos/roles-permisos):

* **Owner (Propietario):** Otorga control total sobre la grabación compartida.
* **Viewer (Espectador):** Permite solo la visualización de la grabación y sus análisis.

**Compartir Mediante un Enlace Público (Shareable Link):** Al activar esta opción, se genera un enlace único que puede ser copiado. Cualquier persona que reciba este enlace podrá ver el contenido, incluso sin tener una cuenta de **Salescaling**. El acceso se puede revocar en cualquier momento desactivando esta misma opción.

{% hint style="info" %}
Usa la **invitación directa** a usuarios para compartir contenido sensible o para colaborar con miembros de tu equipo, ya que te da un control total sobre quién accede y con qué permisos.
{% endhint %}

{% hint style="info" %}
Usa el **enlace público** para compartir rápidamente momentos clave con personas externas (como un cliente), sobre todo cuando no quieres que necesiten crearse una cuenta para verlo. Recuerda siempre desactivar el enlace cuando ya no sea necesario.
{% endhint %}

### 2.Compartir Playlists

**Compartir Playlists** es el método recomendado para distribuir materiales de formación, ejemplos de buenas prácticas o resúmenes de proyectos.

* Pasos para compartir:
  1. Navegue a la sección de [**Playlists**](https://app.salescaling.com/playlists) y haga clic en la que se desea compartir.
  2. En la vista de detalle, haga clic en el botón **Share Playlist**.

<figure><img src="/files/0LbDUff7CIdFa0UoHaJn" alt=""><figcaption></figcaption></figure>

### 3. Descargar Reuniones

{% hint style="info" %}
Esta funcionalidad está disponible para algunos clientes. Si deseas activarla para tu organización, contacta con nuestro equipo de soporte.
{% endhint %}

Puedes descargar el video completo de tus reuniones en formato MP4 directamente desde la plataforma.

**Pasos para descargar:**

1. Abre la reunión que deseas descargar
2. Haz clic en el menú de tres puntos **(...)** en la esquina superior derecha
3. Selecciona **Download video**
4. El archivo se descargará automáticamente

**Requisitos:**

* La reunión debe estar completamente procesada
* La reunión no puede estar marcada como privada
* No haber alcanzado el límite mensual de descargas de tu organización

{% hint style="warning" %}
Las reuniones privadas no se pueden descargar. Si necesitas descargar una reunión privada, primero cámbiala a pública desde la configuración de la reunión.
{% endhint %}

<details>

<summary>¿Puedo descargar la misma reunión varias veces?</summary>

Sí, pero cada descarga cuenta para el límite mensual de tu organización.

</details>

<details>

<summary>¿El límite de descargas es por usuario o por organización?</summary>

El límite es por organización. Todas las descargas realizadas por cualquier usuario cuentan hacia el mismo límite mensual.

</details>

<details>

<summary>¿Qué hago si no veo la opción de descarga?</summary>

La funcionalidad puede no estar activada para tu organización. Contacta con nuestro equipo de soporte para solicitar su activación.

</details>

<details>

<summary>¿Qué hago si he alcanzado el límite mensual?</summary>

Puedes esperar al inicio del próximo mes cuando se reinicia el límite, o contactar con soporte para solicitar un aumento en tu límite mensual.

</details>


# Integraciones

El verdadero potencial de **Salescaling** se desbloquea al conectarlo con las herramientas de uso diario de la organización. Esta sección proporciona guías paso a paso para integrar la plataforma con aplicaciones de calendario, **CRM y telefonía.**

Una correcta configuración de las integraciones es el primer paso para automatizar la captura y el análisis de las conversaciones comerciales.

Explora las siguientes guías para empezar:

* [Conectar Calendarios y Videollamadas](/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas).
* [Conectar tu CRM](/configuraciones-de-la-plataforma/integraciones/conectar-tu-crm).
* [Conectar Plataforma de llamadas](/configuraciones-de-la-plataforma/integraciones/conectar-plataformas-de-llamadas).

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Necesito tener permisos de administrador para conectar las integraciones?</summary>

Sí, para la mayoría de las integraciones que afectan a toda la organización, como la conexión con el Calendario, el CRM o las plataformas de llamadas, necesitarás tener un rol de Administrador en Salescaling para poder configurarlas.

</details>


# Conectar Calendarios y Vídeollamadas

Conectar tus herramientas de calendario y videollamada es el primer y más importante paso para automatizar la grabación y el análisis de tus conversaciones en Salescaling.

### 1. Conexión del Calendario

Esta es la integración fundamental para que el bot de Salescaling funcione de forma automática.

* Cómo funciona: Debes conectar la cuenta de calendario que utilices, ya sea de Google o de Microsoft. Para ello, simplemente haz clic en Connect y autoriza a Salescaling para que acceda a tu calendario.
* Beneficio principal: Una vez conectado, Salescaling leerá los eventos de tu calendario y programará al bot para que solicite unirse a ellos automáticamente.

**¿Qué calendarios se sincronizan?**

Salescaling sincroniza automáticamente todos los calendarios de los que eres propietario:

* ✅ **Calendario principal**: Tu calendario principal (Google/Outlook)
* ✅ **Calendarios secundarios**: Cualquier calendario adicional que hayas creado
* ❌ **Calendarios compartidos**: Calendarios compartidos por otros usuarios
* ❌ **Calendarios de solo lectura**: Calendarios de terceros con permisos limitados

> **Nota importante**: Si necesitas sincronizar eventos de calendarios compartidos, cada usuario debe conectar su propia cuenta a Salescaling.

Nota Importante: ¡Debes admitir al Bot en la Reunión! Aunque la conexión del calendario automatiza la llegada del bot a tu reunión, recuerda que, al igual que cualquier otro invitado, el bot de Salescaling aparecerá en la "sala de espera" o "lobby" de tu videollamada. El anfitrión de la reunión deberá admitirlo manualmente para que pueda entrar y comenzar a grabar.

<figure><img src="/files/DCMjht2NLXfMkPJcklO0" alt=""><figcaption></figcaption></figure>

### 2. Plataformas de Videollamada Soportadas

**Salescaling** es compatible con las principales plataformas del mercado:

* **Google Meet y Microsoft Teams:** Estas plataformas suelen estar soportadas de forma nativa.
* **Zoom:** Para un funcionamiento óptimo, se recomienda realizar una conexión directa haciendo clic en el botón Connect.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>Si no conecto mi calendario, ¿puedo seguir usando Salescaling?</summary>

Sí, pero perderás la principal ventaja de la automatización. Si no conectas tu calendario, tienes dos opciones para analizar reuniones: añadir reuniones manualmente a través del [**Bot Manager**](https://app.salescaling.com/bot-manager) o subir las grabaciones una vez que han terminado.

</details>

<details>

<summary>¿Se sincronizan los calendarios compartidos por mis colegas?</summary>

**No**. Salescaling solo sincroniza calendarios de los que eres propietario directo. Los calendarios compartidos por otros usuarios no se importan automáticamente.

**Soluciones**:

* Cada usuario debe conectar su propia cuenta de calendario a Salescaling
* Los eventos de calendarios compartidos aparecerán cuando el propietario del calendario conecte su cuenta
* Puedes usar el Bot Manager para añadir reuniones manualmente si es necesario

</details>

<details>

<summary>¿Con qué frecuencia se actualiza la sincronización de calendarios?</summary>

La sincronización es **automática y continua**:

* **Ventana de sincronización**: Se importan eventos del próximo mes (30 días)
* **Actualización diaria**: Cada día se actualiza la ventana de 30 días
* **Sincronización en tiempo real**: Los cambios en tu calendario se reflejan automáticamente

No necesitas hacer nada manual para mantener la sincronización activa.

</details>


# Google (Calendar y Meet)

Conecta Google Calendar y Google Meet con Salescaling para grabar y analizar reuniones automáticamente.

Conectar tu cuenta de **Google** es la forma más sencilla y potente de automatizar la grabación de tus videollamadas en **Salescaling**. Esta guía te explica cómo hacerlo.

### 1. Conectar tu Google Calendar

Este es el paso esencial para que el bot de **Salescaling** pueda identificar tus reuniones y unirse a ellas automáticamente.

* Pasos para la Conexión:
  1. Dirígete a **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
  2. En la sección Calendar, busca la tarjeta de Google y haz clic en Connect.
  3. Serás **redirigido** a una página de inicio de sesión de **Google**, donde deberás elegir tu cuenta y conceder los permisos necesarios a **Salescaling**.
  4. Una vez autorizado, volverás a **Salescaling** y la tarjeta de **Google Calendar** mostrará un tick verde y el botón Disconnect.

**Beneficio Principal y Funcionamiento Automático:**

Al completar esta conexión, **Salescaling** comenzará a sincronizar los eventos de tu calendario para que aparezcan automáticamente en tu **Bot Manager.**

La sincronización funciona de la siguiente manera:

* **Ventana de Sincronización**: La plataforma importa automáticamente todas las reuniones programadas para el **próximo mes (30 días)**.
* **Actualización Continua**: Cada día, este proceso se repite, manteniendo siempre una ventana de un mes vista. De esta forma, el **Bot Manager** siempre estará actualizado con tus próximos eventos sin que tengas que hacer nada.

### ¿Qué calendarios se sincronizan?

**Salescaling** sincroniza automáticamente todos los calendarios de los que eres propietario:

* ✅ **Calendario principal**: Tu calendario principal de Google
* ✅ **Calendarios secundarios**: Cualquier calendario adicional que hayas creado
* ❌ **Calendarios compartidos**: Calendarios compartidos por otros usuarios (no se sincronizan)
* ❌ **Calendarios de solo lectura**: Calendarios de terceros con permisos limitados

> **Nota importante**: Si necesitas sincronizar eventos de calendarios compartidos, cada usuario debe conectar su propia cuenta de Google a Salescaling.

### 2. Soporte para Google Meet

Como puedes ver en la sección **Video Calls, Google Meet** aparece con un tick verde por defecto. Esto significa que está listo para usar sin necesidad de una configuración de integración adicional de un calendario.

Una vez que has conectado tu **Google Calendar**, el bot podrá unirse automáticamente a las reuniones de Google Meet que encuentre. Alternativamente, también puedes hacer que el bot se una a una reunión de Google Meet de dos formas:

1. Usando la opción **Record Meeting** dentro de la plataforma **Salescaling**.
2. Utilizando la **extensión** de navegador de **Salescaling** directamente desde Google Meet.

> Para saber más: *Consulta nuestra guía sobre* [*cómo usar la Extensión de Navegador de Salescaling*](https://app.gitbook.com/o/6VLf27xiEWrRDMXUUrGY/s/wlqjdbsSjPxjbXypmcqu/~/changes/15/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas/extension) *para grabar reuniones al instante.*

#### Enlaces de Google Meet permitidos

Para que el bot de Salescaling pueda unirse correctamente a tus reuniones de Google Meet, el enlace debe seguir el formato estándar de Google Meet:

**✅ Enlaces válidos:**

* `https://meet.google.com/abc-defg-hij`
* `http://meet.google.com/abc-defg-hij`
* `meet.google.com/abc-defg-hij`
* `https://meet.google.com/abc-defg-hij?authuser=0&hs=179`

**❌ Enlaces no válidos:**

* Enlaces de Google Calendar que no sean específicos de Meet
* Enlaces de otras plataformas de videollamada
* Enlaces que no contengan el dominio `meet.google.com`

> **Consejo**: Cuando crees un evento en Google Calendar, asegúrate de que la opción "Añadir videollamada de Google Meet" esté activada para generar automáticamente el enlace correcto.

{% hint style="info" %}
Nota Importante: ¡No te olvides de admitir al **Bot**! Recuerda que, aunque el proceso sea automático, el bot aparecerá en la "sala de espera" de tu Google Meet. El anfitrión de la reunión deberá admitirlo manualmente para que pueda entrar y grabar.
{% endhint %}

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Qué permisos exactos estoy dando a Salescaling al conectar mi cuenta de Google?</summary>

Al autorizar la conexión, das permiso a **Salescaling** para:

* **Leer eventos de calendario**: Título, descripción, fecha/hora, participantes
* **Acceder a enlaces de videollamada**: Enlaces de Google Meet, Teams y Zoom en los eventos
* **Sincronizar automáticamente**: Importar eventos del próximo mes (30 días)

**Permisos técnicos solicitados**: `https://www.googleapis.com/auth/calendar` (solo lectura de calendarios)

**Lo que NO accede Salescaling**:

* ❌ Correos electrónicos personales
* ❌ Notas privadas de eventos
* ❌ Archivos adjuntos
* ❌ Otros datos de Google Workspace

</details>

<details>

<summary>¿Se sincronizan mis calendarios compartidos o de otros usuarios?</summary>

**No**. Salescaling solo sincroniza calendarios de los que eres propietario directo:

* ✅ Tu calendario principal
* ✅ Calendarios secundarios que hayas creado
* ❌ Calendarios compartidos por colegas
* ❌ Calendarios de solo lectura de terceros

Si necesitas sincronizar eventos de calendarios compartidos, cada usuario debe conectar su propia cuenta de Google.

</details>

<details>

<summary>¿Qué pasa si tengo múltiples calendarios en mi cuenta de Google?</summary>

**Todos tus calendarios propios se sincronizan automáticamente**. No necesitas configurar nada adicional:

* Tu calendario principal aparecerá inmediatamente
* Cualquier calendario secundario que hayas creado también se sincronizará
* Puedes filtrar por calendario específico en el Bot Manager si es necesario

</details>

<details>

<summary>¿Con qué frecuencia se actualiza la sincronización?</summary>

La sincronización es **automática y continua**:

* **Importación inicial**: Al conectar, se importan eventos del próximo mes
* **Actualización diaria**: Cada día se actualiza la ventana de 30 días
* **Sincronización en tiempo real**: Los cambios en tu calendario se reflejan automáticamente

No necesitas hacer nada manual para mantener la sincronización activa.

</details>


# Microsoft (Calendar y Teams)

Conecta Microsoft Calendar y Teams con Salescaling para grabar y analizar reuniones de tu equipo comercial.

Conectar tu cuenta de **Microsoft (Outlook/Office 365)** es la forma más sencilla de automatizar la grabación de tus videollamadas de Teams en Salescaling.

### 1. Conectar tu Calendario de Microsoft

Este es el paso esencial para que el bot de **Salescaling** pueda identificar tus reuniones y unirse a ellas automáticamente.

* Pasos para la **Conexión**:
  1. Dirígete a **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
  2. En la sección **Calendar**, busca la tarjeta de **Microsoft** y haz clic en **Connect**.
  3. Serás redirigido a una página de inicio de sesión de **Microsoft**, donde deberás introducir tu **email** o teléfono y seguir los pasos para autorizar a **Salescaling**.
  4. Una vez autorizado, volverás a **Salescaling** y la tarjeta de **Microsoft** **Calendar** mostrará el estado "**Conectado**".
* **Beneficio Principal**: Al completar esta conexión, todas las reuniones de tu calendario de Microsoft aparecerán automáticamente en tu **Bot Manager**.

**Funcionamiento de la Sincronización:**

* **Ventana de Sincronización**: La plataforma importa automáticamente todas las reuniones programadas para el **próximo mes (30 días)**.
* **Actualización Continua**: Cada día, este proceso se repite, manteniendo siempre una ventana de un mes vista. De esta forma, el **Bot Manager** siempre estará actualizado con tus próximos eventos sin que tengas que hacer nada.

### ¿Qué calendarios se sincronizan?

**Salescaling** sincroniza automáticamente todos los calendarios de los que eres propietario:

* ✅ **Calendario principal**: Tu calendario principal de Outlook/Office 365
* ✅ **Calendarios secundarios**: Cualquier calendario adicional que hayas creado
* ❌ **Calendarios compartidos**: Calendarios compartidos por otros usuarios (no se sincronizan)
* ❌ **Calendarios de solo lectura**: Calendarios de terceros con permisos limitados

> **Nota importante**: Si necesitas sincronizar eventos de calendarios compartidos, cada usuario debe conectar su propia cuenta de Microsoft a Salescaling.

### 2. Soporte para Microsoft Teams

La sección **Video Calls** muestra la integración de **Microsoft Teams** con un tick verde por defecto. Esto significa que está lista para usar sin necesidad de una configuración de integración adicional.

Una vez que el calendario de Microsoft ha sido conectado, el bot de **Salescaling** podrá identificar y unirse automáticamente a las reuniones de Microsoft Teams que encuentre en los eventos. Adicionalmente, es posible hacer que el bot se una a una reunión de Teams de forma manual:

1. Usando la opción Record Meeting dentro de la plataforma **Salescaling**.
2. Utilizando la extensión de navegador de **Salescaling** directamente desde Microsoft Teams.

> Para saber más: *Se puede consultar la guía sobre* [*cómo usar la Extensión de Navegador de Salescaling*](https://app.gitbook.com/o/6VLf27xiEWrRDMXUUrGY/s/wlqjdbsSjPxjbXypmcqu/~/changes/15/configuraciones-de-la-plataforma/integraciones/conectar-calendarios-y-videollamadas/extension) *para grabar reuniones al instante.*

#### Enlaces de Microsoft Teams permitidos

Para que el bot de Salescaling pueda unirse correctamente a tus reuniones de Microsoft Teams, el enlace debe seguir el formato estándar de Teams:

**✅ Enlaces válidos:**

* `https://teams.microsoft.com/l/meetup-join/abc123`
* `https://teams.microsoft.com/meet/abc123`
* `https://company.teams.microsoft.com/l/meetup-join/abc123`
* `https://teams.microsoft.com/l/meetup-join/abc123/def456`

**❌ Enlaces no válidos:**

* Enlaces de Outlook Calendar que no sean específicos de Teams
* Enlaces de otras plataformas de videollamada
* Enlaces que no contengan el dominio `teams.microsoft.com`
* Enlaces con parámetros adicionales en la URL

> **Consejo**: Cuando crees un evento en Outlook Calendar, asegúrate de que la opción "Añadir videollamada de Microsoft Teams" esté activada para generar automáticamente el enlace correcto.

{% hint style="info" %}
Nota Importante: ¡No te olvides de admitir al Bot! Recuerda que, aunque el proceso sea automático, el bot aparecerá en la "sala de espera" de tu reunión de Teams. El anfitrión de la reunión deberá admitirlo manualmente para que pueda entrar y grabar.
{% endhint %}

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Qué permisos exactos estoy dando a Salescaling al conectar mi cuenta de Microsoft?</summary>

Al autorizar la conexión, das permiso a **Salescaling** para:

* **Leer eventos de calendario**: Título, descripción, fecha/hora, participantes
* **Acceder a enlaces de videollamada**: Enlaces de Microsoft Teams, Google Meet y Zoom en los eventos
* **Sincronizar automáticamente**: Importar eventos del próximo mes (30 días)

**Permisos técnicos solicitados**: `Calendars.Read offline_access` (solo lectura de calendarios)

**Lo que NO accede Salescaling**:

* ❌ Correos electrónicos personales
* ❌ Notas privadas de eventos
* ❌ Archivos adjuntos
* ❌ Otros datos de Microsoft 365

</details>

<details>

<summary>¿Se sincronizan mis calendarios compartidos o de otros usuarios?</summary>

**No**. Salescaling solo sincroniza calendarios de los que eres propietario directo:

* ✅ Tu calendario principal de Outlook
* ✅ Calendarios secundarios que hayas creado
* ❌ Calendarios compartidos por colegas
* ❌ Calendarios de solo lectura de terceros

Si necesitas sincronizar eventos de calendarios compartidos, cada usuario debe conectar su propia cuenta de Microsoft.

</details>

<details>

<summary>¿Qué pasa si tengo múltiples calendarios en mi cuenta de Microsoft?</summary>

**Todos tus calendarios propios se sincronizan automáticamente**. No necesitas configurar nada adicional:

* Tu calendario principal de Outlook aparecerá inmediatamente
* Cualquier calendario secundario que hayas creado también se sincronizará
* Puedes filtrar por calendario específico en el Bot Manager si es necesario

</details>

<details>

<summary>¿Con qué frecuencia se actualiza la sincronización?</summary>

La sincronización es **automática y continua**:

* **Importación inicial**: Al conectar, se importan eventos del próximo mes
* **Actualización diaria**: Cada día se actualiza la ventana de 30 días
* **Sincronización en tiempo real**: Los cambios en tu calendario se reflejan automáticamente

No necesitas hacer nada manual para mantener la sincronización activa.

</details>


# Zoom

Conecta Zoom con Salescaling para grabar, transcribir y analizar tus videollamadas comerciales.

La integración con **Zoom** permite que el bot de **Salescaling** se una a tus videollamadas para grabarlas y analizarlas. Debido a los requisitos específicos de Zoom, es fundamental entender su comportamiento y configurar correctamente tu cuenta para asegurar un funcionamiento sin errores.

Pasos para la Conexión Directa:

Conectar tu cuenta de **Zoom** directamente es altamente recomendado para las reuniones que tú organices.

1. Diríjete a la sección **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
2. En el apartado **Video Calls**, localice la tarjeta de **Zoom** y haga clic en **Connect**.
3. El sistema le redirigirá a la página de inicio de sesión de Zoom para que introduzca sus credenciales y autorice la conexión.

#### Enlaces de Zoom permitidos

Para que el bot de Salescaling pueda unirse correctamente a tus reuniones de Zoom, el enlace debe seguir el formato estándar de Zoom:

**✅ Enlaces válidos:**

* `https://zoom.us/j/123456789`
* `https://zoom.us/w/123456789`
* `https://company.zoom.us/j/123456789`
* `https://zoom.us/j/123456789?pwd=abc123`

**❌ Enlaces no válidos:**

* Enlaces de calendario que no sean específicos de Zoom
* Enlaces de otras plataformas de videollamada
* Enlaces que no contengan el dominio `zoom.us`
* Enlaces que no sigan el formato `/j/` o `/w/` seguido de números

> **Consejo**: Cuando crees un evento en tu calendario, asegúrate de copiar el enlace completo de Zoom que incluye el ID de la reunión (números después de `/j/` o `/w/`).

### Entendiendo el Comportamiento del Bot en Zoom

El comportamiento del **bot** para grabar la reunión depende de quién es el **anfitrión**.

#### Escenario A: Cuando Usted es el Anfitrión de la Reunión

* Si **NO** ha conectado la integración de **Zoom**: El bot le mostrará una ventana emergente solicitando permiso para grabar. Deberá **aceptarla** manualmente en cada reunión.
* Si **SÍ** ha conectado la integración de **Zoom** **(Recomendado)**: El bot comenzará a grabar automáticamente, sin necesidad de que acepte ningún permiso manual.

#### Escenario B: Cuando le Invitan a una Reunión de Zoom Externa

Si se une a una reunión organizada por otra persona (un cliente, un proveedor), el bot siempre necesitará que el anfitrión externo le dé permiso manualmente a través de la ventana emergente que se le mostrará.

### Solución de Problemas y Errores Comunes

Si el bot no graba una reunión de Zoom, la causa suele ser una de las siguientes. Revisa esta lista para solucionar el problema.

#### 1. El Anfitrión no es correcto

Es el error más común. Aunque estuvieras en la llamada, si no iniciaste sesión en la aplicación de Zoom con la cuenta correcta, el bot no puede solicitar el permiso de grabación.

* **Solución**: Asegúrate siempre de haber iniciado sesión en tu aplicación de Zoom antes de entrar a la reunión. Si usas varias cuentas, comprueba que te unes desde la misma con la que creaste el evento.
* **Consejo**: Si usas múltiples cuentas, configura tus otras cuentas como "Anfitrión alternativo" (Alternative Host) en los ajustes del evento en Zoom.

#### 2. La Configuración de Grabación en Zoom

El bot necesita que tu cuenta de Zoom le permita grabar.

* Solución: Ve a tu perfil en Zoom, en la sección **Ajustes > Grabación**, y asegúrate de que estas dos opciones están activadas:

  * **Grabación Local** (Local Recording).
  * La casilla que permite a los participantes solicitar permiso para grabar.

  <figure><img src="/files/15DE5zS6HqUR1mhqsGQR" alt=""><figcaption></figcaption></figure>

#### 3. El Bot no fue Admitido

* Solución: Tus reuniones de Zoom deben tener la **Sala de Espera (Waiting Room)** activada. Cuando el **bot** aparezca en ella, el anfitrión debe admitirlo manualmente en la llamada.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>Conecté la integración de Zoom, pero a veces todavía me pide permiso para grabar. ¿Por qué?</summary>

Esto ocurre cuando te unes a una reunión de la que no eres el anfitrión. En esos casos, el permiso siempre lo debe conceder el anfitrión externo.

</details>

<details>

<summary>El bot se unió a la llamada, pero nunca grabó y no vi ningún pop-up de permiso. ¿Qué ha pasado?</summary>

Casi con total seguridad, se debe a que no estabas correctamente logueado en tu aplicación de **Zoom** al unirte, por lo que el sistema no te reconoció como el anfitrión. Cierra sesión y vuelve a iniciarla en tu app de Zoom antes de tu próxima reunión.

</details>


# La Extensión de Navegador para Chrome

La extensión de **Salescaling** para **Google Chrome** ofrece una forma rápida y cómoda de iniciar grabaciones directamente desde el navegador, sin necesidad de tener la plataforma de **Salescaling** abierta.

### 1. Instalación

* Paso 1: Visite la página oficial de la extensión en la Chrome Web Store.

  Enlace: [Salescaling en la Chrome Web Store](https://chromewebstore.google.com/detail/salescaling/kldkpapbgcemaejcgfddapchihndohgo).
* Paso 2: Haga clic en el botón "Añadir a Chrome" (**Add to Chrome**) y confirme la **instalación**.
* Paso 3: Una vez instalada, aparecerá el icono de **Salescaling** en la barra de extensiones de su navegador. Se recomienda fijar el icono para un acceso rápido.

### 2. Cómo Grabar una Nueva Reunión

La función principal de la extensión es iniciar una nueva reunión y hacer que el bot se una a ella al instante.

* **Paso 1**: Haga clic en el icono de la extensión de **Salescaling** en la barra del navegador.
* **Paso 2**: Se desplegará un menú con las plataformas de videollamada soportadas. Seleccione la plataforma que desea utilizar (ej: Google Meet, Zoom o Microsoft Teams).
* **Paso 3**: Al hacer clic, el navegador le redirigirá a la página de esa plataforma para que inicie una nueva reunión.
* **Paso 4**: Una vez que la reunión comience, el bot de Salescaling solicitará unirse automáticamente.
* **Paso 5**: El anfitrión deberá admitir al bot desde la "sala de espera" para que pueda entrar y comenzar a grabar.


# Conectar tu CRM

Conectar tu **CRM** con Salescaling te permite enriquecer tus conversaciones con el contexto de tus clientes y centralizar la información, asegurando que el historial de interacciones esté siempre completo.

### 1. ¿Cómo Conectar tu CRM?

El proceso está diseñado para ser rápido y seguro:

1. Ve a Settings > Integrations.
2. Busca la sección de CRM y localiza el que utiliza tu organización (ej: Hubspot, Salesforce, Zoho, Membrain, Pipedrive).
3. Haz clic en el botón Connect.
4. Serás redirigido a la página de inicio de sesión de tu CRM para que introduzcas tus credenciales y autorices a Salescaling a acceder a tus datos.

Una vez autorizado, la conexión quedará activa.

<figure><img src="/files/5sC95tYBAWyiadP1peUq" alt=""><figcaption></figcaption></figure>

### 2. Beneficio Principal: Asociaciones Automáticas

El principal beneficio de esta integración es potenciar la funcionalidad de Associations (Asociaciones) dentro de tus reuniones. Al conectar tu CRM, Salescaling puede identificar automáticamente a los participantes y vincular la grabación con sus fichas de contacto, empresa y/o negocios correspondientes en tu CRM.

Esto te permite tener una trazabilidad completa de todas las conversaciones relacionadas con un cliente o una oportunidad de venta.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Necesito ser administrador de mi CRM (ej: Hubspot) para poder conectar la integración?</summary>

Sí, generalmente necesitas permisos de administrador en tu cuenta de Hubspot para poder autorizar la conexión de aplicaciones de terceros como Salescaling.

</details>

<details>

<summary>¿Qué CRMs son compatibles con Salescaling?</summary>

Actualmente, Salescaling se integra con Hubspot, Salesforce, Zoho, Membrain y Pipedrive. Puedes ver la lista actualizada en `Settings > Integrations`.

</details>

<details>

<summary>¿Por qué un participante de mi reunión no se "asocia" correctamente con un contacto de mi CRM?</summary>

La causa más común es que el correo electrónico que el participante usó en la invitación de la reunión no coincide exactamente con el correo electrónico que tiene registrado en su ficha de contacto en el CRM. Para asegurar una asociación correcta, verifica que ambos correos sean idénticos.

</details>


# Hubspot

Conecta HubSpot CRM con Salescaling para sincronizar contactos, deals y enriquecer datos comerciales automáticamente tras cada reunión.

La integración con **Hubspot CRM** establece una conexión bidireccional entre las conversaciones analizadas en **Salescaling** y la base de datos de su cliente, permitiendo un flujo de información automatizado que enriquece ambos sistemas.

### 1. Proceso de Conexión

Para activar la funcionalidad, es necesario autorizar a **Salescaling** para que interactúe con su cuenta de Hubspot.

Pasos para la Conexión:

1. **Diríjase** a la sección **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
2. En el apartado de **CRM**, localice la tarjeta de Hubspot y haga clic en **Connect**.
3. El sistema le **redirigirá** a la página de autenticación de Hubspot, donde deberá iniciar sesión y autorizar la conexión.

### 2. Permisos Requeridos en Hubspot

El usuario que realiza la conexión debe tener privilegios de **Super Admin** en Hubspot o, como mínimo, los permisos necesarios para instalar y gestionar aplicaciones del Marketplace.

Durante el proceso de autorización, **Salescaling** solicitará un conjunto de permisos (**scopes**) para poder interactuar de forma segura con los diferentes objetos de su CRM. Estos permisos garantizan que la plataforma solo pueda realizar las acciones necesarias para su funcionamiento.

#### Permisos (**Scopes**) Solicitados:

**Salescaling** solicita permisos de lectura (**.read**) y escritura (**.write**) para los siguientes objetos y esquemas en Hubspot:

* **Companies** (Empresas)
* **Contacts** (Contactos)
* **Custom objects** (Objetos personalizados)
* **Deals** (Negocios)

#### 3. Flujo de Información: De Salescaling hacia Hubspot

El principal beneficio de la integración es la capacidad de **Salescaling** para escribir datos de vuelta en Hubspot. Después de que una reunión es procesada, **Salescaling** crea automáticamente dos nuevas "**Actividades**" distintas en la cronología de los registros correspondientes en Hubspot.

* **Actividad 1:** **Resumen de la Reunión.** La primera actividad contiene un resumen completo de la conversación, incluyendo el **AI Score**, los temas principales tratados, y los próximos pasos acordados, junto a un enlace a la grabación completa en **Salescaling**.
* **Actividad 2:** **Notas por Categoría Inteligente**. La segunda actividad agrupa todas las notas y clips que se han generado durante la reunión, organizados por **Smart Category**. Cada nota incluye su contenido y un enlace directo al clip correspondiente en **Salescaling**. Todas las notas del meeting se consolidan en una sola actividad para mantener la información organizada.

#### 4. Flujo de Información: De Hubspot hacia Salescaling

A su vez, **Salescaling** utiliza los permisos de lectura para potenciar la funcionalidad de **Associations** (Asociaciones). La plataforma lee los datos de su CRM para identificar a los participantes y vincular cada grabación con los registros correctos de Contacts, Companies y Deals, proporcionando un contexto comercial completo sin salir de **Salescaling**.

### 5. Asociaciones en Cascada Automáticas

**Salescaling** implementa un sistema inteligente de **asociaciones en cascada** que garantiza que las reuniones se vinculen automáticamente con todos los registros relacionados en HubSpot:

#### Funcionamiento de las Asociaciones en Cascada:

* **Contacto → Empresa + Negocio**: Cuando una reunión se asocia con un contacto, automáticamente se vincula también con:
  * Todas las empresas asociadas a ese contacto
  * Todos los negocios (deals) asociados a ese contacto
* **Empresa → Negocio**: Cuando una reunión se asocia con una empresa, automáticamente se vincula también con:
  * Todos los negocios (deals) asociados a esa empresa

### 6. Beneficios de la Integración Completa

* **Contexto Comercial Completo**: Cada reunión se asocia automáticamente con todos los registros relacionados
* **Sincronización Automática**: No es necesario vincular manualmente cada asociación
* **Consistencia de Datos**: La información se mantiene sincronizada entre HubSpot y Salescaling
* **Análisis Enriquecido**: Las métricas y análisis incluyen el contexto completo de relaciones comerciales


# Zoho

Conecta Zoho CRM con Salescaling para registrar conversaciones y asociarlas automáticamente al historial de tus clientes.

Conecta **Zoho CRM** con **Salescaling** para asegurar que todas tus conversaciones queden registradas y asociadas con el historial de tus clientes.

## 1. Proceso de Conexión

¿Cómo Conectar tu Cuenta de **Zoho**?

1. Dirígete a **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
2. Busca la tarjeta de **Zoho** y haz clic en **Connect**.
3. Serás redirigido a la página de inicio de sesión de **Zoho** para que autorices la conexión.
4. Una vez autorizado, la integración mostrará el estado "**Conectado**" en **Salescaling**.

## 2. Permisos Requeridos en Zoho

El usuario que realiza la conexión debe tener permisos suficientes para:

* Leer y escribir en módulos **Contacts**, **Accounts** y **Deals**
* Crear y modificar **Events** y **EventRelations**
* Acceder a los datos de asociaciones entre módulos
* Gestionar **Participants** en eventos

## 3. Flujo de Información: De Salescaling hacia Zoho

Después de que una reunión es procesada, **Salescaling** crea automáticamente actividades en Zoho:

* **Eventos de Reunión**: Se crean eventos en Zoho con toda la información de la reunión
* **Resúmenes de Reunión**: Se añaden notas detalladas con el resumen de la conversación
* **Notas Consolidadas**: Todas las notas y clips del meeting se consolidan en una sola actividad, organizadas por categoría inteligente
* **Asociaciones Automáticas**: Se vinculan automáticamente con contactos, cuentas y negocios
* **Participantes**: Se añaden automáticamente los participantes de la reunión

## 4. Flujo de Información: De Zoho hacia Salescaling

**Salescaling** utiliza los permisos de lectura para potenciar la funcionalidad de **Associations** (Asociaciones), vinculando cada grabación con los registros correctos de Contacts, Accounts y Deals.

## 5. Asociaciones en Cascada Automáticas

**Salescaling** implementa un sistema inteligente de **asociaciones en cascada** que garantiza que las reuniones se vinculen automáticamente con todos los registros relacionados en Zoho:

### Funcionamiento de las Asociaciones en Cascada:

* **Contacto → Cuenta + Negocio**: Cuando una reunión se asocia con un contacto, automáticamente se vincula también con:
  * Todas las cuentas (Accounts) asociadas a ese contacto
  * Todos los negocios (Deals) asociados a ese contacto
* **Cuenta → Negocio**: Cuando una reunión se asocia con una cuenta, automáticamente se vincula también con:
  * Todos los negocios (Deals) asociados a esa cuenta

## 6. Beneficios de la Integración Completa

* **Contexto Comercial Completo**: Cada reunión se asocia automáticamente con todos los registros relacionados
* **Sincronización Automática**: No es necesario vincular manualmente cada asociación
* **Consistencia de Datos**: La información se mantiene sincronizada entre Zoho y Salescaling
* **Análisis Enriquecido**: Las métricas y análisis incluyen el contexto completo de relaciones comerciales
* **Gestión de Participantes**: Los participantes se añaden automáticamente a los eventos en Zoho

{% hint style="info" %}
Esta integración alimenta la funcionalidad de **Associations**, vinculando automáticamente cada grabación con las fichas de contacto, empresa y/o negocios correspondientes en **Zoho**, con sincronización bidireccional completa.
{% endhint %}


# Salesforce

Integra Salesforce con Salescaling para vincular reuniones, contactos y oportunidades y mantener el historial comercial centralizado.

Integra tu cuenta de **Salesforce** para vincular tus grabaciones de **Salescaling** con tus oportunidades de venta, contactos y cuentas, manteniendo toda la información de tus clientes centralizada.

## 1. Proceso de Conexión

¿Cómo Conectar tu Cuenta de **Salesforce**?

1. Dirígete a **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
2. Busca la tarjeta de **Salesforce** y haz clic en **Connect**.
3. Serás redirigido a la página de inicio de sesión de **Salesforce** para que introduzcas tus credenciales y autorices la conexión.

## 2. Permisos Requeridos en Salesforce

El usuario que realiza la conexión debe tener permisos suficientes para:

* Leer y escribir en objetos **Contact**, **Account** y **Opportunity**
* Crear y modificar **Events** y **EventRelations**
* Acceder a los datos de asociaciones entre objetos

## 3. Flujo de Información: De Salescaling hacia Salesforce

Después de que una reunión es procesada, **Salescaling** crea automáticamente actividades en Salesforce:

* **Eventos de Reunión**: Se crean eventos en Salesforce con toda la información de la reunión
* **Resúmenes de Reunión**: Se añaden notas detalladas con el resumen de la conversación
* **Notas Consolidadas**: Todas las notas y clips del meeting se consolidan en una sola actividad, organizadas por categoría inteligente
* **Asociaciones Automáticas**: Se vinculan automáticamente con contactos, cuentas y oportunidades

## 4. Flujo de Información: De Salesforce hacia Salescaling

**Salescaling** utiliza los permisos de lectura para potenciar la funcionalidad de **Associations** (Asociaciones), vinculando cada grabación con los registros correctos de Contacts, Accounts y Opportunities.

## 5. Asociaciones en Cascada Automáticas

**Salescaling** implementa un sistema inteligente de **asociaciones en cascada** específicamente optimizado para Salesforce:

### Funcionamiento de las Asociaciones en Cascada:

* **Contacto → Cuenta**: Cuando una reunión se asocia con un contacto, automáticamente se vincula también con:
  * La cuenta (Account) asociada a ese contacto

> **Nota Importante**: En Salesforce, las asociaciones de Contacto a Oportunidad se manejan de forma diferente debido a la estructura compartida del campo `WhatId` entre Account y Opportunity, evitando conflictos de datos.

## 6. Beneficios de la Integración Completa

* **Contexto Comercial Completo**: Cada reunión se asocia automáticamente con todos los registros relacionados
* **Sincronización Automática**: No es necesario vincular manualmente cada asociación
* **Consistencia de Datos**: La información se mantiene sincronizada entre Salesforce y Salescaling
* **Análisis Enriquecido**: Las métricas y análisis incluyen el contexto completo de relaciones comerciales
* **Optimización para Salesforce**: La lógica de cascada está específicamente diseñada para la estructura de datos de Salesforce


# Membrain

Conecta Membrain CRM con Salescaling para sincronizar empresas, contactos, oportunidades y registrar reuniones como actividades.

Conecta **Membrain CRM** con **Salescaling** para importar empresas, contactos y oportunidades, mantener los datos sincronizados de forma periódica y registrar tus reuniones como actividades en Membrain.

## 1. Proceso de Conexión

¿Cómo conectar tu cuenta de **Membrain**?

1. Dirígete a **Settings** > [**Integrations**](https://app.salescaling.com/settings/integrations).
2. Busca la tarjeta de **Membrain** y haz clic en **Connect**.
3. Introduce el **subdominio** de tu instancia (por ejemplo, `acme` si tu URL es `https://acme.membrain.com`).
4. Introduce la **API key** generada en Membrain.
5. Tras validar las credenciales, se encola un import inicial de companies, contacts y opportunities.

Membrain no ofrece webhooks: los cambios entrantes se detectan con un sync incremental aproximadamente cada 10 minutos.

## 2. Requisitos y Permisos

Para conectar la integración necesitas:

* Una cuenta Membrain con acceso a la **API REST v2**.
* Una **API key** válida (se envía en el header `APIKey`).
* El **subdominio** de tu instancia Membrain.

## 3. Configuración (Settings)

Con la integración conectada, abre **Settings** en la tarjeta de Membrain:

| Campo                     | Uso                                                                      |
| ------------------------- | ------------------------------------------------------------------------ |
| Default sales process     | Proceso de ventas por defecto.                                           |
| Call activity type        | Tipo de actividad usado al crear llamadas en Membrain.                   |
| Default opportunity owner | Propietario por defecto de oportunidades cuando aplique.                 |
| Custom field mapping      | Mapeo de campos personalizados de Salescaling a propiedades de Membrain. |

Configura **Call activity type** para que las llamadas procesadas en Salescaling generen actividades en Membrain.

## 4. Flujo de Información: De Salescaling hacia Membrain

Después de que una reunión es procesada, **Salescaling** puede escribir datos en Membrain:

* **Actividades de reunión**: resúmenes y notas de reuniones como actividades vinculadas a company, contact u opportunity asociados.
* **Custom fields**: valores de campos personalizados mapeados (con el toggle **To CRM** activo).

**Salescaling no crea ni actualiza** companies, contacts u opportunities en Membrain; la sincronización de entidades es principalmente entrante.

## 5. Flujo de Información: De Membrain hacia Salescaling

**Salescaling** importa y sincroniza periódicamente:

* **Companies** → empresas en Salescaling.
* **Contacts** → contactos (requieren `CompanyId` en Membrain; se crea la relación empresa-contacto).
* **Opportunities** → deals, vinculados a la empresa por `CompanyId`.
* Registros eliminados en Membrain (`Deleted=true` o `IncludeDeleted`) se reflejan como borrado en Salescaling.

Estos datos alimentan la funcionalidad de **Associations**, vinculando cada grabación con los registros correctos de contacto, empresa y/o negocio.

## 6. Custom fields

1. Abre **Settings** en la tarjeta de Membrain.
2. En la sección **Custom field mapping**, mapea campos de Salescaling a propiedades `CustomField{GUID}` de Membrain.
3. Los tipos soportados incluyen texto, número, fecha, select y moneda. No se sincronizan File, ScoreCard ni Calculation.
4. Activa **To CRM** en cada mapeo para enviar valores a Membrain tras procesar reuniones o llamadas.

## 7. Solución de problemas

* **Import lento**: Membrain limita la tasa de peticiones; el import y el sync usan paginación y reintentos ante HTTP 429.
* **Contacto sin empresa**: los contactos sin `CompanyId` en Membrain pueden omitirse o requerir una empresa placeholder según la configuración del tenant.
* **Reuniones sin actividad**: configura **Call activity type** en Settings (llamadas) o el tipo de reunión heredado para videollamadas.

{% hint style="info" %}
A diferencia de HubSpot, Zoho o Salesforce, Membrain no usa OAuth ni webhooks. La conexión se realiza con subdominio y API key, y la sincronización entrante depende de ciclos periódicos (\~10 minutos).
{% endhint %}


# Conectar Plataformas de Llamadas

### Conecte sus plataformas de telefonía con Salescaling para importar y analizar automáticamente todas sus llamadas comerciales grabadas.

<figure><img src="/files/kihjpBYjMCByQK4ZaALu" alt=""><figcaption></figcaption></figure>

Esta sección le guiará a través del proceso de conexión para cada una de las plataformas soportadas. Cada sistema tiene sus propios requisitos, por lo que se han creado guías detalladas e individuales.

Seleccione la plataforma que desea conectar para ver las instrucciones paso a paso:

* [**Integración con Aircall**](/configuraciones-de-la-plataforma/integraciones/conectar-plataformas-de-llamadas/aircall)
  * Conecte su cuenta de Aircall a través de API ID y API Token para sincronizar las grabaciones.
* [**Integración con Hubspot Calls**](/configuraciones-de-la-plataforma/integraciones/conectar-plataformas-de-llamadas/hubspot)
  * Importe automáticamente las llamadas grabadas desde su cuenta de Hubspot.
* [**Integración con Ringover**](/configuraciones-de-la-plataforma/integraciones/conectar-plataformas-de-llamadas/ringover)
  * Conecte su cuenta de Ringover a través de API Key para sincronizar las grabaciones.
* [**Integración con 3CX**](/configuraciones-de-la-plataforma/integraciones/conectar-plataformas-de-llamadas/threecx)
  * Configure la importación de llamadas desde su sistema 3CX a través de credenciales o SFTP.

**Preguntas Frecuentes (FAQ)**

<details>

<summary>¿Dónde encuentro mi API ID y API Token para conectar Aircall?</summary>

En el Dashboard de Aircall, ve a **Integraciones y API** en el menú lateral, luego a la pestaña **Claves API** y haz clic en **Generar una clave API**. Se te mostrarán el API ID y el API Token. Recuerda que el API Token solo se muestra una vez al momento de la creación, así que guárdalo en un lugar seguro.

</details>

<details>

<summary>¿Dónde encuentro mi API Key para conectar una plataforma como Ringover?</summary>

Generalmente, la API Key es una clave secreta que se encuentra en el panel de configuración o en la sección para desarrolladores de tu cuenta de Ringover. Deberás iniciar sesión en Ringover para encontrarla. Si tienes problemas, consulta la documentación de ayuda de Ringover o contacta con su equipo de soporte.

</details>

<details>

<summary>¿Qué es el "Mapeo de Usuarios" para la integración de 3CX y por qué es importante?</summary>

El "Mapeo de Usuarios" es el proceso de asociar la `Extension ID` de un usuario en 3CX con su cuenta de usuario correspondiente en Salescaling. Es un paso crucial para que, cuando se importe una llamada de 3CX, Salescaling sepa a qué miembro de tu equipo debe asignarle la grabación correctamente.

</details>


# Aircall

Importa y analiza automáticamente las llamadas de Aircall en Salescaling para centralizar tus interacciones comerciales.

## Integración de llamadas con Aircall

Salescaling permite importar automáticamente tus llamadas realizadas en Aircall, facilitando la gestión y análisis de tus interacciones comerciales. Para aprovechar esta integración, sigue los pasos y ten en cuenta los requisitos descritos a continuación.

### ¿Cómo obtener las credenciales de API en Aircall?

Antes de conectar Aircall con Salescaling, necesitas obtener tu **API ID** y **API Token** desde el panel de administración de Aircall:

1. Inicia sesión en tu cuenta de [**Aircall Dashboard**](https://dashboard.aircall.io/).
2. Dirígete a **Integraciones y API** en el menú lateral izquierdo.
3. Haz clic en la pestaña **Claves API**.
4. Haz clic en **Generar una clave API** para crear nuevas credenciales.
5. Asigna un nombre descriptivo a la clave (por ejemplo, "Salescaling") y confirma la creación.
6. Copia el **API ID** y el **API Token** que se muestran. **Importante**: El API Token solo se muestra una vez, así que asegúrate de guardarlo en un lugar seguro.

{% hint style="warning" %}
**Permisos necesarios:** El usuario que genere las claves API debe tener rol de **Administrador** en Aircall. Las claves API heredan los permisos del usuario que las crea, por lo que se recomienda que sea un administrador con acceso completo a las llamadas y grabaciones.
{% endhint %}

### ¿Cómo conectar tu cuenta de Aircall?

1. Accede a tu cuenta de **Salescaling**.
2. Dirígete a la sección de [**Integrations**](https://app.salescaling.com/settings/integrations) en **Settings**.
3. Localiza la integración de **Aircall** y haz clic en **Connect**. Se abrirá una ventana donde deberás introducir tus credenciales:

   * **API ID**: El identificador de tu clave API de Aircall.
   * **API Token**: El token secreto de tu clave API.

   <figure><img src="/files/lYdjgx8LQLhu8f6Cnx8h" alt="" width="375"><figcaption><p>Formulario de conexión de Aircall</p></figcaption></figure>
4. Haz clic en **Save** para completar la conexión.

### ¿Qué llamadas se importan desde Aircall?

Después de conectar tu cuenta, Salescaling importará automáticamente las llamadas de Aircall que cumplan con **todos** los siguientes requisitos:

* **Fecha de la llamada:** Solo se importarán las llamadas que hayan sido efectuadas en las **dos semanas previas** al momento de la importación.
* **Usuario coincidente:** La llamada debe haber sido realizada por un usuario de Aircall cuyo **correo electrónico coincida** con el de un usuario de pago en Salescaling.
* **Grabación disponible:** La llamada debe tener la **grabación almacenada** en Aircall. Si la llamada no tiene grabación, no será importada.
* **Tamaño de archivo:** Las grabaciones no pueden exceder los **200 MB**.

### ¿Qué información se sincroniza?

Para cada llamada importada, Salescaling recibe y procesa la siguiente información:

| Campo                      | Descripción                                                       |
| -------------------------- | ----------------------------------------------------------------- |
| **Identificador**          | ID único de la llamada en Aircall                                 |
| **Dirección**              | Si la llamada es entrante (inbound) o saliente (outbound)         |
| **Estado**                 | Estado de la llamada (contestada, perdida, buzón de voz, fallida) |
| **Fecha y hora de inicio** | Momento en que comenzó la llamada                                 |
| **Fecha y hora de fin**    | Momento en que terminó la llamada                                 |
| **Duración**               | Duración total de la llamada en segundos                          |
| **Grabación**              | Archivo de audio de la llamada                                    |
| **Usuario**                | Información del agente (nombre y email)                           |
| **Contacto**               | Información del contacto externo (nombre y teléfono)              |
| **Número interno**         | Número de Aircall utilizado                                       |
| **Número externo**         | Número del contacto externo                                       |

### Notas importantes

* **Frecuencia de sincronización:** Una vez conectada, la plataforma revisará si hay nuevas llamadas en Aircall cada **15 minutos**. Por lo tanto, una llamada recién terminada puede tardar unos minutos en aparecer en Salescaling.
* **Coincidencia de usuarios:** Asegúrate de que los usuarios de tu equipo en Aircall utilicen el **mismo correo electrónico** que en Salescaling para que sus llamadas sean reconocidas e importadas correctamente.
* **Grabaciones obligatorias:** Para que una llamada sea importada, debe tener la grabación habilitada en Aircall. Configura las políticas de grabación en tu cuenta de Aircall según las regulaciones aplicables.
* **Límite inicial:** En la primera importación, se importarán un máximo de **200 llamadas** para evitar sobrecargas. Las siguientes sincronizaciones importarán todas las llamadas nuevas desde la última importación.

### Resolución de problemas

<details>

<summary>No se importan mis llamadas</summary>

Verifica lo siguiente:

1. El correo electrónico del usuario en Aircall coincide exactamente con el correo en Salescaling.
2. Las llamadas tienen grabación habilitada en Aircall.
3. Las credenciales API son correctas y no han expirado.
4. El usuario que generó las claves API tiene permisos de administrador.

</details>

<details>

<summary>¿Dónde encuentro el API ID y API Token?</summary>

En el Dashboard de Aircall, ve a **Integraciones y API** → **Claves API** → **Generar una clave API**. Se mostrarán ambos valores. Recuerda que el API Token solo se muestra una vez al momento de la creación.

</details>

<details>

<summary>¿Puedo regenerar las credenciales de API?</summary>

Sí, puedes generar nuevas claves API en cualquier momento desde el Dashboard de Aircall. Si lo haces, recuerda actualizar las credenciales en Salescaling para que la integración siga funcionando.

</details>

Si tienes dudas o necesitas ayuda, contacta con el soporte de Salescaling.


# Hubspot

Importa y analiza automáticamente las llamadas registradas en HubSpot desde Salescaling.

## Integración de llamadas con Hubspot

**Salescaling** permite importar automáticamente tus llamadas realizadas en **Hubspot**, facilitando la gestión y análisis de tus interacciones comerciales. Para aprovechar esta integración, sigue los pasos y ten en cuenta los requisitos descritos a continuación.

### ¿Cómo conectar tu cuenta de Hubspot?

1. Accede a tu cuenta de **Salescaling**.
2. Dirígete a la sección de [**Integrations**](https://app.salescaling.com/settings/integrations) en **Settings**.
3. Localiza la integración de Hubspot Calls y haz clic en **Connect**. Se abrirá una ventana donde deberás iniciar sesión con tu cuenta de Hubspot y autorizar el acceso.
4. Una vez completada la conexión, serás redirigido de vuelta a Salescaling.

<figure><img src="/files/nvkQjblSWPh71PSnBiZh" alt="" width="375"><figcaption></figcaption></figure>

La importación de llamadas es instantánea. En cuanto Hubspot termina de procesar una nueva llamada grabada, la envía directamente a Salescaling y aparecerá en tu plataforma lista para su análisis.

#### Permisos Requeridos en Hubspot

Para poder autorizar la conexión de aplicaciones de terceros como **Salescaling** a través de OAuth, el usuario que realice el proceso debe tener permisos de Super Admin o permisos específicos para instalar e gestionar aplicaciones del Marketplace en la cuenta de **Hubspot**.

Durante el proceso, **Salescaling** solicitará acceso a los siguientes permisos (scopes) para poder leer la información necesaria:

* **crm.objects.contacts.read**: Permiso para leer los contactos.
* **crm.objects.owners.read**: Permiso para leer los propietarios (usuarios) de los objetos.
* **oauth**: Permiso estándar para realizar la autenticación.

### ¿Qué llamadas se importan desde Hubspot?

Después de conectar tu cuenta, Salescaling importará automáticamente las llamadas de Hubspot que cumplan con **todos** los siguientes requisitos:

* **Fecha de la llamada:** Solo se importarán las llamadas que hayan sido efectuadas en las dos semanas previas al momento de la importación.
* **Usuario coincidente:** La llamada debe haber sido realizada por un usuario de Hubspot cuyo correo electrónico coincida con el de un usuario de pago en Salescaling.
* **Grabación disponible:** La llamada debe tener la grabación almacenada en Hubspot. Si la llamada no tiene grabación, no será importada. [¿Cómo activar la grabación de llamadas en Hubspot?](https://knowledge.hubspot.com/calling/why-wasnt-my-call-recorded-in-hubspot-sales)

### Notas importantes

* Si conectas tu cuenta nuevamente en el futuro, se volverán a importar las llamadas que cumplan los requisitos anteriores dentro del nuevo rango de dos semanas, pero solo las que no hayan sido importadas anteriormente.
* Asegúrate de que los usuarios de tu equipo en Hubspot utilicen el mismo correo electrónico que en Salescaling para que sus llamadas sean reconocidas e importadas correctamente.
* Las llamadas importadas estarán disponibles en la plataforma para su análisis y gestión.
* La integración de Hubspot Calls es diferente a la integración de Hubspot CRM, puedes tener ambas activas a la vez o una sola, aunque **se recomienda tener la de CRM activa** para que las llamadas se puedan relacionar con los contactos y oportunidades.

Si tienes dudas o necesitas ayuda, contacta con el soporte de Salescaling.


# Ringover

Importa y analiza automáticamente las llamadas de Ringover en Salescaling para centralizar tus interacciones comerciales.

## Integración de llamadas con Ringover

Salescaling permite importar automáticamente tus llamadas realizadas en Ringover, facilitando la gestión y análisis de tus interacciones comerciales. Para aprovechar esta integración, sigue los pasos y ten en cuenta los requisitos descritos a continuación.

### ¿Cómo conectar tu cuenta de Ringover?

1. Accede a tu cuenta de Salescaling.
2. Dirígete a la sección de [**Integrations**](https://app.salescaling.com/settings/integrations) en **Settings**.
3. Localiza la integración de **Ringover** y haz clic en **Connect**. Se abrirá una ventana donde deberás introducir tu **API Key** y seleccionar la **región** correspondiente a tu cuenta de Ringover.

   <figure><img src="/files/mSbGsMLdiPMmFFR4KkXF" alt="" width="375"><figcaption></figcaption></figure>
4. Asegúrate de que la API Key tenga los siguientes permisos:
   * Monitorización
   * Lectura de Llamadas
   * Lectura de Contactos
   * Lectura de Usuarios
   * Lectura de Números
5. Guarda los datos y completa la conexión.

<figure><img src="/files/AoQr5GPa82z5MhEnz5Mc" alt="" width="375"><figcaption></figcaption></figure>

### ¿Qué llamadas se importan desde Ringover?

Después de conectar tu cuenta, Salescaling importará automáticamente las llamadas de Ringover que cumplan con **todos** los siguientes requisitos:

* **Fecha de la llamada:** Solo se importarán las llamadas que hayan sido efectuadas en las dos semanas previas al momento de la importación.
* **Usuario coincidente:** La llamada debe haber sido realizada por un usuario de Ringover cuyo correo electrónico coincida con el de un usuario de pago en Salescaling.
* **Grabación disponible:** La llamada debe tener la grabación almacenada en Ringover. Si la llamada no tiene grabación, no será importada.

### Notas importantes

* **Frecuencia de Sincronización**: Una vez conectada, la plataforma revisará si hay nuevas llamadas en **Ringover** cada 15 minutos. Por lo tanto, una llamada recién terminada puede tardar unos minutos en aparecer en **Salescaling**.
* Asegúrate de que los usuarios de tu equipo en **Ringover** utilicen el mismo correo electrónico que en **Salescaling** para que sus llamadas sean reconocidas e importadas correctamente.
* Las llamadas importadas estarán disponibles en la plataforma para su análisis y gestión.

Si tienes dudas o necesitas ayuda, contacta con el soporte de Salescaling.


# ThreeCX

Conecta 3CX con Salescaling para importar grabaciones telefónicas y analizarlas automáticamente en tu flujo comercial.

La integración con **3CX** permite importar automáticamente las grabaciones de tu sistema telefónico a **Salescaling** para su análisis. La conexión requiere algunos pasos técnicos adicionales.

**¿Cómo conectar tu cuenta de 3CX?**

1. Accede a tu cuenta de **Salescaling.**
2. Dirígite a la sección de [**Integrations**](https://app.salescaling.com/settings/integrations) en **Settings**.
3. Localiza la integración de **3CX** y haz clic en **Connect**.
4. Se abrirá una ventana con dos métodos de conexión posibles: **Username-Password o SFTP.** Elige el que mejor se adapte a tu configuración.

### 1.Conexión por Usuario y Contraseña

Este método es el más directo si tienes acceso a las credenciales de la instancia.

* **Username:** Introduce tu nombre de usuario de 3CX.
* **Password:** Introduce tu contraseña.
* **Instance** **URL:** Escribe la URL de tu instancia de 3CX.

<figure><img src="/files/A4CUohYgkgLKjdfZjeI9" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="info" %}
**Nota Importante sobre Permisos:**\
Para garantizar una conexión segura y completa, la cuenta de **3CX** que se utilice para la autenticación debe tener privilegios de Administrador. Solo los administradores pueden conceder los permisos necesarios para que aplicaciones de terceros, como **Salescaling**, puedan acceder a los datos de las llamadas.
{% endhint %}

### 2. Conexión por SFTP (Recomendado)

Este método es el **más seguro y recomendado** para transferir las grabaciones de 3CX a Salescaling. Utiliza el protocolo SFTP con autenticación de clave pública SSH.

#### ¿Por qué se necesita una SSH Public Key?

La clave pública SSH es un método de autenticación seguro que permite a tu sistema 3CX conectarse automáticamente al servidor SFTP de Salescaling sin necesidad de contraseñas. Esto garantiza:

* **Seguridad**: Las claves SSH son mucho más seguras que las contraseñas tradicionales
* **Automatización**: 3CX puede exportar grabaciones automáticamente sin intervención manual
* **Aislamiento**: Cada cliente tiene su propio espacio aislado en el servidor SFTP

#### Pasos para configurar SFTP

**1. Generar tu par de claves SSH**

Necesitas generar un par de claves SSH (pública y privada). La clave **pública** se comparte con Salescaling, mientras que la clave **privada** permanece en tu servidor 3CX.

**En Windows:**

1. Abre PowerShell como administrador
2. Ejecuta el siguiente comando:

   ```powershell
   ssh-keygen -t ed25519 -C "3cx-salescaling"
   ```
3. Cuando te pregunte dónde guardar la clave, presiona Enter para usar la ubicación por defecto
4. Puedes agregar una contraseña adicional o dejarla en blanco
5. Esto generará dos archivos:
   * `id_ed25519` (clave privada - **NO compartir**)
   * `id_ed25519.pub` (clave pública - compartir con Salescaling)

**En Linux/macOS:**

1. Abre una terminal
2. Ejecuta el siguiente comando:

   ```bash
   ssh-keygen -t ed25519 -C "3cx-salescaling"
   ```
3. Sigue las mismas instrucciones que en Windows
4. Las claves se guardarán en `~/.ssh/`

**2. Configurar la conexión en Salescaling**

1. Accede a [**Integrations**](https://app.salescaling.com/settings/integrations) en **Settings**
2. Haz clic en **Connect** en la integración de **3CX**
3. Selecciona la pestaña **SFTP (Recommended)**
4. Copia el contenido del archivo `.pub` (tu clave pública) y pégalo en el campo **SSH Public Key**
5. Completa el mapeo de usuarios (Extension Mapping)
6. Haz clic en **Save**

{% hint style="info" %}
**Información Importante:**

* El **SFTP Username** se genera automáticamente y es único para tu organización
* Solo necesitas proporcionar tu **SSH Public Key**
* **Nunca** compartas tu clave privada (el archivo sin `.pub`)
  {% endhint %}

**3. Configurar 3CX para exportar a SFTP**

Una vez conectado en Salescaling, recibirás las credenciales SFTP (host, puerto, username). Ahora debes configurar 3CX para exportar grabaciones:

1. Accede a tu panel de administración de 3CX
2. Sigue la guía oficial de 3CX para configurar la exportación SFTP: [Manual de 3CX - Copia de seguridad y restauración](https://www.3cx.es/docs/manual/copia-de-seguridad-restaurar-pbx-failover/)
3. Usa las credenciales SFTP proporcionadas por Salescaling
4. Configura la clave privada SSH que generaste en el paso 1

{% hint style="warning" %}
**Método Deprecado:**

El método de **Username-Password** está deprecado y será eliminado en futuras versiones. Recomendamos encarecidamente usar **SFTP** para mayor seguridad y confiabilidad.
{% endhint %}

#### **Mapeo de Usuarios (User Mapping)**

Este paso es obligatorio para ambos métodos de conexión. Consiste en asociar la **Extension ID** (el número de extensión) de cada usuario en 3CX con su **User** en Salescaling.

Haz clic en **+ Add User Mapping** para añadir tantas filas como necesites, asegurándote de que cada usuario de **3CX** cuyas llamadas quieras importar esté correctamente mapeado.


# Gestión de la Organización

Esta sección agrupa todas las herramientas de alto nivel que los Administradores y Propietarios de la cuenta necesitan para configurar y gestionar el entorno de trabajo de Salescaling para toda la empresa.

Aquí podrás administrar quién forma parte de tu equipo, cómo se estructuran y qué permisos tienen, además de gestionar los aspectos comerciales de tu suscripción. Un correcto ajuste en esta área asegura que la plataforma se adapte a la estructura y necesidades de tu organización.

Dentro de esta sección encontrarás las guías para:

* Equipos y usuarios.
* Facturación.


# Equipos y Usuarios

El módulo de Equipos y usuarios es el centro de control del administrador para gestionar la estructura interna de la organización en la plataforma.

Desde aquí se pueden realizar las tareas esenciales de administración de personal, como dar de alta, editar y dar de baja a los usuarios, así como asignarles los roles y permisos adecuados para su función.

### 1. Pestaña Active Users (Usuarios Activos)

Esta pestaña muestra una lista de todos los usuarios que forman parte de tu organización en Salescaling. De un solo vistazo, puedes consultar el Nombre del usuario, su Email, el Rol que tiene asignado y el Equipo al que pertenece.

### 2. Pestaña Invitations (Invitaciones)

En esta sección puedes hacer un seguimiento de todas las invitaciones que se han enviado a nuevos usuarios para que se unan a la plataforma. Muestra el Email del invitado, el Rol que se le ha asignado y la Fecha de Expiración de la invitación.

#### Gestión de Roles

Desde esta pantalla se gestionan los roles de cada usuario. Salescaling cuenta con varios niveles de permisos para ajustarse a las necesidades de tu equipo.

Para ver un desglose detallado de qué puede hacer cada rol (Owner, Admin, Regular, Read Only), consulta nuestra guía completa de [Roles y Permisos](/primeros-pasos/roles-permisos).

\\


# Facturación

La sección de [**Facturación**](https://www.salescaling.com/en/pricing) permite a los administradores y propietarios de la cuenta gestionar la suscripción de la organización.

### Planes y Características

**Salescaling** ofrece diferentes planes diseñados para adaptarse a las necesidades de cada equipo. La elección del plan determina el número de usuarios, el acceso a funcionalidades avanzadas y los límites de uso.

* **Plan Starter:** Diseñado para equipos pequeños que buscan mejorar la organización y el análisis de sus reuniones.
* **Plan Growth:** Orientado a empresas en crecimiento que necesitan analíticas avanzadas, colaboración eficiente y herramientas de gestión de equipos.
* **Plan Custom:** Solución a medida para organizaciones con necesidades específicas, que puede incluir usuarios ilimitados, módulo de llamadas telefónicas y soporte prioritario.

### Gestión del Plan

Para consultar los detalles del plan actual de la organización, modificar la [suscripción](https://www.salescaling.com/en/pricing) o actualizar a un plan superior, es necesario contactar con el equipo de ventas de Salescaling.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Cómo se puede cambiar de un plan a otro?</summary>

Para realizar una actualización o cambio de plan (por ejemplo, de Starter a Growth), es necesario contactar con el equipo de ventas de **Salescaling**. Ellos se encargarán de gestionar el cambio en la suscripción.

</details>

<details>

<summary>¿Dónde se pueden descargar las facturas pasadas?</summary>

Dentro de la sección de **Facturación**, existirá un apartado de "Historial de Facturas" donde se podrán visualizar y descargar todas las facturas emitidas para la cuenta de la organización.

</details>

<details>

<summary>¿Qué ocurre si se alcanza el límite de usuarios del plan actual?</summary>

Al alcanzar el límite de usuarios de su plan (por ejemplo, 5 usuarios en el plan Starter), el sistema no permitirá invitar a nuevos miembros. Para añadir más usuarios, será necesario contactar con ventas para actualizar a un plan superior.

</details>


# Configuración de la IA

La sección de **Configuración de la IA** es una de las áreas más potentes de **Salescaling**. Aquí es donde dejas de usar una inteligencia artificial genérica y la conviertes en tu propio experto, entrenado para entender qué es importante para tu negocio.

A través de estos ajustes, podrás enseñarle a la IA a evaluar tus conversaciones basándose en tu metodología de ventas única y a saber exactamente a qué reuniones unirse.

Una correcta configuración en esta área es la clave para obtener análisis y puntuaciones **(AI Score)** que sean verdaderamente relevantes y útiles para tu equipo.

**Dentro de esta sección encontrarás las guías para:**

* [Tipos de Actividad](/configuraciones-de-la-plataforma/configuracion-de-la-ia/tipos-de-actividad)
* Smart Categories


# Tipos de Actividad

La sección de [Tipos de Actividad](https://app.salescaling.com/settings/activity-types) es el componente central donde se configura la inteligencia artificial de Salescaling para que entienda y evalúe las conversaciones comerciales. Permite la creación de plantillas personalizadas para cada tipo de interacción (ej: Demo, Llamada de cualificación) y la definición de los criterios de éxito para cada una.

Esta configuración constituye la base para el cálculo del AI Score.

Componentes Principales:

## 1. Biblioteca de Tipos de Actividad

Esta vista muestra todas las plantillas creadas. Las funcionalidades disponibles permiten activar o desactivar cada plantilla mediante un interruptor, buscar una específica, o crear una nueva a través del botón + New Activity Type.

<figure><img src="/files/CxpYVMVbl1uWI2wg2lT6" alt=""><figcaption></figcaption></figure>

## 2. Campo Descripción

* **Propósito:** En este campo se proporcionan instrucciones claras a la IA sobre el contexto y los objetivos de un tipo de reunión. La IA utiliza esta información para comprender la conversación con mayor precisión y extraer los datos relevantes.
* **Sugerencia con IA:** El botón Suggest with AI asiste en la generación de descripciones efectivas a partir de unas pocas palabras clave.

## 3. Campo Puntuación

* **Propósito:** En esta sección se definen los criterios objetivos que la IA utilizará para evaluar el éxito de la reunión. Funciona como una rúbrica de evaluación personalizada.
* **Funcionamiento:** Se crea una lista de hitos, comportamientos o preguntas clave que deberían ocurrir en la conversación. A cada criterio se le asigna un peso porcentual. El AI Score final de la reunión se calcula en base a la suma de los pesos de los criterios que la IA detecte como cumplidos.
* **Personalización:** La interfaz permite añadir, eliminar, reordenar y modificar el peso de cada criterio para que la evaluación se ajuste a la metodología de ventas de la organización.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Puedo duplicar un Tipo de Actividad para hacer una variación sin empezar de cero?</summary>

Sí. En la pantalla de Settings > Meetings, al seleccionar un Tipo de Actividad, verás un icono de duplicar (normalmente dos cuadrados superpuestos) en la parte superior derecha. Al hacer clic, se creará una copia exacta de esa plantilla que podrás renombrar y modificar a tu gusto.

</details>

<details>

<summary>¿Qué pasa si una reunión no se ajusta a ningún Tipo de Actividad que he creado?</summary>

Si una reunión no se corresponde con ningún **Tipo de Actividad**, será grabada y transcrita normalmente, pero no recibirá un **AI Score**, ya que la plataforma no tendrá los criterios específicos para evaluarla. Generalmente, podrás asignarle un tipo manualmente más tarde desde la **Vista de Detalle** de la reunión para que la IA la analice y calcule su puntuación.

</details>


# Smart Categories

Las Smart Categories (Categorías Inteligentes) son una de las funcionalidades más avanzadas de Salescaling. Permiten crear "detectores de momentos" personalizados que instruyen a la IA para que identifique, extraiga y agrupe automáticamente temas o eventos específicos que ocurren durante las conversaciones.

El resultado de una **Smart Category** que encuentra una coincidencia es la creación automática de una **Nota** y un **Clip** en la reunión correspondiente, ahorrando el trabajo de tener que buscar y crear estos momentos manualmente.

<figure><img src="/files/0Or4YsWhPxQ4Ubc19vxV" alt=""><figcaption></figcaption></figure>

### 1. Creación y Configuración de una **Smart Category**

Para crear una nueva categoría, se debe hacer clic en el botón **+ Add Smart** Category. Esto abrirá un formulario que actúa como el panel de entrenamiento para la IA.

<figure><img src="/files/OVxed6ulwdK9oMu6gHJ8" alt=""><figcaption></figcaption></figure>

* **Nombre:** Un título claro y descriptivo para la categoría (ej: "Mención de Competidores", "Próximos Pasos Acordados").
* **Descripción:** Una instrucción detallada para la IA, explicando el objetivo y el contexto de lo que debe buscar. Funciona como un "prompt" que guía al modelo.
* **Ejemplos:** Este es un campo crucial. Aquí se deben añadir ejemplos de frases textuales que la IA podría encontrar y que activarían esta categoría. Proporcionar ejemplos claros y variados es la clave para que la IA sea precisa en su detección.

### 2. Uso y Asociación con Tipos de Actividad

Una **Smart Category** no se aplica a todas las reuniones por defecto. Para activarla, es necesario asociarla a uno o varios Tipos de Actividad.

<figure><img src="/files/9C6nRKAEAc4zCB4KFXsx" alt=""><figcaption></figcaption></figure>

* **Associated meeting types**: En la vista de detalle de cada **Smart Category**, se puede ver y gestionar a qué **Tipos de Actividad** está vinculada. La IA solo buscará los momentos definidos por esta categoría en las grabaciones que tengan asignado uno de los tipos de actividad asociados.

Preguntas Frecuentes (FAQ)

<details>

<summary>He creado una "<strong>Smart Category</strong>", pero no genera ningún clip. ¿Por qué?</summary>

Las dos causas más comunes son: 1) No se han añadido suficientes ejemplos claros y variados para que la IA sepa qué buscar. 2) La **Smart Category** no ha sido asociada a los **Tipos de Actividad** correctos en su panel de configuración.

</details>


# Configuraciones técnicas

Esta sección agrupa las configuraciones avanzadas de Salescaling, diseñadas para administradores y usuarios con conocimientos técnicos que deseen personalizar las notificaciones o integrar la plataforma con otros sistemas a través de su API.

Estos ajustes te permiten extender la funcionalidad de Salescaling más allá de su interfaz estándar, conectándola directamente con tus flujos de trabajo y herramientas de desarrollo.

Dentro de esta sección encontrarás las guías para:

* Notificaciones.
* Reglas de Privacidad.
* Identidad del bot de reuniones.
* Webhooks y API Keys.


# Notificaciones

La sección de Notificaciones te permite configurar las comunicaciones automáticas por correo electrónico que se envían después de que una reunión ha sido procesada por Salescaling.

### Opciones de Configuración:

* **Summary of meetings by email (Resumen de reuniones por email):** Esta es la opción principal para ti. Si la activas, recibirás automáticamente en tu correo electrónico un resumen detallado de cada reunión que organices una vez que la IA haya completado su análisis.
* **Internal participants (Participantes internos):** Al activar esta opción, Salescaling enviará automáticamente el mismo resumen de la reunión a todos los participantes que sean miembros de tu equipo y que hayan asistido a la llamada. Es una forma excelente de mantener a todo el equipo interno alineado.
* **External participants (Participantes externos):** Esta potente opción te permite enviar automáticamente el resumen de la reunión a los participantes externos (clientes, prospectos, etc.). Es útil para compartir los próximos pasos y los puntos clave acordados. Por defecto, esta opción suele estar desactivada para que tengas control total sobre la información que compartes fuera de tu organización.

#### Preguntas Frecuentes (FAQ)

<details>

<summary>¿Qué información incluye exactamente el "resumen de la reunión" que se envía por correo?</summary>

El correo de resumen generalmente incluye las métricas clave de la reunión, como la puntuación del `AI Score`, los temas principales que se trataron, y un enlace directo para ver la grabación y el análisis completo dentro de la plataforma de Salescaling.

</details>

<details>

<summary>¿Por qué un participante de mi reunión no se "asocia" correctamente con un contacto de mi CRM?</summary>

La causa más común es que el correo electrónico que el participante usó en la invitación de la reunión no coincide exactamente con el correo electrónico que tiene registrado en su ficha de contacto en el CRM. Para asegurar una asociación correcta, verifica que ambos correos sean idénticos.

</details>


# Reglas de Privacidad

Las reglas de privacidad te permiten controlar quién tiene acceso automático a tus reuniones y llamadas según condiciones específicas. Estas reglas solo afectan los permisos de acceso automáticos y no bloquean las invitaciones manuales explícitas.

***

## ¿Qué son las Reglas de Privacidad?

Las reglas de privacidad son condiciones configurables que determinan cuándo una reunión o llamada debe ser privada. Cuando una regla se aplica, solo los participantes directos tendrán acceso al contenido, y los miembros del equipo no recibirán acceso automático.

### Importante

⚠️ **Estas reglas solo se aplican a los permisos de acceso automáticos**. No bloquean ni afectan las invitaciones manuales explícitas que puedas enviar a otras personas o equipos.

***

## Configuración Independiente para Reuniones y Llamadas

Las reglas de privacidad se configuran por separado para **reuniones** (videollamadas) y **llamadas telefónicas**:

* **Reuniones**: Configúralas desde **Settings > Meeting Settings > Privacy Rules**
* **Llamadas**: Configúralas desde **Settings > Call Settings > Privacy Rules**

Cada tipo tiene su propio conjunto de reglas, lo que te permite aplicar políticas diferentes según el tipo de interacción.

***

## Tipos de Reglas Disponibles

### 1. Participante Externo

**Cuándo se aplica**: Cuando una reunión o llamada incluye participantes de dominios que no están en tu lista de dominios internos.

**Configuración**:

* Define los dominios que consideras "internos" (por ejemplo, `salescaling.com`)
* Si alguien de otro dominio participa, la reunión será privada

**Ejemplo**:

* Dominios internos: `salescaling.com`, `sucursal.com`
* Si alguien de `cliente.com` participa → La reunión será privada
* Solo participantes de `salescaling.com` o `sucursal.com` → Acceso normal del equipo

***

### 2. Persona Específica

**Cuándo se aplica**: Cuando una reunión o llamada incluye una o más personas específicas que has configurado en la regla.

**Configuración**:

* Selecciona las personas específicas desde tu base de contactos y usuarios
* Puedes buscar por nombre o email
* Muestra iconos para distinguir entre usuarios internos y contactos externos

**Ejemplo**:

* Has configurado a "Juan Pérez" como persona específica
* Cualquier reunión con Juan Pérez → Será privada
* Útil para proteger reuniones con clientes VIP o contactos sensibles

***

### 3. Palabra Clave en el Título

**Cuándo se aplica**: Cuando el título de la reunión o llamada contiene palabras clave específicas.

**Configuración**:

* Define las palabras clave a detectar
* Elige el modo de coincidencia:
  * **Contiene**: La palabra clave aparece en cualquier parte del título
  * **Coincidencia exacta**: El título debe ser exactamente igual a la palabra clave
  * **Expresión regular**: Usa patrones complejos de búsqueda

**Ejemplo**:

* Palabra clave: "Confidencial"
* Título: "Reunión Confidencial con Cliente" → Será privada
* Título: "Reunión Regular" → Acceso normal

***

### 4. Tipo de Actividad

**Cuándo se aplica**: Cuando una reunión o llamada está asociada con tipos de actividad específicos que has configurado.

**Configuración**:

* Selecciona los tipos de actividad desde la lista disponible
* **Importante**: En la configuración de reuniones solo verás tipos de actividad de reuniones (videollamadas)
* En la configuración de llamadas solo verás tipos de actividad de llamadas (llamadas telefónicas)
* Puedes seleccionar múltiples tipos de actividad

**Ejemplo**:

* Has configurado "Negociación Sensible" como tipo de actividad
* Cualquier reunión con este tipo de actividad → Será privada
* Útil para proteger categorías específicas de interacciones

***

## Cómo Crear y Gestionar Reglas

### Crear una Nueva Regla

1. Accede a **Settings > Meeting Settings** o **Settings > Call Settings**
2. Desplázate a la sección **Privacy Rules**
3. Haz clic en **Add Rule** (Agregar Regla)
4. Selecciona el tipo de regla
5. Configura los parámetros específicos según el tipo elegido
6. Activa o desactiva la regla según necesites
7. Guarda la regla

### Activar o Desactivar Reglas

Puedes activar o desactivar cualquier regla sin eliminarla usando el switch de estado. Las reglas desactivadas no se aplican, pero puedes reactivarlas en cualquier momento.

### Editar una Regla

1. En la tabla de reglas de privacidad, haz clic en el icono de edición (lápiz)
2. Modifica los parámetros que necesites
3. Guarda los cambios

### Eliminar una Regla

1. En la tabla de reglas de privacidad, haz clic en el icono de eliminación (papelera)
2. Confirma la eliminación

***

## Visualización de Reglas

La tabla de reglas muestra:

* **Tipo**: El tipo de regla (Participante Externo, Persona Específica, etc.)
* **Parámetros**: Los valores configurados de forma resumida
* **Estado**: Si la regla está activa o inactiva
* **Acciones**: Editar o eliminar la regla

***

## Ejemplos de Uso

### Caso 1: Proteger Reuniones con Clientes Externos

**Objetivo**: Hacer privadas todas las reuniones que incluyan participantes externos a tu organización.

**Solución**: Crea una regla de tipo "Participante Externo" y agrega tus dominios internos (ej: `salescaling.com`). Cualquier reunión con alguien fuera de estos dominios será privada.

***

### Caso 2: Reuniones Confidenciales por Título

**Objetivo**: Marcar automáticamente como privadas las reuniones con títulos específicos.

**Solución**: Crea una regla de tipo "Palabra Clave en el Título" y agrega palabras como "Confidencial", "Privada", "Interna", etc.

***

### Caso 3: Proteger Tipos de Actividad Específicos

**Objetivo**: Hacer privadas todas las reuniones de negociación o cierre de ventas.

**Solución**: Crea una regla de tipo "Tipo de Actividad" y selecciona los tipos de actividad relevantes (ej: "Negociación", "Cierre de Ventas").

***

## Privacidad Manual

Además de las reglas automáticas, puedes marcar reuniones y llamadas como privadas manualmente en cualquier momento.

### ¿Quién puede marcar una reunión como privada?

* **Owners**: Pueden marcar cualquier reunión o llamada como privada
* **Admins**: Solo pueden marcar como privadas las reuniones o llamadas en las que han participado

### Cómo marcar una reunión como privada

Hay dos formas de marcar una reunión o llamada como privada:

#### Desde el listado de reuniones/llamadas

1. Localiza la reunión o llamada en el listado
2. Haz clic en el menú de tres puntos (⋮)
3. Selecciona "Mark as Private" o "Mark as Public"

#### Desde la vista de reunión/llamada individual

1. Abre la reunión o llamada
2. Haz clic en el menú de tres puntos (⋮) en la esquina superior derecha
3. Selecciona "Mark as Private" o "Mark as Public"

### Indicador visual

Las reuniones y llamadas privadas muestran un icono de candado (🔒) para identificarlas fácilmente:

* En el listado: Junto al título de la reunión
* En la vista individual: Badge "Private" en el encabezado

### Diferencia entre privacidad automática y manual

| Aspecto                   | Privacidad Automática (Reglas)        | Privacidad Manual                         |
| ------------------------- | ------------------------------------- | ----------------------------------------- |
| **Cuándo se aplica**      | Al crear/procesar la reunión          | En cualquier momento                      |
| **Quién puede aplicarla** | Sistema automático                    | Admins y Owners                           |
| **Persistencia**          | Evaluada en tiempo de creación        | Persiste independientemente de las reglas |
| **Puede revertirse**      | Sí, marcando manualmente como pública | Sí, marcando manualmente como pública     |

### Comportamiento importante

* **El estado manual tiene prioridad**: Si marcas una reunión como privada manualmente, permanecerá privada incluso si no cumple ninguna regla de privacidad.
* **Puedes desmarcar reuniones privadas por reglas**: Si una reunión fue marcada como privada automáticamente por una regla, puedes desmarcada manualmente como pública.
* **El estado persiste**: Una vez marcada manualmente, el estado de privacidad no cambia aunque se modifiquen las reglas de privacidad.
* **Se remueven accesos automáticamente**: Al marcar una reunión como privada, se eliminan automáticamente todos los accesos de usuarios que no son participantes ni owners.
* **No se pueden compartir reuniones privadas**: El botón "Share" está deshabilitado para reuniones privadas. Solo los participantes y owners tienen acceso.
* **Los accesos no se restauran automáticamente**: Al desmarcar una reunión como privada, los usuarios que perdieron acceso NO lo recuperan automáticamente. Deberás invitarlos manualmente si deseas que vuelvan a tener acceso.

***

## Notas Importantes

* Las reglas se evalúan automáticamente cuando se procesa una reunión o llamada
* Múltiples reglas pueden aplicarse simultáneamente
* Si al menos una regla activa se cumple, la reunión o llamada será privada
* Las reglas no afectan las invitaciones manuales explícitas
* Los administradores pueden gestionar estas configuraciones desde Settings
* El estado de privacidad manual tiene prioridad sobre las reglas automáticas

***

## Tester de Accesos a Reuniones y Llamadas

El **Tester de Accesos** es una herramienta de diagnóstico que permite a los administradores verificar si un usuario específico tiene acceso a una reunión o llamada, y entender exactamente por qué tiene o no tiene acceso.

### ¿Dónde encontrar el Tester de Accesos?

El tester está disponible en dos ubicaciones:

* **Para Reuniones (Videollamadas)**: **Settings > Meeting Settings** (al final de la página)
* **Para Llamadas Telefónicas**: **Settings > Call Settings > General** (al final de la pestaña)

### ¿Quién puede usar el Tester de Accesos?

Esta herramienta está disponible únicamente para usuarios con rol de **Admin** u **Owner**.

### Cómo usar el Tester de Accesos

1. **Selecciona una reunión o llamada**
   * Usa el selector de búsqueda para encontrar la reunión o llamada que deseas verificar
   * Puedes buscar por nombre
   * El selector filtra automáticamente por tipo (videollamadas en Meeting Settings, llamadas telefónicas en Call Settings)
2. **Selecciona un usuario**
   * Usa el selector de búsqueda para encontrar el usuario que deseas verificar
   * Puedes buscar por nombre o email
   * El selector muestra todos los usuarios de tu organización
3. **Ejecuta el test**
   * Haz clic en el botón **"Test Access"**
   * El sistema analizará los permisos y mostrará el resultado

### Información que proporciona el Tester

El tester muestra información detallada sobre el acceso del usuario:

#### Resultado Principal

* **Has Access / No Access**: Indica claramente si el usuario tiene o no acceso
* **Razón Principal**: Explica el motivo principal del resultado (ej: "User is an owner of the meeting", "Meeting is private and user is not a participant")

#### Detalles de Acceso

El tester muestra el estado de múltiples factores que influyen en el acceso:

* **Meeting is private**: Indica si la reunión está marcada como privada
* **Is participant**: Indica si el usuario es participante directo de la reunión/llamada
* **Is owner**: Indica si el usuario es owner de la reunión/llamada
* **Is blocked**: Indica si el usuario está bloqueado explícitamente
* **Has direct viewer access**: Indica si el usuario tiene permiso directo de visualización (`can_view`)
* **Has team access**: Indica si el usuario tiene acceso a través de su equipo

### Casos de uso del Tester

#### 1. Verificar por qué un usuario no puede ver una reunión

**Situación**: Un usuario reporta que no puede ver una reunión específica.

**Solución**:

1. Usa el tester para verificar el acceso del usuario
2. Revisa la razón proporcionada (ej: "Meeting is private and user is not a participant")
3. Toma acción según corresponda (desmarcar como privada, añadir como participante, etc.)

#### 2. Auditar permisos antes de compartir contenido sensible

**Situación**: Quieres asegurarte de que solo ciertas personas tienen acceso a una reunión confidencial.

**Solución**:

1. Marca la reunión como privada
2. Usa el tester para verificar que usuarios específicos NO tienen acceso
3. Confirma que solo los participantes y owners pueden acceder

#### 3. Diagnosticar problemas de configuración de equipos

**Situación**: Sospechas que las reglas de privacidad o la configuración de equipos no está funcionando correctamente.

**Solución**:

1. Usa el tester con diferentes usuarios y reuniones
2. Compara los resultados esperados vs los reales
3. Identifica patrones y ajusta la configuración según sea necesario

### Interpretación de Resultados

#### ✅ Acceso Concedido - Posibles Razones

* **"User is an owner of the meeting"**: El usuario es owner de la reunión
* **"User has 'can\_view' relation to the meeting"**: El usuario tiene permiso directo de visualización
* **"User has team access to the meeting"**: El usuario tiene acceso a través de su equipo

#### ❌ Acceso Denegado - Posibles Razones

* **"User is blocked from the meeting"**: El usuario está bloqueado explícitamente
* **"Meeting is private and user is not a participant"**: La reunión es privada y el usuario no es participante
* **"No direct access relation found"**: El usuario no tiene ninguna relación de acceso con la reunión

### Notas Importantes

* El tester **no modifica permisos**, solo los consulta y muestra
* Los resultados reflejan el estado actual de los permisos en tiempo real
* El tester respeta todas las reglas de privacidad y permisos configuradas
* Puedes usar el tester tantas veces como necesites sin afectar el sistema

### Privacidad y Seguridad

* Solo Admins y Owners pueden usar esta herramienta
* El uso del tester no genera notificaciones a los usuarios verificados
* Los resultados son visibles solo para quien ejecuta el test
* Esta herramienta es útil para auditorías de seguridad y cumplimiento

***

## Preguntas Frecuentes

### ¿Las reglas afectan a reuniones o llamadas ya existentes?

No, las reglas solo se aplican a nuevas reuniones y llamadas procesadas después de configurar la regla.

### ¿Puedo tener diferentes reglas para reuniones y llamadas?

Sí, las reglas se configuran independientemente. Puedes tener reglas completamente diferentes para reuniones y llamadas.

### ¿Qué pasa si una reunión cumple múltiples reglas?

Si una reunión cumple cualquier regla activa, será privada. No necesitas que cumpla todas las reglas.

### ¿Las reglas bloquean completamente el acceso?

No, las reglas solo afectan los permisos automáticos. Si envías una invitación manual explícita a alguien, esa persona tendrá acceso independientemente de las reglas.

### ¿Puedo marcar un meeting como privado manualmente?

Sí, los Admins y Owners pueden marcar meetings como privados en cualquier momento. Los Admins solo pueden marcar como privados aquellos meetings en los que han participado.

### ¿Qué pasa si marco como privado un meeting que ya cumple una privacy rule?

El estado manual tiene prioridad. El meeting permanecerá privado independientemente de si cumple o no con las reglas automáticas.

### ¿Puedo desmarcar como privado un meeting que fue marcado por una rule?

Sí, puedes desmarcar manualmente como público un meeting que fue marcado como privado automáticamente por una regla. El estado manual tiene prioridad.

### ¿Cómo sé si un meeting es privado?

Los meetings privados muestran un icono de candado (🔒) junto al título en el listado y un badge "Private" en la vista individual.

### ¿Qué pasa con los usuarios que ya tenían acceso?

Cuando marcas una reunión como privada, se eliminan automáticamente todos los accesos de usuarios que no son:

* Participantes del meeting
* Owners de la organización

Esto significa que los usuarios que tenían acceso como "viewers" (por ejemplo, miembros del equipo y otros usuarios invitados) perderán el acceso inmediatamente.

### ¿Puedo compartir una reunión privada?

No. El botón "Share" está deshabilitado para reuniones privadas. Solo los participantes directos y los owners tienen acceso a reuniones privadas.

### ¿Cómo puedo verificar si un usuario tiene acceso a una reunión específica?

Usa el **Tester de Accesos** disponible en Meeting Settings o Call Settings. Esta herramienta te permite seleccionar una reunión y un usuario, y te mostrará si tiene acceso y por qué. Solo disponible para Admins y Owners.

### ¿El Tester de Accesos modifica los permisos?

No, el tester es una herramienta de solo lectura. Únicamente consulta y muestra los permisos actuales sin modificarlos.

### ¿Los usuarios reciben notificaciones cuando uso el Tester de Accesos?

No, el uso del tester es completamente transparente para los usuarios. No genera ninguna notificación ni registro visible para ellos.

***

¿Necesitas ayuda? Contacta con soporte en <support@salescaling.com>


# Identidad del bot de reuniones

Configura cómo se muestra el bot en videollamadas desde **Settings > Meetings** (sección *Bot identity*).

***

## Resumen por plataforma

| Plataforma          | ¿Nombre personalizable desde Settings?  | ¿Quién define el nombre en la reunión?                                                                                             |
| ------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Google Meet**     | Solo si *Authenticate bot* está **OFF** | Con auth ON: cuenta de Google de Salescaling para bots autenticados (**AI Note Taker**). Con auth OFF: nombre que configures aquí. |
| **Microsoft Teams** | No (siempre cuenta de la organización)  | Cuenta Microsoft del bot de la organización.                                                                                       |
| **Zoom**            | Sí (siempre)                            | Nombre que configures en *Bot display name*.                                                                                       |

***

## Google Meet: autenticación del bot

El interruptor **Authenticate bot (Google Meet)** controla si el bot intenta unirse con la cuenta de Google que Salescaling usa para los bots autenticados y que tiene el nombre **AI Note Taker**.

### Con autenticación ON (predeterminado)

* El bot puede iniciar sesión cuando la reunión o el anfitrión lo exigen.
* El nombre visible en la llamada es el de la cuenta de Google que Salescaling usa para los bots autenticados y que tiene el nombre **AI Note Taker**, no el campo *Bot display name*.
* Útil para reuniones que solo admiten usuarios autenticados o para reducir fricción en la sala de espera.

### Con autenticación OFF

* El bot no fuerza el inicio de sesión en Google Meet (solo entrará autenticado si la reunión lo requiere de forma obligatoria).
* Puedes definir un **nombre personalizado** en *Bot display name* para Google Meet.
* El nombre por defecto es **AI Note Taker** si no indicas otro.

> **Nota:** Según la configuración del anfitrión y de la reunión, algunas videollamadas pueden exigir participantes autenticados aunque desactives esta opción.

***

## Microsoft Teams

Teams **no** usa el interruptor de Google Meet. El bot de tu organización está configurado a nivel de infraestructura:

* El nombre y la foto en la reunión salen de la **cuenta Microsoft del bot**, no del campo *Bot display name*.
* Si la reunión exige usuarios autenticados, el bot iniciará sesión con esa cuenta (puede aparecer como participante externo).
* Si la reunión no lo exige, puede unirse como invitado; aun así, el nombre personalizado de Settings **no** se aplica cuando el bot entra con la cuenta de la organización.

No puedes cambiar el nombre del bot de Teams desde esta pantalla.

***

## Zoom

Zoom **siempre** usa el valor de *Bot display name* (o **AI Note Taker** por defecto), independientemente del interruptor de Google Meet.

***

## Campo *Bot display name*

* **Auth ON:** el campo aplica a **Zoom**; Google Meet usa la cuenta de Google de Salescaling (**AI Note Taker**) y Teams la cuenta Microsoft de la organización.
* **Auth OFF:** el campo aplica a **Google Meet y Zoom**; Teams sigue usando la cuenta de la organización.
* Máximo 100 caracteres.

***

## Otras opciones en Settings > Meetings

En la misma página puedes configurar:

* **Bot text:** mensaje en el chat al unirse el bot o un participante.
* **Bot recording audio / Video output:** audio e imagen que muestra el bot.
* **Bot rules** (administradores): reglas para no programar el bot automáticamente en ciertas reuniones.

Para gestionar reuniones concretas (activar o desactivar el bot), usa el [Bot Manager](https://app.salescaling.com/bot-manager).

***

## Preguntas frecuentes

<details>

<summary>Activé un nombre personalizado pero en Google Meet sigo viendo otro nombre</summary>

Comprueba que **Authenticate bot (Google Meet)** esté en OFF. Con auth ON, prevalece el nombre de la cuenta de Google que Salescaling usa para los bots autenticados (**AI Note Taker**).

</details>

<details>

<summary>¿Puedo poner el mismo nombre en Teams que en Zoom?</summary>

No desde Settings. Teams usa la cuenta Microsoft configurada para tu organización. Solo Zoom (y Google Meet con auth OFF) respetan *Bot display name*.

</details>

<details>

<summary>¿Los cambios afectan a bots ya programados?</summary>

Sí, para reuniones **futuras** (el bot aún no se ha unido): al guardar en Settings se actualizan el nombre, la autenticación en Google Meet, el mensaje de chat, la imagen y el audio del bot en todas las reuniones programadas del tenant.

No aplica a bots que **ya entraron** o **ya terminaron** la reunión.

</details>


# Cómo Implementar un Ciclo de Coaching Basado en Datos

El coaching de ventas tradicional a menudo se basa en la intuición y en recuerdos aislados, lo que dificulta la objetividad y la escalabilidad de las buenas prácticas en un equipo.

Esta guía describe cómo utilizar **Salescaling** para implementar un ciclo de mejora continua, transformando el coaching de un proceso subjetivo a una disciplina basada en datos medibles y evidencia real.

## Guía Paso a Paso: El Ciclo de Mejora Continua

**Paso 1: Diagnosticar (Análisis Macro)** El primer paso consiste en identificar las áreas de mejora prioritarias. En lugar de revisar grabaciones de forma aleatoria, se debe utilizar el Dashboard Global de Analytics para buscar patrones y tendencias.

* **Filtrar por Tipo de Actividad:** Un Average AI Score particularmente bajo en una categoría específica, como "Demos de Producto", puede señalar un área de enfoque.
* **Analizar Palabras Clave:** La aparición recurrente del nombre de un competidor en Most Used Keywords puede indicar la necesidad de reforzar el argumentario de ventas.

**Paso 2:** **Analizar (Análisis Micro)** Una vez identificada un área de mejora, se debe utilizar el Explorador de Grabaciones para encontrar ejemplos específicos.

* Se accede a la Vista de Detalle de reuniones con una baja puntuación.
* Se revisa el desglose del AI Score, el cual indica exactamente qué criterios de la metodología no se cumplieron.
* Se utiliza la Transcripción Interactiva para localizar y escuchar los momentos exactos que causaron la baja puntuación.

**Paso 3:** **Entrenar (Crear Material Reutilizable)** Los hallazgos del análisis se deben convertir en material de formación estandarizado.

* Desde la Vista de Detalle, se crean Clips de los momentos clave, guardando tanto buenos como malos ejemplos para su posterior comparación.
* En la Clip Library, dichos clips se agrupan en una Playlist temática (ej: "Formación: Manejo de la Objeción del Precio").

**Paso 4: Coachear (Acción Basada en Evidencia)** Con el material preparado, las sesiones de coaching ganan en efectividad.

* En las sesiones 1-a-1, se reproduce la Playlist para revisar momentos reales en lugar de discutir situaciones hipotéticas.
* Se dejan comentarios específicos y accionables en la pestaña de Feedback de una grabación para un seguimiento documentado.

**Paso 5: Medir el Impacto (Cerrar el Círculo)** El ciclo se cierra volviendo a los datos para evaluar la efectividad de la formación.

* Tras un periodo de tiempo determinado, se debe volver al Dashboard Global de Analytics.
* Se revisa si el Average AI Score para el tipo de reunión trabajado ha mejorado. Si es así, se puede identificar un nuevo punto de fricción y repetir el proceso.

{% hint style="info" %}
Para Saber Más: Profundiza en Estrategias de Coaching. Ahora que ya sabes *cómo* usar las herramientas de **Salescaling** para el coaching, te invitamos a leer nuestro artículo en el blog donde exploramos las metodologías más efectivas para liderar equipos de venta de alto rendimiento.
{% endhint %}


# Acelerar el Onboarding de Nuevos Vendedores

El proceso de ***onboarding*** de un nuevo vendedor es tradicionalmente lento y consume mucho tiempo de los managers y miembros senior del equipo. **Salescaling** te permite acelerar drásticamente este proceso creando una biblioteca de "grandes éxitos" de tus mejores vendedores.

Esto permite que los nuevos miembros del equipo aprendan de ejemplos reales y excelentes desde el primer día, a su propio ritmo.

### **Guía Paso a Paso: Crear una "Playlist de Onboarding"**

**Paso 1:** Identifica a tus Top Performers Usa el Dashboard Global de Analytics para identificar qué usuarios tienen el Average AI Score más alto de forma consistente. Ellos serán tus referentes para crear el material de formación.

**Paso 2:** Busca sus Mejores Momentos Entra en el Explorador de Grabaciones y filtra por las reuniones de esos usuarios top. Busca grabaciones con puntuaciones altas que se correspondan con los tipos de conversaciones que tendrá el nuevo vendedor (ej: "Demos de Producto", "Primera llamada de cualificación").

**Paso 3:** Crea tu "Biblioteca de Jugadas Maestras" Revisa esas grabaciones de alta calidad y crea Clips cortos y específicos para cada hito clave de tu proceso de ventas. Algunos ejemplos de clips que puedes crear son:

* "Ejemplo de cómo abrir una llamada en frío"
* "Modelo de cómo presentar la propuesta de valor"
* "Mejor ejemplo de manejo de la objeción del precio"
* "Cierre perfecto con próximos pasos claros"

**Paso 4:** Organiza y Comparte el Contenido Ve a la sección de Playlists y crea una nueva lista llamada, por ejemplo, "Playlist de Onboarding". Añade todos los clips que has creado en un orden lógico para guiar el aprendizaje. Finalmente, comparte esta Playlist con los nuevos comerciales durante su primera semana.

Este recurso se convierte en una herramienta de formación asíncrona y de altísimo valor que pueden consultar siempre que lo necesiten.

{% hint style="info" %}
Para Saber Más: Optimiza tu Proceso de Onboarding. Ahora que sabes *cómo* usar Salescaling para crear material de formación, te invitamos a leer nuestro artículo del blog, donde compartimos las mejores prácticas para reducir el tiempo de aprendizaje de los nuevos vendedores.
{% endhint %}


# Estandarizar tu Metodología de Ventas

Uno de los mayores desafíos para cualquier equipo de ventas es asegurar que todos los miembros, desde el más nuevo al más senior, sigan la misma metodología y los mismos procesos en sus conversaciones con clientes. La consistencia es clave para obtener resultados predecibles.

**Salescaling** te permite "traducir" tu metodología de ventas en un conjunto de reglas medibles que la **IA** puede evaluar automáticamente en cada conversación, dándote una visibilidad completa sobre la adopción de vuestros procesos.

### **Guía Paso a Paso: Cómo "Codificar" tu Metodología**

**Paso 1:** Define tus Hitos Clave Antes de entrar a la plataforma, reúne a los responsables de ventas y haz una lista de los 5-10 puntos críticos y no negociables que deben ocurrir en una reunión de ventas exitosa para tu empresa.

* *Ejemplo de hitos:* "Se confirma el presupuesto del cliente", "Se identifican los 'dolores' principales", "Se establecen los próximos pasos con fecha y responsable", etc.

**Paso 2:** Ve a la Configuración de la IA Dirígete a Settings > Configuración de la IA > Tipos de Actividad. Esta sección es tu centro de mando para enseñarle a la IA qué es importante para ti.

**Paso 3:** Crea un Nuevo "Tipo de Actividad" Haz clic en + Add meeting type y crea una plantilla específica para tu proceso principal. Por ejemplo: "Demo de Producto - Metodología Oficial".

**Paso 4:** Configura el Score con tus Hitos En la sección Score de la plantilla que acabas de crear, añade cada uno de los "Hitos Clave" que definiste en el paso 1 como un criterio de puntuación. Asigna un porcentaje a cada uno según su importancia estratégica para el cierre de la venta.

**Paso 5:** Monitoriza la Adopción en Toda la Organización Una vez configurado, anima a tu equipo a asignar este nuevo tipo de actividad a sus reuniones. A partir de ese momento, podrás:

* Ver en cada reunión el desglose del AI Score para saber si se cumplieron los hitos.
* Ir al Dashboard Global de Analytics, filtrar por este Tipo de Actividad y ver el Average AI Score de todo el equipo, identificando fácilmente si la metodología se está aplicando de forma consistente.

{% hint style="info" %}
Para Saber Más: Construye una Máquina de Ventas Predecible. La estandarización de procesos es el primer paso para crear un equipo de ventas escalable. En nuestro blog, exploramos cómo las metodologías más famosas (como MEDDIC o SPICED) pueden ayudarte a conseguirlo.
{% endhint %}


# Introducción

Aprende a autenticarte en la API pública de Salescaling con claves API, límites de uso y buenas prácticas de integración.

La API Pública de Salescaling proporciona acceso programático para gestionar tus llamadas, reuniones, usuarios, contactos y otros datos. Esta guía te ayudará a comenzar con la autenticación y entender las políticas de limitación de velocidad.

## Autenticación

### ¿Qué es una API Key?

Las API keys son tokens seguros que autentican tus peticiones a la API Pública. Cada clave es única y está vinculada a tu cuenta, permitiéndote acceder a tus datos de forma programática.

### Cómo Crear una API Key

1. Ve a **Configuración > API Keys** en tu panel de Salescaling
2. Haz clic en el botón **"Crear Nueva API Key"**
3. Introduce un nombre para tu clave (ej., "Integración Producción", "Desarrollo")
4. Opcionalmente, establece una fecha de expiración para mayor seguridad
5. Haz clic en **Crear**
6. **Importante**: Copia la clave inmediatamente - solo se mostrará una vez
7. Guárdala de forma segura (recomendamos usar variables de entorno o un gestor de secretos)

### Usar tu API Key

* Incluye la API key en el header `x-api-key` para todas las peticiones
* Todos los endpoints de la API Pública están disponibles en: `https://api.salescaling.com/api/v1/`
* Ejemplo de header de petición: `x-api-key: tu-api-key-aqui`

### Scopes (Permisos)

Las API keys utilizan un sistema de scopes para controlar qué acciones pueden realizar. Al crear una API key, debes seleccionar al menos un scope:

#### Scopes Disponibles

**Voice Agents:**

* `voice-agents:webhook` - Permite iniciar llamadas mediante webhook
* `voice-agents:read` - Permite leer información de voice agents
* `voice-agents:write` - Permite crear y modificar voice agents

**Contactos:**

* `contacts:read` - Permite leer información de contactos
* `contacts:write` - Permite crear y modificar contactos

**Empresas:**

* `companies:read` - Permite leer información de empresas
* `companies:write` - Permite crear y modificar empresas

**Llamadas:**

* `calls:read` - Permite leer información de llamadas
* `calls:write` - Permite crear y modificar llamadas

**Reuniones:**

* `meetings:read` - Permite leer información de reuniones
* `meetings:write` - Permite crear y modificar reuniones

**Oportunidades:**

* `opportunities:read` - Permite leer información de oportunidades
* `opportunities:write` - Permite crear y modificar oportunidades

**Calendario:**

* `calendar:read` - Permite leer información de calendarios
* `calendar:write` - Permite crear y modificar eventos de calendario

**Usuarios:**

* `users:read` - Permite leer información de usuarios

#### Ejemplo de Uso de Scopes

Si solo necesitas iniciar llamadas mediante webhook, selecciona únicamente el scope `voice-agents:webhook`. Esto sigue el principio de privilegio mínimo, otorgando solo los permisos necesarios.

### Permisos y Propiedad

* Las API keys actúan en nombre del usuario que las creó
* Los scopes limitan qué acciones puede realizar la API key
* Cualquier acción realizada usando una API key aparecerá como si la hubiera realizado el usuario creador
* Por ejemplo, si creas una llamada usando una API key, aparecerás como el propietario de esa llamada
* Solo crea API keys para usuarios con niveles de acceso apropiados
* Asigna únicamente los scopes necesarios para cada API key

### Mejores Prácticas de Seguridad

* Nunca compartas tus API keys ni las incluyas en control de versiones
* Guarda las claves en variables de entorno o un gestor de secretos seguro
* Rota las claves regularmente (se recomienda cada 90 días)
* Elimina inmediatamente las claves no utilizadas o comprometidas
* Asigna únicamente los scopes necesarios (principio de privilegio mínimo)
* Crea API keys diferentes para diferentes integraciones o propósitos
* Monitorea el uso de tus API keys regularmente
* Crea claves separadas para diferentes entornos (desarrollo, staging, producción)
* Usa claves de solo lectura cuando solo necesites recuperar datos

### Gestionar tus API Keys

* Ve todas tus claves en **Configuración > API Keys**
* Actualiza nombres de claves o fechas de expiración en cualquier momento
* Elimina claves que ya no necesites
* Nota: Una vez creada, el valor completo de la clave no se puede recuperar de nuevo

## Limitación de Velocidad

### Resumen

Para asegurar un uso justo y la estabilidad del sistema, la API implementa limitación de velocidad en todos los endpoints.

### Límites de Velocidad

Tres límites concurrentes se aplican a tus peticiones:

* **Corto plazo**: 20 peticiones por segundo
* **Medio plazo**: 200 peticiones por 10 segundos
* **Largo plazo**: 1,000 peticiones por minuto

### Cómo Funciona

* Los límites se rastrean por API key
* Los tres límites están activos simultáneamente
* Si excedes cualquier límite, recibirás una respuesta de error 429

### Manejar Límites de Velocidad

Cuando recibas una respuesta 429 (Demasiadas Peticiones):

* Revisa el header `Retry-After` para saber cuándo reintentar
* Espera el tiempo especificado antes de hacer otra petición
* Implementa retroceso exponencial en tu lógica de reintentos
* Ejemplo: espera 1s, luego 2s, luego 4s, etc. entre reintentos

### Mejores Prácticas

* Cachea las respuestas de la API cuando sea posible para reducir peticiones
* Usa webhooks en lugar de polling para actualizaciones en tiempo real
* Agrupa operaciones cuando la API lo soporte
* Distribuye las peticiones en el tiempo en lugar de enviar ráfagas
* Monitorea tu uso para mantenerte dentro de los límites
* Si necesitas límites más altos, contacta soporte

## Ejemplos de Inicio Rápido

### cURL

```bash
curl -X GET \
  'https://api.salescaling.com/api/v1/users' \
  -H 'x-api-key: tu-api-key-aqui'
```

### JavaScript/TypeScript

```typescript
const response = await fetch("https://api.salescaling.com/api/v1/users", {
  headers: {
    "x-api-key": "tu-api-key-aqui",
    "Content-Type": "application/json",
  },
});

const data = await response.json();
console.log(data);
```

### Python

```python
import requests

headers = {
    'x-api-key': 'tu-api-key-aqui',
    'Content-Type': 'application/json'
}

response = requests.get(
    'https://api.salescaling.com/api/v1/users',
    headers=headers
)

data = response.json()
print(data)
```

### Node.js con axios

```javascript
const axios = require("axios");

const config = {
  headers: {
    "x-api-key": "tu-api-key-aqui",
  },
};

axios
  .get("https://api.salescaling.com/api/v1/users", config)
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.error("Error:", error.message);
  });
```

## Próximos Pasos

* Explora los endpoints disponibles en la referencia de la API
* Aprende sobre [Webhooks](/api/webhooks) para notificaciones en tiempo real
* Revisa nuestros ejemplos de integración


# Servidor MCP (Model Context Protocol)

El servidor MCP de Salescaling permite que agentes de IA como Claude, Cursor y otros clientes compatibles con el protocolo MCP accedan a tus datos de reuniones, transcripciones y resúmenes de forma estructurada y segura.

## ¿Qué es MCP?

Model Context Protocol (MCP) es un protocolo estándar que permite a los modelos de lenguaje (LLMs) interactuar con sistemas externos de forma estructurada. El servidor MCP de Salescaling implementa este protocolo para exponer tus datos de reuniones a través de herramientas que los agentes de IA pueden usar.

## Características

* ✅ **Spec-Compliant**: Implementación completa del protocolo MCP oficial
* ✅ **11 Herramientas Disponibles**: Reuniones (videollamada y presencial), llamadas telefónicas, búsqueda, listados, transcripción, resumen con action items, detalle, estadísticas y más
* ✅ **Búsqueda Avanzada**: Full Text Search con PostgreSQL para búsquedas semánticas con índices GIN optimizados
* ✅ **Control de Payload**: Límites configurables para evitar overflow de contexto
* ✅ **Autenticación Segura**: API key de Salescaling u **OAuth Clients** (Authorization Code + PKCE)
* ✅ **Multi-tenant**: Aislamiento automático por organización
* ✅ **Alto Rendimiento**: Optimizado para millones de filas con índices GIN y control de concurrencia

## Endpoints MCP

El servidor MCP expone dos endpoints principales:

### GET `/api/v1/mcp` - Listar Herramientas

Retorna la lista de herramientas disponibles con sus esquemas de entrada.

**Ejemplo:**

```bash
curl -X GET https://api.salescaling.com/api/v1/mcp \
  -H "X-API-Key: sk_xxx"
```

### POST `/api/v1/mcp` - Ejecutar Herramienta

Ejecuta una herramienta específica con los argumentos proporcionados.

**Ejemplo:**

```bash
curl -X POST https://api.salescaling.com/api/v1/mcp \
  -H "X-API-Key: sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "search_meetings",
    "arguments": {
      "query": "performance",
      "limit": 10
    }
  }'
```

## Conexión MCP vía OAuth Clients

Además de la API key, puedes conectar clientes MCP que soporten **OAuth 2.0** (flujo *Authorization Code* con **PKCE**). Los clientes OAuth se registran de forma **explícita** en Salescaling (no hay registro dinámico de clientes en el servidor de autorización).

### Requisitos

* Cuenta con permisos para gestionar **OAuth Clients** (normalmente administradores de la organización).
* El cliente MCP debe poder completar el flujo OAuth en el navegador y enviar `Authorization: Bearer <access_token>` al servidor MCP.

### Configurar el cliente en Salescaling

1. En la plataforma, ve a **Configuración → OAuth Clients** (o **Settings → OAuth Clients**).
2. Crea un nuevo cliente OAuth.
3. Añade las **Redirect URIs** permitidas. Para **Claude (Anthropic)** usa exactamente:

   `https://claude.ai/api/mcp/auth_callback`
4. Asigna los **scopes** que necesite el MCP (como mínimo `meetings:read` para las herramientas actuales de reuniones).
5. Guarda el cliente y copia el **`client_id`** (y el secreto solo si creaste un cliente confidencial; muchos clientes MCP usan cliente público con PKCE).

### Metadatos del servidor de autorización

Salescaling expone metadatos compatibles con descubrimiento OpenID en el propio endpoint MCP:

* `GET https://api.salescaling.com/api/v1/mcp/.well-known/openid-configuration`

Ahí encontrarás `issuer`, `authorization_endpoint`, `token_endpoint`, `revocation_endpoint` y scopes soportados (sustituye el host si usas otro entorno).

### Ejemplo: MCP para Claude con OAuth

Tras crear el OAuth Client con la redirect anterior, configura el cliente MCP con la URL del servidor MCP y los endpoints OAuth (ajusta dominios si tu tenant usa otra URL de app):

```json
{
  "mcpServers": {
    "salescaling": {
      "url": "https://api.salescaling.com/api/v1/mcp",
      "oauth": {
        "authorizationUrl": "https://app.salescaling.com/oauth/authorize",
        "tokenUrl": "https://api.salescaling.com/v1/oauth/token",
        "clientId": "<client_id_creado_en_oauth_clients>",
        "scopes": ["meetings:read"]
      }
    }
  }
}
```

**Resumen de URLs típicas**

| Uso                                     | URL                                           |
| --------------------------------------- | --------------------------------------------- |
| Servidor MCP                            | `https://api.salescaling.com/api/v1/mcp`      |
| Autorización (login usuario)            | `https://app.salescaling.com/oauth/authorize` |
| Token (intercambio código / refresh)    | `https://api.salescaling.com/v1/oauth/token`  |
| Redirect URI en Salescaling para Claude | `https://claude.ai/api/mcp/auth_callback`     |

Las peticiones al MCP usarán el token de acceso en el header `Authorization: Bearer …` en lugar de `X-API-Key`.

## Reuniones vs llamadas telefónicas

Salescaling guarda **videollamadas**, **reuniones presenciales** y **llamadas telefónicas** en la misma entidad de reunión. Para que la API MCP sea clara:

* Las herramientas cuyo nombre incluye **`meetings`** (`search_meetings`, `list_meetings`, `find_meetings_by_participant`) solo incluyen **videollamadas y presenciales** (no devuelven llamadas telefónicas).
* Las herramientas **`list_calls`**, **`search_calls`** y **`find_calls_by_participant`** están dedicadas a **llamadas telefónicas** y admiten filtros como dirección (`INBOUND` / `OUTBOUND`) y números de teléfono.
* **`get_meeting_transcript`**, **`get_meeting_summary`**, **`get_meeting_details`** y **`get_meeting_action_items`** funcionan con **cualquier** ID de reunión o llamada (el mismo identificador).

## Herramientas Disponibles

### 1. `search_meetings` - Búsqueda Avanzada

Busca **videollamadas y reuniones presenciales** por texto en títulos y/o transcripciones (Full Text Search). **No incluye llamadas telefónicas**; para eso usa `search_calls`.

**Parámetros:**

| Parámetro  | Tipo   | Requerido | Descripción                                   |
| ---------- | ------ | --------- | --------------------------------------------- |
| `query`    | string | Sí        | Término de búsqueda                           |
| `scope`    | string | No        | `title`, `sentences` o `all` (default: `all`) |
| `fromDate` | string | No        | Fecha inicio (YYYY-MM-DD)                     |
| `toDate`   | string | No        | Fecha fin (YYYY-MM-DD)                        |
| `limit`    | number | No        | Máximo 50 (default: 20)                       |

**Nota:** Solo actividades de tipo videollamada o presencial.

**Ejemplo:**

```json
{
  "name": "search_meetings",
  "arguments": {
    "query": "performance review",
    "scope": "all",
    "fromDate": "2024-12-01",
    "limit": 10
  }
}
```

### 2. `list_meetings` - Listar Reuniones

Lista **videollamadas y reuniones presenciales** con filtros estructurados (excluye llamadas telefónicas).

**Parámetros:**

| Parámetro      | Tipo      | Requerido | Descripción                                                  |
| -------------- | --------- | --------- | ------------------------------------------------------------ |
| `keyword`      | string    | No        | Búsqueda en nombres / título                                 |
| `fromDate`     | string    | No        | Fecha inicio                                                 |
| `toDate`       | string    | No        | Fecha fin                                                    |
| `limit`        | number    | No        | Máximo 50 (default: 20)                                      |
| `skip`         | number    | No        | Paginación (default: 0)                                      |
| `sortOrder`    | string    | No        | `asc` o `desc` — orden por fecha de inicio (default: `desc`) |
| `participants` | string\[] | No        | Emails de participantes                                      |
| `organizers`   | string\[] | No        | Emails de organizadores                                      |

**Ejemplo:**

```json
{
  "name": "list_meetings",
  "arguments": {
    "fromDate": "2024-12-01",
    "toDate": "2024-12-31",
    "participants": ["cliente@empresa.com"],
    "limit": 20
  }
}
```

### 3. `get_meeting_transcript` - Obtener Transcripción

Obtiene la transcripción detallada con atribución de speakers (reunión o llamada).

**Parámetros:**

| Parámetro      | Tipo   | Requerido | Descripción                              |
| -------------- | ------ | --------- | ---------------------------------------- |
| `transcriptId` | string | Sí        | ID de la reunión o llamada               |
| `language`     | string | No        | Código de idioma (ej: "es", "en")        |
| `maxSentences` | number | No        | Límite de oraciones (control de payload) |

**Control de Payload:**

* Auto-trunca en 10,000 oraciones si no se especifica `maxSentences`
* Indica en la respuesta si se truncó el contenido

**Ejemplo:**

```json
{
  "name": "get_meeting_transcript",
  "arguments": {
    "transcriptId": "meeting-uuid-here",
    "language": "es",
    "maxSentences": 100
  }
}
```

### 4. `get_meeting_summary` - Obtener Resumen

Obtiene el resumen generado por IA: texto (`summaryText`), **action items** (`actionItems` / `next_steps`), y según el tipo, **topics/highlights** (reuniones) o **call insights** (llamadas).

**Parámetros:**

| Parámetro      | Tipo   | Requerido | Descripción                |
| -------------- | ------ | --------- | -------------------------- |
| `transcriptId` | string | Sí        | ID de la reunión o llamada |
| `language`     | string | No        | Código de idioma           |

**Ejemplo:**

```json
{
  "name": "get_meeting_summary",
  "arguments": {
    "transcriptId": "meeting-uuid-here",
    "language": "es"
  }
}
```

### 5. `get_meeting_details` - Detalles Completos

Obtiene detalles completos de una reunión (metadatos + transcripción + resumen).

**Parámetros:**

| Parámetro           | Tipo    | Requerido | Descripción                           |
| ------------------- | ------- | --------- | ------------------------------------- |
| `id`                | string  | Sí        | ID de la reunión                      |
| `includeTranscript` | boolean | No        | Incluir transcripción (default: true) |
| `includeSummary`    | boolean | No        | Incluir resumen (default: true)       |
| `maxSentences`      | number  | No        | Límite de oraciones en transcript     |

**Ejemplo:**

```json
{
  "name": "get_meeting_details",
  "arguments": {
    "id": "meeting-uuid-here",
    "includeTranscript": true,
    "includeSummary": true,
    "maxSentences": 500
  }
}
```

### 6. `find_meetings_by_participant` - Buscar Reuniones por Participante

Encuentra reuniones donde participó una persona específica. Busca por nombre (coincidencia parcial) o email (coincidencia exacta).

**Parámetros:**

| Parámetro     | Tipo   | Requerido | Descripción                                                          |
| ------------- | ------ | --------- | -------------------------------------------------------------------- |
| `participant` | string | Sí        | Nombre o email del participante                                      |
| `fromDate`    | string | No        | Fecha inicio (YYYY-MM-DD)                                            |
| `toDate`      | string | No        | Fecha fin (YYYY-MM-DD)                                               |
| `limit`       | number | No        | Máximo 50 (default: 20)                                              |
| `skip`        | number | No        | Paginación (default: 0)                                              |
| `sortOrder`   | string | No        | `asc` o `desc` por fecha de inicio (default: `desc`)                 |
| `titleFilter` | string | No        | Filtro opcional sobre el título de la reunión (coincidencia parcial) |

**Características:**

* Solo **videollamadas y presenciales** (no llamadas telefónicas).
* **Búsqueda por email**: Coincidencia exacta (case-insensitive)
  * Ejemplo: `jon@empresa.com` encontrará solo ese email exacto
* **Búsqueda por nombre**: Coincidencia parcial
  * Ejemplo: `Jon` encontrará "Jon Smith", "Jonathan", "Jon Doe", etc.
* Retorna información completa de participantes y organizador
* Orden configurable con `sortOrder`

**Ejemplos:**

Buscar por email:

```json
{
  "name": "find_meetings_by_participant",
  "arguments": {
    "participant": "jon@empresa.com",
    "fromDate": "2024-12-01",
    "limit": 20
  }
}
```

Buscar por nombre:

```json
{
  "name": "find_meetings_by_participant",
  "arguments": {
    "participant": "Jon",
    "fromDate": "2024-01-01",
    "toDate": "2024-12-31",
    "limit": 50
  }
}
```

### 7. `list_calls` - Listar llamadas telefónicas

Lista solo **llamadas telefónicas** (`phonecall`), con filtros por fechas, título, participantes, dirección y números.

| Parámetro                 | Tipo      | Requerido | Descripción                                     |
| ------------------------- | --------- | --------- | ----------------------------------------------- |
| `titleFilter`             | string    | No        | Coincidencia parcial en el nombre/título        |
| `fromDate` / `toDate`     | string    | No        | Rango de fechas (YYYY-MM-DD)                    |
| `limit`                   | number    | No        | Máximo 50 (default: 20)                         |
| `skip`                    | number    | No        | Paginación                                      |
| `sortOrder`               | string    | No        | `asc` o `desc` (default: `desc`)                |
| `direction`               | string    | No        | `INBOUND` o `OUTBOUND`                          |
| `participants`            | string\[] | No        | Emails de participantes                         |
| `fromNumber` / `toNumber` | string    | No        | Filtro parcial por número de llamante o destino |

### 8. `search_calls` - Buscar en llamadas

Búsqueda en títulos y/o transcripciones **solo para llamadas telefónicas**. Parámetros similares a `search_meetings`, más `direction`, `fromNumber`, `toNumber` opcionales.

### 9. `find_calls_by_participant` - Llamadas por participante

Igual que `find_meetings_by_participant` pero solo para **llamadas telefónicas**, con los mismos filtros extra que `list_calls` (`titleFilter`, `sortOrder`, `direction`, números).

### 10. `get_meeting_action_items` - Action items del resumen

Devuelve los **next steps** estructurados del resumen IA para un ID de reunión o llamada.

| Parámetro   | Tipo   | Requerido |
| ----------- | ------ | --------- |
| `meetingId` | string | Sí        |
| `language`  | string | No        |

### 11. `get_meetings_statistics` - Estadísticas agregadas

Totales, duraciones medias por tipo de actividad, y **top participantes** (muestra acotada). Ámbito configurable:

| Parámetro             | Tipo   | Descripción                                                               |
| --------------------- | ------ | ------------------------------------------------------------------------- |
| `fromDate` / `toDate` | string | Rango opcional                                                            |
| `type`                | string | `meetings` (video+presencial), `calls` (solo teléfono), o `all` (default) |

## Configuración en Clientes MCP

Para **OAuth** (incluido Claude con redirect `https://claude.ai/api/mcp/auth_callback`), sigue la sección [Conexión MCP vía OAuth Clients](#mcp-oauth-clients).

### Claude Desktop (API Key)

1. Localiza tu archivo de configuración:
   * **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
   * **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
2. Agrega la configuración del servidor MCP:

```json
{
  "mcpServers": {
    "salescaling": {
      "url": "https://api.salescaling.com/api/v1/mcp",
      "headers": {
        "X-API-Key": "sk_tu_api_key_aqui"
      }
    }
  }
}
```

3. Reinicia Claude Desktop
4. Verifica que el servidor esté conectado:
   * Busca el ícono de herramientas en la interfaz
   * Deberías ver "salescaling" como servidor disponible
   * Las 11 herramientas deberían aparecer listadas

### Cursor IDE

1. Abre la configuración de Cursor (`Cmd/Ctrl + ,`)
2. Busca "MCP Servers" en la configuración
3. Agrega el servidor de Salescaling:

```json
{
  "mcp.servers": {
    "salescaling": {
      "url": "https://api.salescaling.com/api/v1/mcp",
      "headers": {
        "X-API-Key": "sk_tu_api_key_aqui"
      }
    }
  }
}
```

4. Reinicia Cursor
5. Usa el servidor desde el chat de Cursor:
   * Menciona "@salescaling" en el chat
   * O pide directamente: "Busca reuniones sobre performance"

### Otros Clientes MCP

Para cualquier cliente compatible con MCP:

1. **URL del servidor**: `https://api.salescaling.com/api/v1/mcp`
2. **Autenticación**: Header `X-API-Key` con tu API key
3. **Protocolo**: HTTP/HTTPS estándar
4. **Formato**: JSON

## Ejemplos de Uso

### Ejemplo 1: Buscar Reuniones con Claude

```
Usuario: "Busca reuniones sobre pricing del último mes"

Claude → POST /api/v1/mcp
{
  "name": "search_meetings",
  "arguments": {
    "query": "pricing",
    "scope": "all",
    "fromDate": "2024-12-01",
    "limit": 20
  }
}

Claude: "Encontré 5 reuniones sobre pricing:
1. Reunión de pricing con Acme Corp - 15 dic 2024
2. Review de estrategia de precios - 10 dic 2024
..."
```

### Ejemplo 2: Obtener Transcripción Completa

```
Usuario: "Dame la transcripción completa de la reunión con ID abc-123"

Claude → POST /api/v1/mcp
{
  "name": "get_meeting_transcript",
  "arguments": {
    "transcriptId": "abc-123",
    "language": "es"
  }
}

Claude: "Aquí está la transcripción de la reunión:
[00:00 - 00:15] Juan Pérez: Buenos días a todos..."
```

### Ejemplo 3: Análisis de Múltiples Reuniones

```
Usuario: "Analiza las reuniones de ventas de diciembre y dame insights"

Claude:
1. Lista reuniones → list_meetings (diciembre)
2. Para cada reunión → get_meeting_summary
3. Analiza patrones y genera insights

Claude: "He analizado 15 reuniones de diciembre:
- Temas más discutidos: pricing (8), implementación (6)
- Objeciones comunes: tiempo de implementación (5)
- Oportunidades identificadas: 3 cuentas enterprise..."
```

## Formato de Respuesta

Todas las herramientas retornan respuestas en formato MCP estándar:

```json
{
  "content": [
    {
      "type": "text",
      "text": "Descripción legible del resultado"
    },
    {
      "type": "resource",
      "resource": {
        "uri": "salescaling://meeting/xxx",
        "mimeType": "application/json",
        "text": "{...datos JSON estructurados...}"
      }
    }
  ]
}
```

## Seguridad y Privacidad

### Autenticación

* Las peticiones requieren **API key** (`X-API-Key`) **o** un **access token OAuth** (`Authorization: Bearer`) emitido para un OAuth Client autorizado
* Las API keys se gestionan desde **Configuración > API Keys**; los clientes OAuth desde **Configuración > OAuth Clients**
* Cada credencial está vinculada a tu organización (tenant)

### Aislamiento de Datos

* El servidor MCP respeta el aislamiento multi-tenant
* Solo puedes acceder a reuniones de tu organización
* Los permisos de OpenFGA se aplican automáticamente

### Mejores Prácticas

1. **Nunca compartas tu API key**: Trátala como una contraseña
2. **Usa variables de entorno**: No hardcodees la key en archivos
3. **Rota las keys periódicamente**: Crea nuevas keys y elimina las antiguas
4. **Establece fechas de expiración**: Para keys temporales o de prueba
5. **Monitorea el uso**: Revisa los logs de acceso regularmente

## Límites y Cuotas

### Rate Limiting

El servidor MCP comparte los mismos límites de la API pública:

* **Corto plazo**: 35 peticiones por segundo
* **Mediano plazo**: 200 peticiones cada 10 segundos
* **Largo plazo**: 1000 peticiones por minuto

### Límites de Payload

* **Transcripciones**: Auto-trunca en 10,000 oraciones
* **Búsquedas**: Máximo 50 resultados por petición
* **Listados**: Máximo 50 reuniones por petición

Usa el parámetro `maxSentences` para controlar el tamaño de las transcripciones.

## Troubleshooting

### Error: "Unauthorized - missing or invalid API key"

**Causa**: API key no válida o no proporcionada

**Solución**:

1. Verifica que el header `X-API-Key` esté presente
2. Confirma que la key sea válida en **Configuración > API Keys**
3. Verifica que la key no haya expirado

### Error: "Unknown tool: xxx"

**Causa**: Nombre de herramienta incorrecto

**Solución**:

1. Verifica el nombre de la herramienta (case-sensitive)
2. Usa `GET /api/v1/mcp` para ver las herramientas disponibles
3. Nombres válidos (entre otros): `search_meetings`, `list_meetings`, `get_meeting_transcript`, `get_meeting_summary`, `get_meeting_details`, `find_meetings_by_participant`, `list_calls`, `search_calls`, `find_calls_by_participant`, `get_meeting_action_items`, `get_meetings_statistics`

### Error: "Meeting not found"

**Causa**: ID de reunión no existe o no tienes acceso

**Solución**:

1. Verifica que el ID sea correcto
2. Confirma que la reunión pertenezca a tu organización
3. Usa `list_meetings` para obtener IDs válidos

### El servidor no aparece en Claude Desktop

**Solución**:

1. Verifica que el archivo de configuración esté en la ubicación correcta
2. Revisa que el JSON sea válido (sin errores de sintaxis)
3. Reinicia Claude Desktop completamente
4. Revisa los logs de Claude Desktop para errores

### Respuestas muy largas o timeouts

**Solución**:

1. Usa `maxSentences` para limitar transcripciones
2. Reduce el `limit` en búsquedas y listados
3. Usa `includeTranscript: false` si solo necesitas el resumen
4. Filtra por fechas para reducir el conjunto de datos

## Soporte

¿Necesitas ayuda con el servidor MCP?

* **Email**: <support@salescaling.com>
* **Documentación API**: <https://api.salescaling.com/api/docs>
* **Slack de la comunidad**: [Únete aquí](https://salescaling.com/slack)

## Recursos Adicionales

* [Especificación MCP Oficial](https://modelcontextprotocol.io)
* [API Pública de Salescaling](/api/introduction)
* [Gestión de API Keys](https://github.com/salescaling/web-platform/blob/main/apps/docs/configuraciones-de-la-plataforma/configuraciones-tecnicas/api-keys.md)
* [Webhooks](/api/webhooks)

***

**Última actualización**: Abril 2026


# Guía Rápida MCP

Esta guía te ayudará a conectar el servidor MCP de Salescaling con tu cliente favorito en menos de 5 minutos.

## Paso 1: Obtén tu API Key

1. Inicia sesión en [app.salescaling.com](https://app.salescaling.com)
2. Ve a **Configuración > API Keys**
3. Haz clic en **"Crear Nueva API Key"**
4. Dale un nombre (ej: "MCP Claude Desktop")
5. Copia la key

⚠️ **Importante**: Guarda la key en un lugar seguro, solo se muestra una vez.

## Paso 2: Configura tu Cliente

### Claude Desktop (Recomendado)

**macOS:**

1. Abre Terminal
2. Ejecuta:

```bash
nano ~/Library/Application\ Support/Claude/claude_desktop_config.json
```

3. Pega esta configuración (reemplaza `TU_API_KEY`):

```json
{
  "mcpServers": {
    "salescaling": {
      "url": "https://api.salescaling.com/api/v1/mcp",
      "headers": {
        "X-API-Key": "TU_API_KEY"
      }
    }
  }
}
```

4. Guarda (`Ctrl+O`, `Enter`, `Ctrl+X`)
5. Reinicia Claude Desktop

**Windows:**

1. Abre el Explorador de archivos
2. Navega a: `%APPDATA%\Claude\`
3. Abre `claude_desktop_config.json` con Notepad
4. Pega la configuración (reemplaza `TU_API_KEY`)
5. Guarda y reinicia Claude Desktop

### Claude u otros clientes con OAuth (sin API Key en el fichero)

Si tu cliente usa **OAuth Clients** en lugar de API key (por ejemplo Claude con inicio de sesión en el navegador):

1. En Salescaling: **Configuración → OAuth Clients** y crea un cliente.
2. Añade como **Redirect URI** la URL de Claude: `https://claude.ai/api/mcp/auth_callback`
3. Configura el bloque `oauth` del cliente MCP con `authorizationUrl`, `tokenUrl`, `clientId` y `scopes`.

La guía detallada, tabla de URLs y ejemplo JSON están en [Servidor MCP → Conexión MCP vía OAuth Clients](/api/mcp-server#mcp-oauth-clients).

### Cursor IDE

1. Abre Cursor
2. Ve a Configuración (`Cmd/Ctrl + ,`)
3. Busca "MCP"
4. Agrega:

```json
{
  "mcp.servers": {
    "salescaling": {
      "url": "https://api.salescaling.com/api/v1/mcp",
      "headers": {
        "X-API-Key": "TU_API_KEY"
      }
    }
  }
}
```

5. Reinicia Cursor

## Paso 3: Verifica la Conexión

### En Claude Desktop

1. Abre Claude Desktop
2. Busca el ícono de herramientas (🔧) en la barra lateral
3. Deberías ver "salescaling" listado
4. Haz clic para ver las 11 herramientas disponibles

### En Cursor

1. Abre el chat de Cursor
2. Escribe: `@salescaling`
3. Deberías ver el servidor disponible

## Paso 4: Prueba una Búsqueda

Prueba con este prompt en Claude o Cursor:

```
Busca mis reuniones de la última semana
```

Claude/Cursor debería:

1. Usar automáticamente la herramienta `list_meetings`
2. Mostrar tus reuniones recientes
3. Permitirte hacer preguntas de seguimiento

## Ejemplos de Prompts

Una vez conectado, prueba estos prompts:

### Búsqueda Básica

```
Busca reuniones sobre "pricing" del último mes
```

### Análisis de Reunión

```
Dame el resumen de la reunión con ID abc-123
```

### Análisis Agregado

```
Analiza todas mis reuniones de diciembre y dame insights sobre:
- Temas más discutidos
- Objeciones comunes
- Oportunidades identificadas
```

### Transcripción Completa

```
Muéstrame la transcripción completa de la última reunión con el cliente XYZ
```

### Búsqueda Avanzada

```
Busca reuniones donde se mencionó "implementación" o "timeline" 
en las transcripciones de los últimos 3 meses
```

## Solución de Problemas

### ❌ "No puedo encontrar el servidor salescaling"

**Solución:**

1. Verifica que el archivo de configuración esté en la ubicación correcta
2. Confirma que el JSON sea válido (sin comas extras)
3. Reinicia completamente el cliente
4. Revisa los logs del cliente para errores

### ❌ "Unauthorized - missing or invalid API key"

**Solución:**

1. Verifica que copiaste la API key completa
2. Confirma que la key no haya expirado
3. Revisa que no haya espacios extra al inicio o final
4. Genera una nueva key si es necesario

### ❌ "No encuentro el archivo de configuración"

**macOS:**

```bash
# Crea el directorio si no existe
mkdir -p ~/Library/Application\ Support/Claude/

# Crea el archivo
touch ~/Library/Application\ Support/Claude/claude_desktop_config.json
```

**Windows:**

```powershell
# Crea el directorio si no existe
New-Item -ItemType Directory -Force -Path "$env:APPDATA\Claude"

# Crea el archivo
New-Item -ItemType File -Force -Path "$env:APPDATA\Claude\claude_desktop_config.json"
```

### ❌ "Las respuestas son muy largas"

**Solución:** Pide explícitamente límites más pequeños:

```
Busca reuniones sobre pricing (máximo 5 resultados)
```

O para transcripciones:

```
Dame las primeras 50 oraciones de la transcripción de la reunión abc-123
```

## Próximos Pasos

* 📖 Lee la [documentación completa del servidor MCP](/api/mcp-server)
* 🔧 Explora las [11 herramientas disponibles](/api/mcp-server#herramientas-disponibles)
* 💡 Aprende sobre [casos de uso avanzados](/api/mcp-server#ejemplos-de-uso)
* 🔐 Revisa las [mejores prácticas de seguridad](/api/mcp-server#seguridad-y-privacidad)

## ¿Necesitas Ayuda?

* **Email**: <support@salescaling.com>
* **Documentación API**: <https://api.salescaling.com/api/docs>
* **Slack**: [Únete a la comunidad](https://salescaling.com/slack)

***

**Tiempo estimado**: 5 minutos ⏱️\
**Dificultad**: Principiante 🟢


# Calendars

Operations related to calendars

## Get calendars

> Retrieve a paginated list of calendars with optional filtering

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendars","description":"Operations related to calendars"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendars":{"get":{"operationId":"PublicApiCalendarController_getCalendars","summary":"Get calendars","description":"Retrieve a paginated list of calendars with optional filtering","parameters":[{"name":"name","required":false,"in":"query","description":"Filter calendars by name (partial match)","schema":{"type":"string"}},{"name":"isPrimary","required":false,"in":"query","description":"Filter calendars by primary status","schema":{"type":"boolean"}},{"name":"readOnly","required":false,"in":"query","description":"Filter calendars by read-only status","schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendars retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCalendarsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendars"]}}},"components":{"schemas":{"PublicApiGetCalendarsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Create calendar

> Create a new calendar

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendars","description":"Operations related to calendars"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendars":{"post":{"operationId":"PublicApiCalendarController_createCalendar","summary":"Create calendar","description":"Create a new calendar","parameters":[],"requestBody":{"required":true,"description":"Calendar data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCalendarDto"}}}},"responses":{"201":{"description":"Calendar created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCalendarResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendars"]}}},"components":{"schemas":{"PublicApiCreateCalendarDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"}},"required":["name"]},"PublicApiCreateCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Get calendar by ID

> Retrieve a specific calendar by its ID

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendars","description":"Operations related to calendars"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendars/{id}":{"get":{"operationId":"PublicApiCalendarController_getCalendarById","summary":"Get calendar by ID","description":"Retrieve a specific calendar by its ID","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendar retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCalendarByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendars"]}}},"components":{"schemas":{"PublicApiGetCalendarByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Update calendar

> Update an existing calendar

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendars","description":"Operations related to calendars"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendars/{id}":{"put":{"operationId":"PublicApiCalendarController_updateCalendar","summary":"Update calendar","description":"Update an existing calendar","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar ID","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Updated calendar data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCalendarDto"}}}},"responses":{"200":{"description":"Calendar updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCalendarResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendars"]}}},"components":{"schemas":{"PublicApiUpdateCalendarDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"}}},"PublicApiUpdateCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Delete calendar

> Delete a calendar by its ID

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendars","description":"Operations related to calendars"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendars/{id}":{"delete":{"operationId":"PublicApiCalendarController_deleteCalendar","summary":"Delete calendar","description":"Delete a calendar by its ID","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendar deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCalendarResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendars"]}}},"components":{"schemas":{"PublicApiDeleteCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```


# Calendar Events

Operations related to calendar events

## Get calendar events

> Retrieve a paginated list of calendar events with optional filtering

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendar Events","description":"Operations related to calendar events"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendar-events":{"get":{"operationId":"PublicApiCalendarEventController_getCalendarEvents","summary":"Get calendar events","description":"Retrieve a paginated list of calendar events with optional filtering","parameters":[{"name":"startDate","required":false,"in":"query","description":"Filter calendar events by start date","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Filter calendar events by end date","schema":{"type":"string"}},{"name":"calendarId","required":false,"in":"query","description":"Filter calendar events by calendar ID","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter calendar events by status","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendar events retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCalendarEventsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendar Events"]}}},"components":{"schemas":{"PublicApiGetCalendarEventsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## Create calendar event

> Create a new calendar event

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendar Events","description":"Operations related to calendar events"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendar-events":{"post":{"operationId":"PublicApiCalendarEventController_createCalendarEvent","summary":"Create calendar event","description":"Create a new calendar event","parameters":[],"requestBody":{"required":true,"description":"Calendar event data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCalendarEventDto"}}}},"responses":{"201":{"description":"Calendar event created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCalendarEventResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendar Events"]}}},"components":{"schemas":{"PublicApiCreateCalendarEventDto":{"type":"object","properties":{"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"meetingUrl":{"type":"string","description":"Meeting URL"},"metadata":{"type":"object","description":"Additional metadata for the event"}},"required":["calendarId","title","startDateTime","endDateTime"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCreateCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## Get calendar event by ID

> Retrieve a specific calendar event by its ID

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendar Events","description":"Operations related to calendar events"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendar-events/{id}":{"get":{"operationId":"PublicApiCalendarEventController_getCalendarEventById","summary":"Get calendar event by ID","description":"Retrieve a specific calendar event by its ID","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar event ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendar event retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCalendarEventByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendar Events"]}}},"components":{"schemas":{"PublicApiGetCalendarEventByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## Update calendar event

> Update an existing calendar event

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendar Events","description":"Operations related to calendar events"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendar-events/{id}":{"put":{"operationId":"PublicApiCalendarEventController_updateCalendarEvent","summary":"Update calendar event","description":"Update an existing calendar event","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar event ID","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Updated calendar event data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCalendarEventDto"}}}},"responses":{"200":{"description":"Calendar event updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCalendarEventResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendar Events"]}}},"components":{"schemas":{"PublicApiUpdateCalendarEventDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"meetingUrl":{"type":"string","description":"Meeting URL"},"metadata":{"type":"object","description":"Additional metadata for the event"}}},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiUpdateCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## Delete calendar event

> Delete a calendar event by its ID

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calendar Events","description":"Operations related to calendar events"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calendar-events/{id}":{"delete":{"operationId":"PublicApiCalendarEventController_deleteCalendarEvent","summary":"Delete calendar event","description":"Delete a calendar event by its ID","parameters":[{"name":"id","required":true,"in":"path","description":"Calendar event ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Calendar event deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCalendarEventResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calendar Events"]}}},"components":{"schemas":{"PublicApiDeleteCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```


# Calls

Operations related to calls

## Get all Calls

> Returns a list of calls with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls":{"get":{"operationId":"PublicApiCallController_getCalls","summary":"Get all Calls","description":"Returns a list of calls with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}},{"name":"name","required":false,"in":"query","description":"Call name to filter calls by (partial match).","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier for the call"},"status":{"type":"string","enum":["processing","completed"],"description":"Current status of the call"},"name":{"type":"string","description":"Name or title of the call"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the call started"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the call ended"},"duration":{"type":"number","description":"Duration of the call in seconds"},"description":{"type":"string","description":"Detailed description of the call"},"language":{"type":"string","description":"Language of the call in ISO 639-1 format"},"direction":{"type":"string","description":"Direction of the call (inbound/outbound)"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"callType":{"description":"Call type associated with this call","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingCallTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the call"},"url":{"type":"string","description":"URL of the call"}},"required":["callId","status","name","startDateTime","direction","url"]},"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## Upload Call

> Uploads a call. You can either provide a mediaUrl in the body or upload a file directly.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/upload":{"post":{"operationId":"PublicApiCallController_uploadCall","summary":"Upload Call","description":"Uploads a call. You can either provide a mediaUrl in the body or upload a file directly.","parameters":[],"requestBody":{"required":true,"description":"Call data and optional file upload","content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PublicApiCallUploadRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiPostCallUploadResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiCallUploadRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the call for uploading"},"mediaUrl":{"type":"string","description":"URL of the media file to upload (alternative to file upload)"},"startDateTime":{"format":"date-time","type":"string","description":"Scheduled start date and time of the call"},"description":{"type":"string","description":"Description of the call"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"file":{"type":"string","description":"Audio file to upload (alternative to mediaUrl). It must be a valid mp3 / wav file","format":"binary"},"ownerId":{"type":"string","description":"ID of the user who owns this call"},"personIds":{"description":"Array of person IDs for call participants. Use comma to separate values. Recommendation: include the owner's personId here to guarantee feedback generation.","type":"array","items":{"type":"string"}}},"required":["name","startDateTime"]},"PublicApiPostCallUploadResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallUploadResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallUploadResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the uploaded call"}},"required":["callId"]}}}}
```

## Get Call by ID

> Get a call by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}":{"get":{"operationId":"PublicApiCallController_getCallById","summary":"Get Call by ID","description":"Get a call by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier for the call"},"status":{"type":"string","enum":["processing","completed"],"description":"Current status of the call"},"name":{"type":"string","description":"Name or title of the call"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the call started"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the call ended"},"duration":{"type":"number","description":"Duration of the call in seconds"},"description":{"type":"string","description":"Detailed description of the call"},"language":{"type":"string","description":"Language of the call in ISO 639-1 format"},"direction":{"type":"string","description":"Direction of the call (inbound/outbound)"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"callType":{"description":"Call type associated with this call","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingCallTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the call"},"url":{"type":"string","description":"URL of the call"}},"required":["callId","status","name","startDateTime","direction","url"]},"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## Delete Call

> Deletes a call by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}":{"delete":{"operationId":"PublicApiCallController_deleteCall","summary":"Delete Call","description":"Deletes a call by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCallByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiDeleteCallByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Call Participants

> Returns a list of participants for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/participants":{"get":{"operationId":"PublicApiCallController_getCallParticipants","summary":"Get Call Participants","description":"Returns a list of participants for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get participants from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallParticipantsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallParticipantsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallParticipantsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallParticipantsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"participants":{"description":"List of participants in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallParticipantDto"}}},"required":["callId","participants"]},"PublicApiCallParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"phone":{"type":"string","description":"Phone number of the participant"},"isHost":{"type":"boolean","description":"Whether the participant is the host of the call"},"isInternal":{"type":"boolean","description":"Whether the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## Get Call Summary

> Returns a summary for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/summary":{"get":{"operationId":"PublicApiCallController_getCallSummary","summary":"Get Call Summary","description":"Returns a summary for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get summary from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallSummaryResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallSummaryResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallSummaryResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallSummaryResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"summary":{"type":"string","description":"Summary of the call"},"nextSteps":{"description":"List of next steps identified during the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the call"},"insights":{"type":"object","description":"Call insights"}},"required":["callId"]},"PublicApiCallNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step"}},"required":["action","actors","deadline"]}}}}
```

## Get Call Transcript

> Returns a transcript for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/transcript":{"get":{"operationId":"PublicApiCallController_getCallTranscript","summary":"Get Call Transcript","description":"Returns a transcript for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get transcript from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallTranscriptResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallTranscriptResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallTranscriptResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallTranscriptResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"transcript":{"description":"List of transcript segments for the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTranscriptSegmentDto"}}},"required":["callId","transcript"]},"PublicApiCallTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## Get Call Notes

> Returns a list of notes for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/notes":{"get":{"operationId":"PublicApiCallController_getCallNotes","summary":"Get Call Notes","description":"Returns a list of notes for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get notes from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallNotesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallNotesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallNotesResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallNotesResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"notes":{"description":"List of notes from the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}}},"required":["callId","notes"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## Get Call Chat

> Returns a chat for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/chat":{"get":{"operationId":"PublicApiCallController_getCallChat","summary":"Get Call Chat","description":"Returns a chat for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get chat from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallChatResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallChatResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallChatResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallChatResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"messages":{"description":"List of chat messages in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallChatMessageDto"}}},"required":["callId","messages"]},"PublicApiCallChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question asked in the chat"},"answer":{"type":"string","description":"Answer provided in the chat"}},"required":["question","answer"]}}}}
```

## Get Call Contacts

> Returns a list of contacts for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/contacts":{"get":{"operationId":"PublicApiCallController_getCallContacts","summary":"Get Call Contacts","description":"Returns a list of contacts for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get contacts from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallContactsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## Get Call Companies

> Returns a list of companies for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/companies":{"get":{"operationId":"PublicApiCallController_getCallCompanies","summary":"Get Call Companies","description":"Returns a list of companies for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get companies from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallCompaniesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## Get Call Opportunities

> Returns a list of opportunities for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/opportunities":{"get":{"operationId":"PublicApiCallController_getCallOpportunities","summary":"Get Call Opportunities","description":"Returns a list of opportunities for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get opportunities from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallOpportunitiesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## Get Call Analytics

> Returns participation and intervention analytics for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/analytics":{"get":{"operationId":"PublicApiCallController_getCallAnalytics","summary":"Get Call Analytics","description":"Returns participation and intervention analytics for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get analytics from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallAnalyticsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallAnalyticsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallAnalyticsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallAnalyticsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["callId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## Get Call Score

> Returns the AI score, its justification, and evaluated objectives for a given call ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Calls","description":"Operations related to calls"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/calls/{id}/score":{"get":{"operationId":"PublicApiCallController_getCallScore","summary":"Get Call Score","description":"Returns the AI score, its justification, and evaluated objectives for a given call ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call ID to get score from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallScoreResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Calls"]}}},"components":{"schemas":{"PublicApiGetCallScoreResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallScoreResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallScoreResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"score":{"type":"number","description":"Overall AI score for the call (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["callId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```


# Call Notes

Operations related to call notes

## Get all call notes

> Returns a list of call notes with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Call Notes","description":"Operations related to call notes"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/call-notes":{"get":{"operationId":"PublicApiCallNoteController_getCallNotes","summary":"Get all call notes","description":"Returns a list of call notes with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallNotesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Call Notes"]}}},"components":{"schemas":{"PublicApiGetCallNotesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallNotesResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallNotesResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"notes":{"description":"List of notes from the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}}},"required":["callId","notes"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## Get call note by ID

> Returns a call note by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Call Notes","description":"Operations related to call notes"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/call-notes/{id}":{"get":{"operationId":"PublicApiCallNoteController_getCallNoteById","summary":"Get call note by ID","description":"Returns a call note by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call note ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallNoteByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Call Notes"]}}},"components":{"schemas":{"PublicApiGetCallNoteByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```


# Call Types

Operations related to call types

## Get all call types

> Returns a list of call types with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Call Types","description":"Operations related to call types"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/call-types":{"get":{"operationId":"PublicApiCallTypeController_getCallTypes","summary":"Get all call types","description":"Returns a list of call types with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallTypesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Call Types"]}}},"components":{"schemas":{"PublicApiGetCallTypesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting type"},"name":{"type":"string","description":"Name of the meeting type"},"description":{"type":"string","description":"Description of the meeting type"},"isEnabled":{"type":"boolean","description":"Whether the meeting type is enabled"},"score":{"description":"Scores associated with the meeting type","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeScoreDto"}},"type":{"type":"string","description":"Type of meeting","enum":["videocall","presential","phonecall"]}},"required":["id","name","isEnabled","type"]},"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```

## Get call type by ID

> Returns a call type by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Call Types","description":"Operations related to call types"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/call-types/{id}":{"get":{"operationId":"PublicApiCallTypeController_getCallTypeById","summary":"Get call type by ID","description":"Returns a call type by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Call type ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCallTypeByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Call Types"]}}},"components":{"schemas":{"PublicApiGetCallTypeByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallTypeDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting type"},"name":{"type":"string","description":"Name of the meeting type"},"description":{"type":"string","description":"Description of the meeting type"},"isEnabled":{"type":"boolean","description":"Whether the meeting type is enabled"},"score":{"description":"Scores associated with the meeting type","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeScoreDto"}},"type":{"type":"string","description":"Type of meeting","enum":["videocall","presential","phonecall"]}},"required":["id","name","isEnabled","type"]},"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```


# Companies

Operations related to companies

## Get all Companies

> Returns a list of companies with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies":{"get":{"operationId":"PublicApiCompanyController_getCompanies","summary":"Get all Companies","description":"Returns a list of companies with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}},{"name":"name","required":false,"in":"query","description":"Company name to filter companies by (partial match).","schema":{"type":"string"}},{"name":"domain","required":false,"in":"query","description":"Company domain to filter companies by (partial match).","schema":{"type":"string"}},{"name":"opportunityId","required":false,"in":"query","description":"Opportunity ID to filter companies by opportunity relationship.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompaniesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Create Company

> Creates a new company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies":{"post":{"operationId":"PublicApiCompanyController_createCompany","summary":"Create Company","description":"Creates a new company.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiCreateCompanyDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"}},"required":["name","domain"]},"PublicApiCreateCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Get Company Details tab payload

> Returns the same aggregate shown in the platform company Details tab: commercial state (sales moment), latest AI company status (current narrative, needs, objections), and the suggested-actions/signals bundle.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/details":{"get":{"operationId":"PublicApiCompanyController_getCompanyDetailsTab","summary":"Get Company Details tab payload","description":"Returns the same aggregate shown in the platform company Details tab: commercial state (sales moment), latest AI company status (current narrative, needs, objections), and the suggested-actions/signals bundle.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompanyDetailsTabResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompanyDetailsTabResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDetailsTabDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDetailsTabDto":{"type":"object","properties":{"commercialState":{"nullable":true,"description":"Commercial “sales moment”; same JSON as company.commercial_state when present.","allOf":[{"$ref":"#/components/schemas/PublicApiCommercialStateDto"}]},"aiStatus":{"nullable":true,"description":"Latest AI company_status row (Current status, Needs, Objections).","allOf":[{"$ref":"#/components/schemas/PublicApiCompanyAiStatusDto"}]},"suggestedActions":{"nullable":true,"description":"Suggested actions + signal summaries from company.suggested_actions.","allOf":[{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsBundleDto"}]}}},"PublicApiCommercialStateDto":{"type":"object","properties":{"state":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"confidence":{"type":"number","description":"Internal confidence score 0-1"},"confidenceLevel":{"type":"string","enum":["low","medium","high"]},"whyNow":{"type":"string"},"subMotives":{"type":"array","items":{"type":"string"}},"recommendedAction":{"$ref":"#/components/schemas/PublicApiRecommendedActionDto"},"lastCalculatedAt":{"type":"string"},"stateChangedAt":{"type":"string"},"previousState":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"triggerSignals":{"type":"array","items":{"type":"string"}}},"required":["state","confidence","confidenceLevel","whyNow","subMotives","recommendedAction","lastCalculatedAt","triggerSignals"]},"PublicApiRecommendedActionDto":{"type":"object","properties":{"actionType":{"type":"string","enum":["next_step","send_case_study","call_decision_maker","address_objection","schedule_demo","send_proposal","follow_up","escalate","discovery_call","check_in","propose_expansion"]},"instruction":{"type":"string"},"suggestedMessage":{"type":"string"},"deadline":{"type":"string"}},"required":["actionType","instruction"]},"PublicApiCompanyAiStatusDto":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"state":{"$ref":"#/components/schemas/PublicApiCompanyStatusStateDto"}},"required":["id","createdAt","updatedAt","state"]},"PublicApiCompanyStatusStateDto":{"type":"object","properties":{"currentState":{"description":"Paragraphs shown as “Current status” in the UI (Markdown source segments).","type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}},"objections":{"type":"array","items":{"type":"string"}}},"required":["currentState","needs","objections"]},"PublicApiCompanySuggestedActionsBundleDto":{"type":"object","properties":{"suggestedActions":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSuggestedActionDto"}},"signals":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalSummaryItemDto"}},"lastUpdated":{"type":"string"},"metadata":{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsMetadataDto"}},"required":["suggestedActions","signals","lastUpdated","metadata"]},"PublicApiSuggestedActionDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","enum":["positive","risk","neutral"]},"relatedSignals":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number"},"relevanceScore":{"type":"number"},"firstDetectedAt":{"type":"string"},"lastDetectedAt":{"type":"string"},"occurrences":{"type":"number"},"activityIds":{"type":"array","items":{"type":"string"}},"activityNames":{"type":"array","items":{"type":"string"}},"activityTypes":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","priority","category","relatedSignals","confidence","relevanceScore","firstDetectedAt","lastDetectedAt","occurrences","activityIds"]},"PublicApiSignalSummaryItemDto":{"type":"object","properties":{"signalTypeCode":{"type":"string"},"signalTypeTitle":{"type":"string"},"signalTypeDescription":{"type":"string"},"signalTypeCategory":{"type":"string","enum":["positive","risk","neutral"]},"value":{"type":"string"},"changeType":{"type":"string","nullable":true},"detectedAt":{"type":"string"},"activityId":{"type":"string"},"activityName":{"type":"string"},"activityType":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalEvidenceDto"}},"relevanceScore":{"type":"number"}},"required":["signalTypeCode","signalTypeTitle","signalTypeDescription","signalTypeCategory","value","detectedAt","activityId","evidence","relevanceScore"]},"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]},"PublicApiCompanySuggestedActionsMetadataDto":{"type":"object","properties":{"totalSignals":{"type":"number"},"signalsByCategory":{"$ref":"#/components/schemas/PublicApiSignalsByCategoryDto"},"decayHalfLifeDays":{"type":"number"}},"required":["totalSignals","signalsByCategory","decayHalfLifeDays"]},"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## Get Company by ID

> Get a company by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}":{"get":{"operationId":"PublicApiCompanyController_getCompanyById","summary":"Get Company by ID","description":"Get a company by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompanyByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompanyByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Update Company

> Updates an existing company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}":{"put":{"operationId":"PublicApiCompanyController_updateCompany","summary":"Update Company","description":"Updates an existing company.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to update.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCompanyDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiUpdateCompanyDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"}}},"PublicApiUpdateCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Delete Company

> Deletes a company by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}":{"delete":{"operationId":"PublicApiCompanyController_deleteCompany","summary":"Delete Company","description":"Deletes a company by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiDeleteCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Company Integrations

> Returns a list of integrations for a given company ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/integrations":{"get":{"operationId":"PublicApiCompanyController_getCompanyIntegrations","summary":"Get Company Integrations","description":"Returns a list of integrations for a given company ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to get integrations from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompanyIntegrationsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompanyIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyIntegrationsResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"integrations":{"description":"List of company integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyIntegrationDto"}}},"required":["companyId","integrations"]},"PublicApiCompanyIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## Get Company Contacts

> Returns a list of contacts associated with a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/contacts":{"get":{"operationId":"PublicApiCompanyController_getCompanyContacts","summary":"Get Company Contacts","description":"Returns a list of contacts associated with a company.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to get contacts from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompanyContactsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompanyContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## Create Company Contact Relationship

> Creates a relationship between a company and a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/contacts":{"post":{"operationId":"PublicApiCompanyController_createCompanyContact","summary":"Create Company Contact Relationship","description":"Creates a relationship between a company and a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyContactDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiCreateCompanyContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]},"PublicApiCreateCompanyContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Company Opportunities

> Returns a list of opportunities associated with a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/opportunities":{"get":{"operationId":"PublicApiCompanyController_getCompanyOpportunities","summary":"Get Company Opportunities","description":"Returns a list of opportunities associated with a company.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to get opportunities from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetCompanyOpportunitiesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetCompanyOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## Create Company Opportunity Relationship

> Creates a relationship between a company and an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/opportunities":{"post":{"operationId":"PublicApiCompanyController_createCompanyOpportunity","summary":"Create Company Opportunity Relationship","description":"Creates a relationship between a company and an opportunity.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyOpportunityDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateCompanyOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiCreateCompanyOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]},"PublicApiCreateCompanyOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Company Meetings

> Returns meetings linked to the company (via meeting-company relations).

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/meetings":{"get":{"operationId":"PublicApiCompanyController_getCompanyMeetings","summary":"Get Company Meetings","description":"Returns meetings linked to the company (via meeting-company relations).","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID to list meetings for.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Delete Company Contact Relationship

> Deletes a relationship between a company and a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/contacts/{contactId}":{"delete":{"operationId":"PublicApiCompanyController_deleteCompanyContact","summary":"Delete Company Contact Relationship","description":"Deletes a relationship between a company and a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","description":"Contact ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCompanyContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiDeleteCompanyContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Delete Company Opportunity Relationship

> Deletes a relationship between a company and an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Companies","description":"Operations related to companies"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/companies/{id}/opportunities/{opportunityId}":{"delete":{"operationId":"PublicApiCompanyController_deleteCompanyOpportunity","summary":"Delete Company Opportunity Relationship","description":"Deletes a relationship between a company and an opportunity.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"opportunityId","required":true,"in":"path","description":"Opportunity ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteCompanyOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Companies"]}}},"components":{"schemas":{"PublicApiDeleteCompanyOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```


# Contacts

Operations related to contacts

## Get all Contacts

> Returns a list of contacts with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts":{"get":{"operationId":"PublicApiContactController_getContacts","summary":"Get all Contacts","description":"Returns a list of contacts with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}},{"name":"email","required":false,"in":"query","description":"Contact email to filter contacts by (partial match).","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Contact name to filter contacts by (partial match).","schema":{"type":"string"}},{"name":"opportunityId","required":false,"in":"query","description":"Opportunity ID to filter contacts by.","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Company ID to filter contacts by.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetContactsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## Create Contact

> Creates a new contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts":{"post":{"operationId":"PublicApiContactController_createContact","summary":"Create Contact","description":"Creates a new contact.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiCreateContactDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"}},"required":["email"]},"PublicApiCreateContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## Get Contact by ID

> Get a contact by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}":{"get":{"operationId":"PublicApiContactController_getContactById","summary":"Get Contact by ID","description":"Get a contact by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetContactByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetContactByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## Update Contact

> Updates an existing contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}":{"put":{"operationId":"PublicApiContactController_updateContact","summary":"Update Contact","description":"Updates an existing contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to update.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateContactDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiUpdateContactDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"}}},"PublicApiUpdateContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## Delete Contact

> Deletes a contact by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}":{"delete":{"operationId":"PublicApiContactController_deleteContact","summary":"Delete Contact","description":"Deletes a contact by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiDeleteContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Contact Integrations

> Returns a list of integrations for a given contact ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/integrations":{"get":{"operationId":"PublicApiContactController_getContactIntegrations","summary":"Get Contact Integrations","description":"Returns a list of integrations for a given contact ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to get integrations from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetContactIntegrationsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetContactIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactIntegrationsResponseDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"integrations":{"description":"List of contact integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiContactIntegrationDto"}}},"required":["contactId","integrations"]},"PublicApiContactIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## Get Contact Companies

> Returns a list of companies associated with a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/companies":{"get":{"operationId":"PublicApiContactController_getContactCompanies","summary":"Get Contact Companies","description":"Returns a list of companies associated with a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to get companies from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetContactCompaniesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetContactCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"}},"required":["companyId","companyName"]}}}}
```

## Create Contact Company Relationship

> Creates a relationship between a contact and a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/companies":{"post":{"operationId":"PublicApiContactController_createContactCompany","summary":"Create Contact Company Relationship","description":"Creates a relationship between a contact and a company.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactCompanyDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiCreateContactCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]},"PublicApiCreateContactCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Contact Opportunities

> Returns a list of opportunities associated with a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/opportunities":{"get":{"operationId":"PublicApiContactController_getContactOpportunities","summary":"Get Contact Opportunities","description":"Returns a list of opportunities associated with a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to get opportunities from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetContactOpportunitiesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetContactOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## Create Contact Opportunity Relationship

> Creates a relationship between a contact and an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/opportunities":{"post":{"operationId":"PublicApiContactController_createContactOpportunity","summary":"Create Contact Opportunity Relationship","description":"Creates a relationship between a contact and an opportunity.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactOpportunityDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateContactOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiCreateContactOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]},"PublicApiCreateContactOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Contact Meetings

> Returns meetings linked to the contact (via meeting-contact relations).

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/meetings":{"get":{"operationId":"PublicApiContactController_getContactMeetings","summary":"Get Contact Meetings","description":"Returns meetings linked to the contact (via meeting-contact relations).","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID to list meetings for.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Delete Contact Company Relationship

> Deletes a relationship between a contact and a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/companies/{companyId}":{"delete":{"operationId":"PublicApiContactController_deleteContactCompany","summary":"Delete Contact Company Relationship","description":"Deletes a relationship between a contact and a company.","parameters":[{"name":"id","required":true,"in":"path","description":"Contact ID.","schema":{"type":"string"}},{"name":"companyId","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteContactCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiDeleteContactCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Delete Contact Opportunity Relationship

> Deletes a relationship between a contact and an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Contacts","description":"Operations related to contacts"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/contacts/{id}/opportunities/{opportunityId}":{"delete":{"operationId":"PublicApiContactController_deleteContactOpportunity","summary":"Delete Contact Opportunity Relationship","description":"Deletes a relationship between a contact and an opportunity.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"opportunityId","required":true,"in":"path","description":"Opportunity ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteContactOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Contacts"]}}},"components":{"schemas":{"PublicApiDeleteContactOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```


# Meetings

Operations related to meetings

## Get all Meetings

> Returns a list of meetings with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings":{"get":{"operationId":"PublicApiMeetingController_getMeetings","summary":"Get all Meetings","description":"Returns a list of meetings with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}},{"name":"calendarEventId","required":false,"in":"query","description":"Calendar event ID to filter meetings by.","schema":{"type":"string"}},{"name":"name","required":false,"in":"query","description":"Meeting name to filter meetings by (partial match).","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Upload Meeting

> Uploads a meeting. You can either provide a mediaUrl in the body or upload a file directly.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/upload":{"post":{"operationId":"PublicApiMeetingController_uploadMeeting","summary":"Upload Meeting","description":"Uploads a meeting. You can either provide a mediaUrl in the body or upload a file directly.","parameters":[],"requestBody":{"required":true,"description":"Meeting data and optional file upload","content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PublicApiMeetingUploadRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiPostMeetingUploadResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiMeetingUploadRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the meeting for uploading"},"mediaUrl":{"type":"string","description":"URL of the media file to upload (alternative to file upload)"},"startDateTime":{"format":"date-time","type":"string","description":"Scheduled start date and time of the meeting"},"description":{"type":"string","description":"Description of the meeting "},"file":{"type":"string","description":"Video file to upload (alternative to mediaUrl)","format":"binary"},"ownerId":{"type":"string","description":"ID of the user who owns this meeting"},"personIds":{"description":"Array of person IDs for this meeting participants. Use comma to separate the values","type":"array","items":{"type":"string"}}},"required":["name","startDateTime"]},"PublicApiPostMeetingUploadResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingUploadResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingUploadResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the uploaded meeting"}},"required":["meetingId"]}}}}
```

## Get Meeting

> Get a meeting by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}":{"get":{"operationId":"PublicApiMeetingController_getMeetingById","summary":"Get Meeting","description":"Get a meeting by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Delete Meeting

> Deletes a meeting by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}":{"delete":{"operationId":"PublicApiMeetingController_deleteMeeting","summary":"Delete Meeting","description":"Deletes a meeting by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteMeetingByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiDeleteMeetingByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Meeting Participants

> Returns a list of participants for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/participants":{"get":{"operationId":"PublicApiMeetingController_getMeetingParticipants","summary":"Get Meeting Participants","description":"Returns a list of participants for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get participants from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingMeetingParticipantsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingMeetingParticipantsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiGetMeetingParticipantsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiGetMeetingParticipantsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"participants":{"description":"List of participants in the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingParticipantDto"}}},"required":["meetingId","participants"]},"PublicApiMeetingParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"email":{"type":"string","description":"Email address of the participant"},"isHost":{"type":"boolean","description":"Indicates if the participant is the host"},"isInternal":{"type":"boolean","description":"Indicates if the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## Get Meeting Summary

> Returns a summary for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/summary":{"get":{"operationId":"PublicApiMeetingController_getMeetingSummary","summary":"Get Meeting Summary","description":"Returns a summary for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get summary from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingSummaryResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingSummaryResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingSummaryResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingSummaryResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"summary":{"type":"string","description":"Summary of the meeting "},"nextSteps":{"description":"List of next steps identified during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the meeting "},"topics":{"description":"List of topics discussed during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingTopicDto"}}},"required":["meetingId"]},"PublicApiMeetingNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step (consider Date if deadline is meant to be a date, using string for example)"}},"required":["action","actors","deadline"]},"PublicApiMeetingTopicDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the topic discussed"},"description":{"type":"string","description":"Description of the topic discussed"}},"required":["title","description"]}}}}
```

## Get Meeting Transcript

> Returns a transcript for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/transcript":{"get":{"operationId":"PublicApiMeetingController_getMeetingTranscript","summary":"Get Meeting Transcript","description":"Returns a transcript for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get transcript from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingTranscriptResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingTranscriptResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingTranscriptResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTranscriptResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"transcript":{"description":"List of transcript segments for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiTranscriptSegmentDto"}}},"required":["meetingId","transcript"]},"PublicApiTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## Get Meeting Notes

> Returns a list of notes for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/notes":{"get":{"operationId":"PublicApiMeetingController_getMeetingNotes","summary":"Get Meeting Notes","description":"Returns a list of notes for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get notes from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingMeetingNotesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingMeetingNotesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingMeetingNotesResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingMeetingNotesResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"notes":{"description":"List of notes taken during the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}}},"required":["meetingId","notes"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## Get Meeting Chat

> Returns a chat for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/chat":{"get":{"operationId":"PublicApiMeetingController_getMeetingChats","summary":"Get Meeting Chat","description":"Returns a chat for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get chat from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingChatResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingChatResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingChatResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingChatResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"messages":{"description":"List of chat messages for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingChatMessageDto"}}},"required":["meetingId","messages"]},"PublicApiMeetingChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question of the chat message"},"answer":{"type":"string","description":"Answer of the chat message"}},"required":["question","answer"]}}}}
```

## Get Meeting Contacts

> Returns a list of contacts for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/contacts":{"get":{"operationId":"PublicApiMeetingController_getMeetingContacts","summary":"Get Meeting Contacts","description":"Returns a list of contacts for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get contacts from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingContactsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## Get Meeting Companies

> Returns a list of companies for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/companies":{"get":{"operationId":"PublicApiMeetingController_getMeetingCompanies","summary":"Get Meeting Companies","description":"Returns a list of companies for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get companies from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingCompaniesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## Get Meeting Opportunities

> Returns a list of opportunities for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/opportunities":{"get":{"operationId":"PublicApiMeetingController_getMeetingOpportunities","summary":"Get Meeting Opportunities","description":"Returns a list of opportunities for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get opportunities from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingOpportunitiesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## Get Meeting Analytics

> Returns participation and intervention analytics for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/analytics":{"get":{"operationId":"PublicApiMeetingController_getMeetingAnalytics","summary":"Get Meeting Analytics","description":"Returns participation and intervention analytics for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get analytics from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingAnalyticsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingAnalyticsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingAnalyticsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingAnalyticsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["meetingId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## Get Meeting Score

> Returns the AI score, its justification, and evaluated objectives for a given meeting ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meetings","description":"Operations related to meetings"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meetings/{id}/score":{"get":{"operationId":"PublicApiMeetingController_getMeetingScore","summary":"Get Meeting Score","description":"Returns the AI score, its justification, and evaluated objectives for a given meeting ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to get score from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingScoreResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meetings"]}}},"components":{"schemas":{"PublicApiGetMeetingScoreResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingScoreResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingScoreResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"score":{"type":"number","description":"Overall AI score for the meeting (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["meetingId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```


# Meeting Notes

Operations related to meeting notes

## Get all meeting notes

> Returns a list of meeting notes with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meeting Notes","description":"Operations related to meeting notes"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meeting-notes":{"get":{"operationId":"PublicApiMeetingNoteController_getMeetingNotes","summary":"Get all meeting notes","description":"Returns a list of meeting notes with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingNotesListResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meeting Notes"]}}},"components":{"schemas":{"PublicApiGetMeetingNotesListResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## Get meeting note by ID

> Returns a meeting note by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meeting Notes","description":"Operations related to meeting notes"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meeting-notes/{id}":{"get":{"operationId":"PublicApiMeetingNoteController_getMeetingNoteById","summary":"Get meeting note by ID","description":"Returns a meeting note by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingNoteByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meeting Notes"]}}},"components":{"schemas":{"PublicApiGetMeetingNoteByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```


# Meeting Types

Operations related to meeting types

## Get all meeting types

> Returns a list of meeting types with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meeting Types","description":"Operations related to meeting types"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meeting-types":{"get":{"operationId":"PublicApiMeetingTypeController_getMeetingTypes","summary":"Get all meeting types","description":"Returns a list of meeting types with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingTypesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meeting Types"]}}},"components":{"schemas":{"PublicApiGetMeetingTypesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Get meeting type by ID

> Returns a meeting type by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Meeting Types","description":"Operations related to meeting types"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/meeting-types/{id}":{"get":{"operationId":"PublicApiMeetingTypeController_getMeetingTypeById","summary":"Get meeting type by ID","description":"Returns a meeting type by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Meeting ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingTypeByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Meeting Types"]}}},"components":{"schemas":{"PublicApiGetMeetingTypeByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```


# Opportunities

Operations related to opportunities

## Get all Opportunities

> Returns a list of opportunities with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities":{"get":{"operationId":"PublicApiOpportunityController_getOpportunities","summary":"Get all Opportunities","description":"Returns a list of opportunities with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}},{"name":"name","required":false,"in":"query","description":"Opportunity name to filter opportunities by (partial match).","schema":{"type":"string"}},{"name":"contactId","required":false,"in":"query","description":"Contact ID to filter opportunities by contact relationship.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetOpportunitiesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Create Opportunity

> Creates a new opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities":{"post":{"operationId":"PublicApiOpportunityController_createOpportunity","summary":"Create Opportunity","description":"Creates a new opportunity.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiCreateOpportunityDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]}},"required":["name"]},"PublicApiCreateOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Get Opportunity by ID

> Get an opportunity by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}":{"get":{"operationId":"PublicApiOpportunityController_getOpportunityById","summary":"Get Opportunity by ID","description":"Get an opportunity by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to retrieve.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetOpportunityByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetOpportunityByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Update Opportunity

> Updates an existing opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}":{"put":{"operationId":"PublicApiOpportunityController_updateOpportunity","summary":"Update Opportunity","description":"Updates an existing opportunity.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to update.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateOpportunityDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUpdateOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiUpdateOpportunityDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]}}},"PublicApiUpdateOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## Delete Opportunity

> Deletes an opportunity by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}":{"delete":{"operationId":"PublicApiOpportunityController_deleteOpportunity","summary":"Delete Opportunity","description":"Deletes an opportunity by ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to delete.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteOpportunityResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiDeleteOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Opportunity Integrations

> Returns a list of integrations for a given opportunity ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/integrations":{"get":{"operationId":"PublicApiOpportunityController_getOpportunityIntegrations","summary":"Get Opportunity Integrations","description":"Returns a list of integrations for a given opportunity ID.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to get integrations from.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetOpportunityIntegrationsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetOpportunityIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityIntegrationsResponseDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"integrations":{"description":"List of opportunity integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityIntegrationDto"}}},"required":["opportunityId","integrations"]},"PublicApiOpportunityIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## Get Opportunity Contacts

> Returns a list of contacts associated with an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/contacts":{"get":{"operationId":"PublicApiOpportunityController_getOpportunityContacts","summary":"Get Opportunity Contacts","description":"Returns a list of contacts associated with an opportunity.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to get contacts from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetOpportunityContactsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetOpportunityContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## Create Opportunity Contact Relationship

> Creates a relationship between an opportunity and a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/contacts":{"post":{"operationId":"PublicApiOpportunityController_createOpportunityContact","summary":"Create Opportunity Contact Relationship","description":"Creates a relationship between an opportunity and a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityContactDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiCreateOpportunityContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]},"PublicApiCreateOpportunityContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Opportunity Companies

> Returns a list of companies associated with an opportunity.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/companies":{"get":{"operationId":"PublicApiOpportunityController_getOpportunityCompanies","summary":"Get Opportunity Companies","description":"Returns a list of companies associated with an opportunity.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to get companies from.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetOpportunityCompaniesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetOpportunityCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"},"isPrimary":{"type":"boolean","description":"Is primary company for this opportunity"}},"required":["companyId","companyName"]}}}}
```

## Create Opportunity Company Relationship

> Creates a relationship between an opportunity and a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/companies":{"post":{"operationId":"PublicApiOpportunityController_createOpportunityCompany","summary":"Create Opportunity Company Relationship","description":"Creates a relationship between an opportunity and a company.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityCompanyDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCreateOpportunityCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiCreateOpportunityCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]},"PublicApiCreateOpportunityCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Get Opportunity Meetings

> Returns meetings linked to the opportunity (via meeting-opportunity relations).

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/meetings":{"get":{"operationId":"PublicApiOpportunityController_getOpportunityMeetings","summary":"Get Opportunity Meetings","description":"Returns meetings linked to the opportunity (via meeting-opportunity relations).","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID to list meetings for.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Delete Opportunity Contact Relationship

> Deletes a relationship between an opportunity and a contact.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/contacts/{contactId}":{"delete":{"operationId":"PublicApiOpportunityController_deleteOpportunityContact","summary":"Delete Opportunity Contact Relationship","description":"Deletes a relationship between an opportunity and a contact.","parameters":[{"name":"id","required":true,"in":"path","description":"Opportunity ID.","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","description":"Contact ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteOpportunityContactResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiDeleteOpportunityContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## Delete Opportunity Company Relationship

> Deletes a relationship between an opportunity and a company.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Opportunities","description":"Operations related to opportunities"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/opportunities/{id}/companies/{companyId}":{"delete":{"operationId":"PublicApiOpportunityController_deleteOpportunityCompany","summary":"Delete Opportunity Company Relationship","description":"Deletes a relationship between an opportunity and a company.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"companyId","required":true,"in":"path","description":"Company ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiDeleteOpportunityCompanyResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Opportunities"]}}},"components":{"schemas":{"PublicApiDeleteOpportunityCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```


# Smart Categories

Operations related to smart categories

## Get all smart categories

> Returns a list of smart categories with pagination support.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Smart Categories","description":"Operations related to smart categories"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/smart-categories":{"get":{"operationId":"PublicApiSmartCategoryController_getSmartCategories","summary":"Get all smart categories","description":"Returns a list of smart categories with pagination support.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetSmartCategoriesResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Smart Categories"]}}},"components":{"schemas":{"PublicApiGetSmartCategoriesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSmartCategoryDto"}}},"required":["statusCode","count","error","data"]},"PublicApiSmartCategoryDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the smart category"},"name":{"type":"string","description":"Name of the smart category"},"description":{"type":"string","description":"Description of the smart category"},"type":{"type":"string","description":"Type of meeting this category applies to","enum":["videocall","presential","phonecall"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date of the smart category"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date of the smart category"}},"required":["id","name","type","createdAt","updatedAt"]}}}}
```

## Get smart category by ID

> Returns a smart category by ID.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Smart Categories","description":"Operations related to smart categories"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/smart-categories/{id}":{"get":{"operationId":"PublicApiSmartCategoryController_getSmartCategoryById","summary":"Get smart category by ID","description":"Returns a smart category by ID.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetSmartCategoryByIdResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Smart Categories"]}}},"components":{"schemas":{"PublicApiGetSmartCategoryByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiSmartCategoryDto"}},"required":["statusCode","count","error","data"]},"PublicApiSmartCategoryDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the smart category"},"name":{"type":"string","description":"Name of the smart category"},"description":{"type":"string","description":"Description of the smart category"},"type":{"type":"string","description":"Type of meeting this category applies to","enum":["videocall","presential","phonecall"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date of the smart category"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date of the smart category"}},"required":["id","name","type","createdAt","updatedAt"]}}}}
```


# Users

Operations related to users

## Get Users

> Retrieves a paginated list of users for the tenant with optional filters. Use metadata=\[campo=valor] format for metadata filtering.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Users","description":"Operations related to users"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/users":{"get":{"operationId":"PublicApiUserController_getUsers","summary":"Get Users","description":"Retrieves a paginated list of users for the tenant with optional filters. Use metadata=[campo=valor] format for metadata filtering.","parameters":[{"name":"page","required":false,"in":"query","description":"Page number for pagination (default: 1)","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page (default: 10)","schema":{"type":"number"}},{"name":"email","required":false,"in":"query","description":"Filter by email (partial match)","schema":{"type":"string"}},{"name":"phone","required":false,"in":"query","description":"Filter by phone (partial match)","schema":{"type":"string"}},{"name":"metadata","required":false,"in":"query","description":"Filter by metadata fields (format: [campo=valor]&[campo2=valor2])","schema":{"type":"array","items":{}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetUsersResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Users"]}}},"components":{"schemas":{"PublicApiGetUsersResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"description":"Array of users","type":"array","items":{"$ref":"#/components/schemas/PublicApiUserDto"}}},"required":["statusCode","count","error","data"]},"PublicApiUserDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the user"},"email":{"type":"string","description":"Email address of the user"},"firstName":{"type":"string","description":"First name of the user"},"lastName":{"type":"string","description":"Last name of the user"},"phone":{"type":"string","description":"Phone number of the user"},"position":{"type":"string","description":"Job position of the user","enum":["founder","c_level","engineering_product","sales_manager","account_executive","closer","sales_development_representative","marketing","customer_support_success","finance","business_analyst","operations","other"]},"metadata":{"type":"object","description":"Additional metadata for the user"},"personId":{"type":"string","description":"ID of the person associated with this user"}},"required":["id","email","firstName","lastName","personId"]}}}}
```

## Get User Meetings

> Returns meetings where the user is the owner and/or a participant (via person linked to the user). Paginated.

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Users","description":"Operations related to users"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/users/{id}/meetings":{"get":{"operationId":"PublicApiUserController_getUserMeetings","summary":"Get User Meetings","description":"Returns meetings where the user is the owner and/or a participant (via person linked to the user). Paginated.","parameters":[{"name":"id","required":true,"in":"path","description":"User ID to list meetings for.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number to retrieve.","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page.","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiGetMeetingsResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Users"]}}},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## Update User Metadata

> Updates the metadata for a specific user

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"tags":[{"name":"Users","description":"Operations related to users"}],"servers":[{"url":"https://api.salescaling.com","description":"Base API URL"}],"security":[{},{"bearer":[]}],"paths":{"/api/v1/users/{id}/metadata":{"put":{"operationId":"PublicApiUserController_updateUserMetadata","summary":"Update User Metadata","description":"Updates the metadata for a specific user","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUserMetadataUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiUserMetadataResponseDto"}}}},"401":{"description":"Unauthorized - missing or invalid API key or Bearer token"}},"tags":["Users"]}}},"components":{"schemas":{"PublicApiUserMetadataUpdateDto":{"type":"object","properties":{"metadata":{"type":"object","description":"Metadata fields to update for the user"}},"required":["metadata"]},"PublicApiUserMetadataResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"object","description":"Updated user metadata"}},"required":["statusCode","count","error","data"]}}}}
```


# Models

## The PublicApiMeetingTypeDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiMeetingDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiGetMeetingsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiMeetingUploadRequestDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingUploadRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the meeting for uploading"},"mediaUrl":{"type":"string","description":"URL of the media file to upload (alternative to file upload)"},"startDateTime":{"format":"date-time","type":"string","description":"Scheduled start date and time of the meeting"},"description":{"type":"string","description":"Description of the meeting "},"file":{"type":"string","description":"Video file to upload (alternative to mediaUrl)","format":"binary"},"ownerId":{"type":"string","description":"ID of the user who owns this meeting"},"personIds":{"description":"Array of person IDs for this meeting participants. Use comma to separate the values","type":"array","items":{"type":"string"}}},"required":["name","startDateTime"]}}}}
```

## The PublicApiMeetingUploadResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingUploadResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the uploaded meeting"}},"required":["meetingId"]}}}}
```

## The PublicApiPostMeetingUploadResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiPostMeetingUploadResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingUploadResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingUploadResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the uploaded meeting"}},"required":["meetingId"]}}}}
```

## The PublicApiGetMeetingByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier for the meeting"},"status":{"type":"string","enum":["scheduled","processing","completed"],"description":"Current status of the meeting"},"name":{"type":"string","description":"Name or title of the meeting"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting is scheduled to start"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the meeting ended "},"duration":{"type":"number","description":"Duration of the meeting in seconds"},"description":{"type":"string","description":"Detailed description of the meeting"},"mediaType":{"type":"string","enum":["videocall","presential","phonecall"],"description":"Media type of the meeting"},"language":{"type":"string","description":"Language of the meeting in ISO 639-1 format"},"thumbnailUrl":{"type":"string","description":"URL of the meeting thumbnail image"},"meetingType":{"description":"Meeting type associated with this meeting ","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the meeting "},"url":{"type":"string","description":"URL of the meeting"},"calendarEventId":{"type":"string","description":"Unique identifier of the calendar event, if the meeting is associated with a calendar event"}},"required":["meetingId","status","name","startDateTime","url"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiMeetingParticipantDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"email":{"type":"string","description":"Email address of the participant"},"isHost":{"type":"boolean","description":"Indicates if the participant is the host"},"isInternal":{"type":"boolean","description":"Indicates if the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiGetMeetingParticipantsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingParticipantsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"participants":{"description":"List of participants in the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingParticipantDto"}}},"required":["meetingId","participants"]},"PublicApiMeetingParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"email":{"type":"string","description":"Email address of the participant"},"isHost":{"type":"boolean","description":"Indicates if the participant is the host"},"isInternal":{"type":"boolean","description":"Indicates if the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiGetMeetingMeetingParticipantsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingMeetingParticipantsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiGetMeetingParticipantsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiGetMeetingParticipantsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"participants":{"description":"List of participants in the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingParticipantDto"}}},"required":["meetingId","participants"]},"PublicApiMeetingParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"email":{"type":"string","description":"Email address of the participant"},"isHost":{"type":"boolean","description":"Indicates if the participant is the host"},"isInternal":{"type":"boolean","description":"Indicates if the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiMeetingNextStepDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step (consider Date if deadline is meant to be a date, using string for example)"}},"required":["action","actors","deadline"]}}}}
```

## The PublicApiMeetingTopicDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingTopicDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the topic discussed"},"description":{"type":"string","description":"Description of the topic discussed"}},"required":["title","description"]}}}}
```

## The PublicApiMeetingSummaryResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingSummaryResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"summary":{"type":"string","description":"Summary of the meeting "},"nextSteps":{"description":"List of next steps identified during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the meeting "},"topics":{"description":"List of topics discussed during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingTopicDto"}}},"required":["meetingId"]},"PublicApiMeetingNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step (consider Date if deadline is meant to be a date, using string for example)"}},"required":["action","actors","deadline"]},"PublicApiMeetingTopicDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the topic discussed"},"description":{"type":"string","description":"Description of the topic discussed"}},"required":["title","description"]}}}}
```

## The PublicApiGetMeetingSummaryResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingSummaryResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingSummaryResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingSummaryResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"summary":{"type":"string","description":"Summary of the meeting "},"nextSteps":{"description":"List of next steps identified during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the meeting "},"topics":{"description":"List of topics discussed during the meeting ","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingTopicDto"}}},"required":["meetingId"]},"PublicApiMeetingNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step (consider Date if deadline is meant to be a date, using string for example)"}},"required":["action","actors","deadline"]},"PublicApiMeetingTopicDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the topic discussed"},"description":{"type":"string","description":"Description of the topic discussed"}},"required":["title","description"]}}}}
```

## The PublicApiTranscriptSegmentDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiMeetingTranscriptResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingTranscriptResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"transcript":{"description":"List of transcript segments for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiTranscriptSegmentDto"}}},"required":["meetingId","transcript"]},"PublicApiTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiGetMeetingTranscriptResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingTranscriptResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingTranscriptResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTranscriptResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"transcript":{"description":"List of transcript segments for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiTranscriptSegmentDto"}}},"required":["meetingId","transcript"]},"PublicApiTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiMeetingNoteDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## The PublicApiMeetingMeetingNotesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingMeetingNotesResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"notes":{"description":"List of notes taken during the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}}},"required":["meetingId","notes"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## The PublicApiGetMeetingMeetingNotesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingMeetingNotesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingMeetingNotesResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingMeetingNotesResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"notes":{"description":"List of notes taken during the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}}},"required":["meetingId","notes"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## The PublicApiMeetingChatMessageDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question of the chat message"},"answer":{"type":"string","description":"Answer of the chat message"}},"required":["question","answer"]}}}}
```

## The PublicApiMeetingChatResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingChatResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"messages":{"description":"List of chat messages for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingChatMessageDto"}}},"required":["meetingId","messages"]},"PublicApiMeetingChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question of the chat message"},"answer":{"type":"string","description":"Answer of the chat message"}},"required":["question","answer"]}}}}
```

## The PublicApiGetMeetingChatResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingChatResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingChatResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingChatResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"messages":{"description":"List of chat messages for the meeting","type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingChatMessageDto"}}},"required":["meetingId","messages"]},"PublicApiMeetingChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question of the chat message"},"answer":{"type":"string","description":"Answer of the chat message"}},"required":["question","answer"]}}}}
```

## The PublicApiDeleteMeetingByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteMeetingByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiMeetingContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## The PublicApiGetMeetingContactsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## The PublicApiMeetingCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## The PublicApiGetMeetingCompaniesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## The PublicApiMeetingOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## The PublicApiGetMeetingOpportunitiesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## The PublicApiAnalyticsQuestionBySpeakerDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]}}}}
```

## The PublicApiAnalyticsParticipantParticipationDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## The PublicApiMeetingAnalyticsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingAnalyticsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["meetingId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## The PublicApiGetMeetingAnalyticsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingAnalyticsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingAnalyticsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingAnalyticsResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["meetingId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## The PublicApiScoreObjectiveDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```

## The PublicApiMeetingScoreResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingScoreResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"score":{"type":"number","description":"Overall AI score for the meeting (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["meetingId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```

## The PublicApiGetMeetingScoreResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingScoreResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingScoreResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingScoreResponseDto":{"type":"object","properties":{"meetingId":{"type":"string","description":"Unique identifier of the meeting"},"score":{"type":"number","description":"Overall AI score for the meeting (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["meetingId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```

## The PublicApiMeetingCallTypeDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## The PublicApiCallDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier for the call"},"status":{"type":"string","enum":["processing","completed"],"description":"Current status of the call"},"name":{"type":"string","description":"Name or title of the call"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the call started"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the call ended"},"duration":{"type":"number","description":"Duration of the call in seconds"},"description":{"type":"string","description":"Detailed description of the call"},"language":{"type":"string","description":"Language of the call in ISO 639-1 format"},"direction":{"type":"string","description":"Direction of the call (inbound/outbound)"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"callType":{"description":"Call type associated with this call","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingCallTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the call"},"url":{"type":"string","description":"URL of the call"}},"required":["callId","status","name","startDateTime","direction","url"]},"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## The PublicApiGetCallsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier for the call"},"status":{"type":"string","enum":["processing","completed"],"description":"Current status of the call"},"name":{"type":"string","description":"Name or title of the call"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the call started"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the call ended"},"duration":{"type":"number","description":"Duration of the call in seconds"},"description":{"type":"string","description":"Detailed description of the call"},"language":{"type":"string","description":"Language of the call in ISO 639-1 format"},"direction":{"type":"string","description":"Direction of the call (inbound/outbound)"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"callType":{"description":"Call type associated with this call","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingCallTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the call"},"url":{"type":"string","description":"URL of the call"}},"required":["callId","status","name","startDateTime","direction","url"]},"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## The PublicApiCallUploadRequestDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallUploadRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the call for uploading"},"mediaUrl":{"type":"string","description":"URL of the media file to upload (alternative to file upload)"},"startDateTime":{"format":"date-time","type":"string","description":"Scheduled start date and time of the call"},"description":{"type":"string","description":"Description of the call"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"file":{"type":"string","description":"Audio file to upload (alternative to mediaUrl). It must be a valid mp3 / wav file","format":"binary"},"ownerId":{"type":"string","description":"ID of the user who owns this call"},"personIds":{"description":"Array of person IDs for call participants. Use comma to separate values. Recommendation: include the owner's personId here to guarantee feedback generation.","type":"array","items":{"type":"string"}}},"required":["name","startDateTime"]}}}}
```

## The PublicApiCallUploadResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallUploadResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the uploaded call"}},"required":["callId"]}}}}
```

## The PublicApiPostCallUploadResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiPostCallUploadResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallUploadResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallUploadResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the uploaded call"}},"required":["callId"]}}}}
```

## The PublicApiGetCallByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier for the call"},"status":{"type":"string","enum":["processing","completed"],"description":"Current status of the call"},"name":{"type":"string","description":"Name or title of the call"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the call started"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the call ended"},"duration":{"type":"number","description":"Duration of the call in seconds"},"description":{"type":"string","description":"Detailed description of the call"},"language":{"type":"string","description":"Language of the call in ISO 639-1 format"},"direction":{"type":"string","description":"Direction of the call (inbound/outbound)"},"fromNumber":{"type":"string","description":"Phone number of the caller"},"toNumber":{"type":"string","description":"Phone number of the callee"},"callType":{"description":"Call type associated with this call","allOf":[{"$ref":"#/components/schemas/PublicApiMeetingCallTypeDto"}]},"aiScore":{"type":"number","description":"AI score or rating of the call"},"url":{"type":"string","description":"URL of the call"}},"required":["callId","status","name","startDateTime","direction","url"]},"PublicApiMeetingCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the call type"},"name":{"type":"string","description":"Descriptive name of the call type"}},"required":["id","name"]}}}}
```

## The PublicApiCallParticipantDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"phone":{"type":"string","description":"Phone number of the participant"},"isHost":{"type":"boolean","description":"Whether the participant is the host of the call"},"isInternal":{"type":"boolean","description":"Whether the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiCallParticipantsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallParticipantsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"participants":{"description":"List of participants in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallParticipantDto"}}},"required":["callId","participants"]},"PublicApiCallParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"phone":{"type":"string","description":"Phone number of the participant"},"isHost":{"type":"boolean","description":"Whether the participant is the host of the call"},"isInternal":{"type":"boolean","description":"Whether the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiGetCallParticipantsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallParticipantsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallParticipantsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallParticipantsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"participants":{"description":"List of participants in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallParticipantDto"}}},"required":["callId","participants"]},"PublicApiCallParticipantDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the participant"},"name":{"type":"string","description":"Name of the participant"},"phone":{"type":"string","description":"Phone number of the participant"},"isHost":{"type":"boolean","description":"Whether the participant is the host of the call"},"isInternal":{"type":"boolean","description":"Whether the participant is internal to the organization"}},"required":["id","name"]}}}}
```

## The PublicApiCallNextStepDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step"}},"required":["action","actors","deadline"]}}}}
```

## The PublicApiCallSummaryResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallSummaryResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"summary":{"type":"string","description":"Summary of the call"},"nextSteps":{"description":"List of next steps identified during the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the call"},"insights":{"type":"object","description":"Call insights"}},"required":["callId"]},"PublicApiCallNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step"}},"required":["action","actors","deadline"]}}}}
```

## The PublicApiGetCallSummaryResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallSummaryResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallSummaryResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallSummaryResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"summary":{"type":"string","description":"Summary of the call"},"nextSteps":{"description":"List of next steps identified during the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNextStepDto"}},"aiOpinion":{"type":"string","description":"AI-generated opinion or sentiment about the call"},"insights":{"type":"object","description":"Call insights"}},"required":["callId"]},"PublicApiCallNextStepDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to be taken in the next step"},"actors":{"description":"Actors responsible for the next step","type":"array","items":{"type":"string"}},"deadline":{"type":"string","description":"Deadline for completing the next step"}},"required":["action","actors","deadline"]}}}}
```

## The PublicApiCallTranscriptSegmentDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiCallTranscriptResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallTranscriptResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"transcript":{"description":"List of transcript segments for the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTranscriptSegmentDto"}}},"required":["callId","transcript"]},"PublicApiCallTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiGetCallTranscriptResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallTranscriptResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallTranscriptResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallTranscriptResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"transcript":{"description":"List of transcript segments for the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTranscriptSegmentDto"}}},"required":["callId","transcript"]},"PublicApiCallTranscriptSegmentDto":{"type":"object","properties":{"startTime":{"type":"number","description":"Start time of the transcript segment in seconds"},"endTime":{"type":"number","description":"End time of the transcript segment in seconds"},"personId":{"type":"string","description":"Internal Identifier of the person who spoke"},"participantName":{"type":"string","description":"Name of the participant who spoke"},"content":{"type":"string","description":"Content of the transcript"}},"required":["startTime","endTime","personId","participantName","content"]}}}}
```

## The PublicApiCallNoteDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## The PublicApiCallNotesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallNotesResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"notes":{"description":"List of notes from the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}}},"required":["callId","notes"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## The PublicApiGetCallNotesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallNotesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallNotesResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallNotesResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"notes":{"description":"List of notes from the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}}},"required":["callId","notes"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## The PublicApiCallChatMessageDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question asked in the chat"},"answer":{"type":"string","description":"Answer provided in the chat"}},"required":["question","answer"]}}}}
```

## The PublicApiCallChatResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallChatResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"messages":{"description":"List of chat messages in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallChatMessageDto"}}},"required":["callId","messages"]},"PublicApiCallChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question asked in the chat"},"answer":{"type":"string","description":"Answer provided in the chat"}},"required":["question","answer"]}}}}
```

## The PublicApiGetCallChatResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallChatResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallChatResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallChatResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"messages":{"description":"List of chat messages in the call","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallChatMessageDto"}}},"required":["callId","messages"]},"PublicApiCallChatMessageDto":{"type":"object","properties":{"question":{"type":"string","description":"Question asked in the chat"},"answer":{"type":"string","description":"Answer provided in the chat"}},"required":["question","answer"]}}}}
```

## The PublicApiDeleteCallByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCallByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiGetCallContactsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## The PublicApiGetCallCompaniesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## The PublicApiGetCallOpportunitiesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## The PublicApiCallAnalyticsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallAnalyticsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["callId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## The PublicApiGetCallAnalyticsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallAnalyticsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallAnalyticsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallAnalyticsResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"questionsBySpeaker":{"description":"Number of questions asked by each speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsQuestionBySpeakerDto"}},"participantParticipation":{"description":"Participation metrics per speaker","type":"array","items":{"$ref":"#/components/schemas/PublicApiAnalyticsParticipantParticipationDto"}}},"required":["callId","questionsBySpeaker","participantParticipation"]},"PublicApiAnalyticsQuestionBySpeakerDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"count":{"type":"number","description":"Number of questions asked by the speaker"}},"required":["speakerLabel","count"]},"PublicApiAnalyticsParticipantParticipationDto":{"type":"object","properties":{"speakerLabel":{"type":"string","description":"Speaker label in the transcript"},"averageSpeakingTime":{"type":"number","description":"Total speaking time in seconds"},"totalSpeakingTime":{"type":"string","description":"Total speaking time formatted as mm:ss"},"longestMonologue":{"type":"number","description":"Longest monologue duration in seconds"},"numberOfInterventions":{"type":"number","description":"Number of transcript segments spoken by the participant"},"averageTimePerIntervention":{"type":"number","description":"Average duration per intervention in seconds"}},"required":["speakerLabel","averageSpeakingTime","totalSpeakingTime","longestMonologue","numberOfInterventions","averageTimePerIntervention"]}}}}
```

## The PublicApiCallScoreResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallScoreResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"score":{"type":"number","description":"Overall AI score for the call (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["callId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```

## The PublicApiGetCallScoreResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallScoreResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallScoreResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallScoreResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"Unique identifier of the call"},"score":{"type":"number","description":"Overall AI score for the call (0-100)"},"scoreJustification":{"type":"string","description":"AI-generated justification for the overall score"},"objectives":{"description":"Objectives evaluated with their score and explanation","type":"array","items":{"$ref":"#/components/schemas/PublicApiScoreObjectiveDto"}}},"required":["callId","objectives"]},"PublicApiScoreObjectiveDto":{"type":"object","properties":{"objective":{"type":"string","description":"Objective or requirement evaluated during the activity"},"score":{"type":"number","description":"Score assigned to the objective (0-100)"},"explanation":{"type":"string","description":"Explanation of how the objective was evaluated"}},"required":["objective"]}}}}
```

## The PublicApiGetMeetingNotesListResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingNotesListResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## The PublicApiGetMeetingNoteByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingNoteByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingNoteDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingNoteDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting note"},"tag":{"type":"string","description":"Tag associated with the note"},"content":{"type":"string","description":"Content of the note"},"priority":{"type":"string","description":"Priority level of the note","enum":["low","medium","high"]},"meetingId":{"type":"string","description":"ID of the associated meeting"},"smartCategoryId":{"type":"string","description":"ID of the associated smart category"},"isManual":{"type":"boolean","description":"Whether the note was manually created"},"startTimestamp":{"type":"number","description":"Start timestamp of the note"},"endTimestamp":{"type":"number","description":"End timestamp of the note"}},"required":["id","content","meetingId","smartCategoryId","isManual"]}}}}
```

## The PublicApiGetMeetingTypesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingTypesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiGetMeetingTypeByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetMeetingTypeByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiMeetingTypeDto"}},"required":["statusCode","count","error","data"]},"PublicApiMeetingTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the meeting type"},"name":{"type":"string","description":"Descriptive name of the meeting type"}},"required":["id","name"]}}}}
```

## The PublicApiCallTypeScoreDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```

## The PublicApiCallTypeDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting type"},"name":{"type":"string","description":"Name of the meeting type"},"description":{"type":"string","description":"Description of the meeting type"},"isEnabled":{"type":"boolean","description":"Whether the meeting type is enabled"},"score":{"description":"Scores associated with the meeting type","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeScoreDto"}},"type":{"type":"string","description":"Type of meeting","enum":["videocall","presential","phonecall"]}},"required":["id","name","isEnabled","type"]},"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```

## The PublicApiGetCallTypesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallTypesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting type"},"name":{"type":"string","description":"Name of the meeting type"},"description":{"type":"string","description":"Description of the meeting type"},"isEnabled":{"type":"boolean","description":"Whether the meeting type is enabled"},"score":{"description":"Scores associated with the meeting type","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeScoreDto"}},"type":{"type":"string","description":"Type of meeting","enum":["videocall","presential","phonecall"]}},"required":["id","name","isEnabled","type"]},"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```

## The PublicApiGetCallTypeByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallTypeByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallTypeDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallTypeDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the meeting type"},"name":{"type":"string","description":"Name of the meeting type"},"description":{"type":"string","description":"Description of the meeting type"},"isEnabled":{"type":"boolean","description":"Whether the meeting type is enabled"},"score":{"description":"Scores associated with the meeting type","type":"array","items":{"$ref":"#/components/schemas/PublicApiCallTypeScoreDto"}},"type":{"type":"string","description":"Type of meeting","enum":["videocall","presential","phonecall"]}},"required":["id","name","isEnabled","type"]},"PublicApiCallTypeScoreDto":{"type":"object","properties":{"value":{"type":"number","description":"Score value"},"type":{"type":"string","description":"Score type"}},"required":["value","type"]}}}}
```

## The PublicApiSmartCategoryDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSmartCategoryDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the smart category"},"name":{"type":"string","description":"Name of the smart category"},"description":{"type":"string","description":"Description of the smart category"},"type":{"type":"string","description":"Type of meeting this category applies to","enum":["videocall","presential","phonecall"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date of the smart category"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date of the smart category"}},"required":["id","name","type","createdAt","updatedAt"]}}}}
```

## The PublicApiGetSmartCategoriesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetSmartCategoriesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSmartCategoryDto"}}},"required":["statusCode","count","error","data"]},"PublicApiSmartCategoryDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the smart category"},"name":{"type":"string","description":"Name of the smart category"},"description":{"type":"string","description":"Description of the smart category"},"type":{"type":"string","description":"Type of meeting this category applies to","enum":["videocall","presential","phonecall"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date of the smart category"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date of the smart category"}},"required":["id","name","type","createdAt","updatedAt"]}}}}
```

## The PublicApiGetSmartCategoryByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetSmartCategoryByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiSmartCategoryDto"}},"required":["statusCode","count","error","data"]},"PublicApiSmartCategoryDto":{"type":"object","properties":{"id":{"type":"string","description":"ID of the smart category"},"name":{"type":"string","description":"Name of the smart category"},"description":{"type":"string","description":"Description of the smart category"},"type":{"type":"string","description":"Type of meeting this category applies to","enum":["videocall","presential","phonecall"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date of the smart category"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date of the smart category"}},"required":["id","name","type","createdAt","updatedAt"]}}}}
```

## The PublicApiGetCallNoteByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCallNoteByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCallNoteDto"}},"required":["statusCode","count","error","data"]},"PublicApiCallNoteDto":{"type":"object","properties":{"content":{"type":"string","description":"Content of the note"},"smartCategory":{"type":"object","description":"Smart category of the note"}},"required":["content","smartCategory"]}}}}
```

## The PublicApiCalendarEventParticipantDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]}}}}
```

## The PublicApiCalendarEventConferencingDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiCalendarEventDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiGetCalendarEventsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCalendarEventsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiGetCalendarEventByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCalendarEventByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiCreateCalendarEventDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCalendarEventDto":{"type":"object","properties":{"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"meetingUrl":{"type":"string","description":"Meeting URL"},"metadata":{"type":"object","description":"Additional metadata for the event"}},"required":["calendarId","title","startDateTime","endDateTime"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]}}}}
```

## The PublicApiCreateCalendarEventResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiUpdateCalendarEventDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCalendarEventDto":{"type":"object","properties":{"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"meetingUrl":{"type":"string","description":"Meeting URL"},"metadata":{"type":"object","description":"Additional metadata for the event"}}},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]}}}}
```

## The PublicApiUpdateCalendarEventResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarEventDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar event"},"calendarId":{"type":"string","description":"Calendar ID this event belongs to"},"title":{"type":"string","description":"Title of the calendar event"},"description":{"type":"string","description":"Description of the calendar event"},"startDateTime":{"format":"date-time","type":"string","description":"Date and time when the event starts"},"endDateTime":{"format":"date-time","type":"string","description":"Date and time when the event ends"},"location":{"type":"string","description":"Location of the event"},"status":{"type":"string","enum":["completed","confirmed","tentative","cancelled"],"description":"Status of the calendar event"},"visibility":{"type":"string","enum":["default","public","private"],"description":"Visibility of the calendar event"},"organizerEmail":{"type":"string","description":"Email of the event organizer"},"organizerName":{"type":"string","description":"Name of the event organizer"},"busy":{"type":"boolean","description":"Whether the event is marked as busy"},"readOnly":{"type":"boolean","description":"Whether the event is read-only"},"hideParticipants":{"type":"boolean","description":"Whether to hide participants"},"htmlLink":{"type":"string","description":"HTML link to the event"},"iCalUID":{"type":"string","description":"iCal UID of the event"},"nylasId":{"type":"string","description":"Nylas ID of the event"},"masterEventId":{"type":"string","description":"Master event ID for recurring events"},"duration":{"type":"number","description":"Duration of the event in seconds"},"recurrence":{"description":"Recurrence rules for the event","type":"array","items":{"type":"string"}},"participants":{"description":"Event participants","type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarEventParticipantDto"}},"conferencing":{"description":"Conferencing properties","allOf":[{"$ref":"#/components/schemas/PublicApiCalendarEventConferencingDto"}]},"metadata":{"type":"object","description":"Additional metadata for the event"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the event was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the event was last updated"}},"required":["id","title","startDateTime","endDateTime","status","visibility","createdAt","updatedAt"]},"PublicApiCalendarEventParticipantDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address of the participant"},"name":{"type":"string","description":"Name of the participant"},"status":{"type":"string","description":"Response status of the participant","default":"yes"}},"required":["email"]},"PublicApiCalendarEventConferencingDto":{"type":"object","properties":{"provider":{"type":"string","description":"Conferencing provider"},"details":{"type":"object","properties":{"url":{"type":"string"}}}},"required":["details"]}}}}
```

## The PublicApiDeleteCalendarEventResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCalendarEventResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCalendarDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiGetCalendarsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCalendarsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCalendarDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiGetCalendarByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCalendarByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiCreateCalendarDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCalendarDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"}},"required":["name"]}}}}
```

## The PublicApiCreateCalendarResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiUpdateCalendarDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCalendarDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"}}}}}}
```

## The PublicApiUpdateCalendarResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCalendarDto"}},"required":["statusCode","count","error","data"]},"PublicApiCalendarDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the calendar"},"name":{"type":"string","description":"Name of the calendar"},"description":{"type":"string","description":"Description of the calendar"},"hexColor":{"type":"string","description":"Hex color code for the calendar"},"hexForegroundColor":{"type":"string","description":"Hex foreground color code for the calendar"},"isPrimary":{"type":"boolean","description":"Whether this is the primary calendar"},"location":{"type":"string","description":"Location associated with the calendar"},"timezone":{"type":"string","description":"IANA time zone database formatted string"},"readOnly":{"type":"boolean","description":"Whether the calendar is read-only"},"metadata":{"type":"object","description":"Additional metadata for the calendar"},"createdAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date and time when the calendar was last updated"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiDeleteCalendarResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCalendarResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiGetCompaniesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiRecommendedActionDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiRecommendedActionDto":{"type":"object","properties":{"actionType":{"type":"string","enum":["next_step","send_case_study","call_decision_maker","address_objection","schedule_demo","send_proposal","follow_up","escalate","discovery_call","check_in","propose_expansion"]},"instruction":{"type":"string"},"suggestedMessage":{"type":"string"},"deadline":{"type":"string"}},"required":["actionType","instruction"]}}}}
```

## The PublicApiCommercialStateDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCommercialStateDto":{"type":"object","properties":{"state":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"confidence":{"type":"number","description":"Internal confidence score 0-1"},"confidenceLevel":{"type":"string","enum":["low","medium","high"]},"whyNow":{"type":"string"},"subMotives":{"type":"array","items":{"type":"string"}},"recommendedAction":{"$ref":"#/components/schemas/PublicApiRecommendedActionDto"},"lastCalculatedAt":{"type":"string"},"stateChangedAt":{"type":"string"},"previousState":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"triggerSignals":{"type":"array","items":{"type":"string"}}},"required":["state","confidence","confidenceLevel","whyNow","subMotives","recommendedAction","lastCalculatedAt","triggerSignals"]},"PublicApiRecommendedActionDto":{"type":"object","properties":{"actionType":{"type":"string","enum":["next_step","send_case_study","call_decision_maker","address_objection","schedule_demo","send_proposal","follow_up","escalate","discovery_call","check_in","propose_expansion"]},"instruction":{"type":"string"},"suggestedMessage":{"type":"string"},"deadline":{"type":"string"}},"required":["actionType","instruction"]}}}}
```

## The PublicApiCompanyStatusStateDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyStatusStateDto":{"type":"object","properties":{"currentState":{"description":"Paragraphs shown as “Current status” in the UI (Markdown source segments).","type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}},"objections":{"type":"array","items":{"type":"string"}}},"required":["currentState","needs","objections"]}}}}
```

## The PublicApiCompanyAiStatusDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyAiStatusDto":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"state":{"$ref":"#/components/schemas/PublicApiCompanyStatusStateDto"}},"required":["id","createdAt","updatedAt","state"]},"PublicApiCompanyStatusStateDto":{"type":"object","properties":{"currentState":{"description":"Paragraphs shown as “Current status” in the UI (Markdown source segments).","type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}},"objections":{"type":"array","items":{"type":"string"}}},"required":["currentState","needs","objections"]}}}}
```

## The PublicApiSuggestedActionDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSuggestedActionDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","enum":["positive","risk","neutral"]},"relatedSignals":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number"},"relevanceScore":{"type":"number"},"firstDetectedAt":{"type":"string"},"lastDetectedAt":{"type":"string"},"occurrences":{"type":"number"},"activityIds":{"type":"array","items":{"type":"string"}},"activityNames":{"type":"array","items":{"type":"string"}},"activityTypes":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","priority","category","relatedSignals","confidence","relevanceScore","firstDetectedAt","lastDetectedAt","occurrences","activityIds"]}}}}
```

## The PublicApiSignalEvidenceDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]}}}}
```

## The PublicApiSignalSummaryItemDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSignalSummaryItemDto":{"type":"object","properties":{"signalTypeCode":{"type":"string"},"signalTypeTitle":{"type":"string"},"signalTypeDescription":{"type":"string"},"signalTypeCategory":{"type":"string","enum":["positive","risk","neutral"]},"value":{"type":"string"},"changeType":{"type":"string","nullable":true},"detectedAt":{"type":"string"},"activityId":{"type":"string"},"activityName":{"type":"string"},"activityType":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalEvidenceDto"}},"relevanceScore":{"type":"number"}},"required":["signalTypeCode","signalTypeTitle","signalTypeDescription","signalTypeCategory","value","detectedAt","activityId","evidence","relevanceScore"]},"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]}}}}
```

## The PublicApiSignalsByCategoryDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## The PublicApiCompanySuggestedActionsMetadataDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanySuggestedActionsMetadataDto":{"type":"object","properties":{"totalSignals":{"type":"number"},"signalsByCategory":{"$ref":"#/components/schemas/PublicApiSignalsByCategoryDto"},"decayHalfLifeDays":{"type":"number"}},"required":["totalSignals","signalsByCategory","decayHalfLifeDays"]},"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## The PublicApiCompanySuggestedActionsBundleDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanySuggestedActionsBundleDto":{"type":"object","properties":{"suggestedActions":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSuggestedActionDto"}},"signals":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalSummaryItemDto"}},"lastUpdated":{"type":"string"},"metadata":{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsMetadataDto"}},"required":["suggestedActions","signals","lastUpdated","metadata"]},"PublicApiSuggestedActionDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","enum":["positive","risk","neutral"]},"relatedSignals":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number"},"relevanceScore":{"type":"number"},"firstDetectedAt":{"type":"string"},"lastDetectedAt":{"type":"string"},"occurrences":{"type":"number"},"activityIds":{"type":"array","items":{"type":"string"}},"activityNames":{"type":"array","items":{"type":"string"}},"activityTypes":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","priority","category","relatedSignals","confidence","relevanceScore","firstDetectedAt","lastDetectedAt","occurrences","activityIds"]},"PublicApiSignalSummaryItemDto":{"type":"object","properties":{"signalTypeCode":{"type":"string"},"signalTypeTitle":{"type":"string"},"signalTypeDescription":{"type":"string"},"signalTypeCategory":{"type":"string","enum":["positive","risk","neutral"]},"value":{"type":"string"},"changeType":{"type":"string","nullable":true},"detectedAt":{"type":"string"},"activityId":{"type":"string"},"activityName":{"type":"string"},"activityType":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalEvidenceDto"}},"relevanceScore":{"type":"number"}},"required":["signalTypeCode","signalTypeTitle","signalTypeDescription","signalTypeCategory","value","detectedAt","activityId","evidence","relevanceScore"]},"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]},"PublicApiCompanySuggestedActionsMetadataDto":{"type":"object","properties":{"totalSignals":{"type":"number"},"signalsByCategory":{"$ref":"#/components/schemas/PublicApiSignalsByCategoryDto"},"decayHalfLifeDays":{"type":"number"}},"required":["totalSignals","signalsByCategory","decayHalfLifeDays"]},"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## The PublicApiCompanyDetailsTabDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyDetailsTabDto":{"type":"object","properties":{"commercialState":{"nullable":true,"description":"Commercial “sales moment”; same JSON as company.commercial_state when present.","allOf":[{"$ref":"#/components/schemas/PublicApiCommercialStateDto"}]},"aiStatus":{"nullable":true,"description":"Latest AI company_status row (Current status, Needs, Objections).","allOf":[{"$ref":"#/components/schemas/PublicApiCompanyAiStatusDto"}]},"suggestedActions":{"nullable":true,"description":"Suggested actions + signal summaries from company.suggested_actions.","allOf":[{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsBundleDto"}]}}},"PublicApiCommercialStateDto":{"type":"object","properties":{"state":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"confidence":{"type":"number","description":"Internal confidence score 0-1"},"confidenceLevel":{"type":"string","enum":["low","medium","high"]},"whyNow":{"type":"string"},"subMotives":{"type":"array","items":{"type":"string"}},"recommendedAction":{"$ref":"#/components/schemas/PublicApiRecommendedActionDto"},"lastCalculatedAt":{"type":"string"},"stateChangedAt":{"type":"string"},"previousState":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"triggerSignals":{"type":"array","items":{"type":"string"}}},"required":["state","confidence","confidenceLevel","whyNow","subMotives","recommendedAction","lastCalculatedAt","triggerSignals"]},"PublicApiRecommendedActionDto":{"type":"object","properties":{"actionType":{"type":"string","enum":["next_step","send_case_study","call_decision_maker","address_objection","schedule_demo","send_proposal","follow_up","escalate","discovery_call","check_in","propose_expansion"]},"instruction":{"type":"string"},"suggestedMessage":{"type":"string"},"deadline":{"type":"string"}},"required":["actionType","instruction"]},"PublicApiCompanyAiStatusDto":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"state":{"$ref":"#/components/schemas/PublicApiCompanyStatusStateDto"}},"required":["id","createdAt","updatedAt","state"]},"PublicApiCompanyStatusStateDto":{"type":"object","properties":{"currentState":{"description":"Paragraphs shown as “Current status” in the UI (Markdown source segments).","type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}},"objections":{"type":"array","items":{"type":"string"}}},"required":["currentState","needs","objections"]},"PublicApiCompanySuggestedActionsBundleDto":{"type":"object","properties":{"suggestedActions":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSuggestedActionDto"}},"signals":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalSummaryItemDto"}},"lastUpdated":{"type":"string"},"metadata":{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsMetadataDto"}},"required":["suggestedActions","signals","lastUpdated","metadata"]},"PublicApiSuggestedActionDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","enum":["positive","risk","neutral"]},"relatedSignals":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number"},"relevanceScore":{"type":"number"},"firstDetectedAt":{"type":"string"},"lastDetectedAt":{"type":"string"},"occurrences":{"type":"number"},"activityIds":{"type":"array","items":{"type":"string"}},"activityNames":{"type":"array","items":{"type":"string"}},"activityTypes":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","priority","category","relatedSignals","confidence","relevanceScore","firstDetectedAt","lastDetectedAt","occurrences","activityIds"]},"PublicApiSignalSummaryItemDto":{"type":"object","properties":{"signalTypeCode":{"type":"string"},"signalTypeTitle":{"type":"string"},"signalTypeDescription":{"type":"string"},"signalTypeCategory":{"type":"string","enum":["positive","risk","neutral"]},"value":{"type":"string"},"changeType":{"type":"string","nullable":true},"detectedAt":{"type":"string"},"activityId":{"type":"string"},"activityName":{"type":"string"},"activityType":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalEvidenceDto"}},"relevanceScore":{"type":"number"}},"required":["signalTypeCode","signalTypeTitle","signalTypeDescription","signalTypeCategory","value","detectedAt","activityId","evidence","relevanceScore"]},"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]},"PublicApiCompanySuggestedActionsMetadataDto":{"type":"object","properties":{"totalSignals":{"type":"number"},"signalsByCategory":{"$ref":"#/components/schemas/PublicApiSignalsByCategoryDto"},"decayHalfLifeDays":{"type":"number"}},"required":["totalSignals","signalsByCategory","decayHalfLifeDays"]},"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## The PublicApiGetCompanyDetailsTabResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompanyDetailsTabResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDetailsTabDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDetailsTabDto":{"type":"object","properties":{"commercialState":{"nullable":true,"description":"Commercial “sales moment”; same JSON as company.commercial_state when present.","allOf":[{"$ref":"#/components/schemas/PublicApiCommercialStateDto"}]},"aiStatus":{"nullable":true,"description":"Latest AI company_status row (Current status, Needs, Objections).","allOf":[{"$ref":"#/components/schemas/PublicApiCompanyAiStatusDto"}]},"suggestedActions":{"nullable":true,"description":"Suggested actions + signal summaries from company.suggested_actions.","allOf":[{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsBundleDto"}]}}},"PublicApiCommercialStateDto":{"type":"object","properties":{"state":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"confidence":{"type":"number","description":"Internal confidence score 0-1"},"confidenceLevel":{"type":"string","enum":["low","medium","high"]},"whyNow":{"type":"string"},"subMotives":{"type":"array","items":{"type":"string"}},"recommendedAction":{"$ref":"#/components/schemas/PublicApiRecommendedActionDto"},"lastCalculatedAt":{"type":"string"},"stateChangedAt":{"type":"string"},"previousState":{"type":"string","enum":["exploration","active_evaluation","high_intent","blocked","risk","expansion","post_sale"]},"triggerSignals":{"type":"array","items":{"type":"string"}}},"required":["state","confidence","confidenceLevel","whyNow","subMotives","recommendedAction","lastCalculatedAt","triggerSignals"]},"PublicApiRecommendedActionDto":{"type":"object","properties":{"actionType":{"type":"string","enum":["next_step","send_case_study","call_decision_maker","address_objection","schedule_demo","send_proposal","follow_up","escalate","discovery_call","check_in","propose_expansion"]},"instruction":{"type":"string"},"suggestedMessage":{"type":"string"},"deadline":{"type":"string"}},"required":["actionType","instruction"]},"PublicApiCompanyAiStatusDto":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"state":{"$ref":"#/components/schemas/PublicApiCompanyStatusStateDto"}},"required":["id","createdAt","updatedAt","state"]},"PublicApiCompanyStatusStateDto":{"type":"object","properties":{"currentState":{"description":"Paragraphs shown as “Current status” in the UI (Markdown source segments).","type":"array","items":{"type":"string"}},"needs":{"type":"array","items":{"type":"string"}},"objections":{"type":"array","items":{"type":"string"}}},"required":["currentState","needs","objections"]},"PublicApiCompanySuggestedActionsBundleDto":{"type":"object","properties":{"suggestedActions":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSuggestedActionDto"}},"signals":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalSummaryItemDto"}},"lastUpdated":{"type":"string"},"metadata":{"$ref":"#/components/schemas/PublicApiCompanySuggestedActionsMetadataDto"}},"required":["suggestedActions","signals","lastUpdated","metadata"]},"PublicApiSuggestedActionDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","enum":["positive","risk","neutral"]},"relatedSignals":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number"},"relevanceScore":{"type":"number"},"firstDetectedAt":{"type":"string"},"lastDetectedAt":{"type":"string"},"occurrences":{"type":"number"},"activityIds":{"type":"array","items":{"type":"string"}},"activityNames":{"type":"array","items":{"type":"string"}},"activityTypes":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","priority","category","relatedSignals","confidence","relevanceScore","firstDetectedAt","lastDetectedAt","occurrences","activityIds"]},"PublicApiSignalSummaryItemDto":{"type":"object","properties":{"signalTypeCode":{"type":"string"},"signalTypeTitle":{"type":"string"},"signalTypeDescription":{"type":"string"},"signalTypeCategory":{"type":"string","enum":["positive","risk","neutral"]},"value":{"type":"string"},"changeType":{"type":"string","nullable":true},"detectedAt":{"type":"string"},"activityId":{"type":"string"},"activityName":{"type":"string"},"activityType":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiSignalEvidenceDto"}},"relevanceScore":{"type":"number"}},"required":["signalTypeCode","signalTypeTitle","signalTypeDescription","signalTypeCategory","value","detectedAt","activityId","evidence","relevanceScore"]},"PublicApiSignalEvidenceDto":{"type":"object","properties":{"text":{"type":"string"},"start":{"type":"number"},"end":{"type":"number"}},"required":["text","start","end"]},"PublicApiCompanySuggestedActionsMetadataDto":{"type":"object","properties":{"totalSignals":{"type":"number"},"signalsByCategory":{"$ref":"#/components/schemas/PublicApiSignalsByCategoryDto"},"decayHalfLifeDays":{"type":"number"}},"required":["totalSignals","signalsByCategory","decayHalfLifeDays"]},"PublicApiSignalsByCategoryDto":{"type":"object","properties":{"positive":{"type":"number"},"risk":{"type":"number"},"neutral":{"type":"number"}},"required":["positive","risk","neutral"]}}}}
```

## The PublicApiGetCompanyByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompanyByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiCreateCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"}},"required":["name","domain"]}}}}
```

## The PublicApiCreateCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiUpdateCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCompanyDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"}}}}}}
```

## The PublicApiUpdateCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the company"},"name":{"type":"string","description":"Name of the company"},"domain":{"type":"string","description":"Company domain"},"description":{"type":"string","description":"Company description"},"industry":{"type":"string","description":"Company industry"},"phone":{"type":"string","description":"Company phone number"},"email":{"type":"string","description":"Company email address"},"currency":{"type":"string","description":"Company currency"},"address":{"type":"string","description":"Company address"},"postalCode":{"type":"string","description":"Postal code"},"city":{"type":"string","description":"City"},"nEmployees":{"type":"number","description":"Number of employees"},"source":{"type":"string","description":"Company source"},"annualRevenue":{"type":"number","description":"Annual revenue"},"status":{"type":"string","description":"Company status"},"foundationYear":{"type":"number","description":"Foundation year"},"sellRating":{"type":"number","description":"Sell rating (0-100)"},"linkedinUrl":{"type":"string","description":"LinkedIn URL"},"parentCompanyId":{"type":"string","description":"Parent company ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiDeleteCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCompanyIntegrationDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiCompanyIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyIntegrationsResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"integrations":{"description":"List of company integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyIntegrationDto"}}},"required":["companyId","integrations"]},"PublicApiCompanyIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiGetCompanyIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompanyIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiCompanyIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiCompanyIntegrationsResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"integrations":{"description":"List of company integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyIntegrationDto"}}},"required":["companyId","integrations"]},"PublicApiCompanyIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiCompanyContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## The PublicApiGetCompanyContactsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompanyContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## The PublicApiCompanyOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCompanyOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## The PublicApiGetCompanyOpportunitiesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetCompanyOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCompanyOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiCompanyOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## The PublicApiCreateCompanyContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## The PublicApiCreateCompanyContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteCompanyContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCompanyContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCreateCompanyOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## The PublicApiCreateCompanyOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateCompanyOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteCompanyOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteCompanyOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiGetOpportunitiesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiGetOpportunityByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetOpportunityByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiCreateOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]}},"required":["name"]}}}}
```

## The PublicApiCreateOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiUpdateOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateOpportunityDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]}}}}}}
```

## The PublicApiUpdateOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the opportunity"},"name":{"type":"string","description":"Name of the opportunity"},"amount":{"type":"number","description":"Opportunity amount"},"finalAmount":{"type":"number","description":"Final opportunity amount"},"risk":{"type":"string","description":"Opportunity risk level","enum":["Low","Medium","High"]},"priority":{"type":"string","description":"Opportunity priority level","enum":["Low","Medium","High"]},"description":{"type":"string","description":"Opportunity description"},"featuredNotes":{"type":"string","description":"Featured notes for the opportunity"},"nextStep":{"type":"string","description":"Next step for the opportunity"},"closeDate":{"format":"date-time","type":"string","description":"Actual close date"},"closeProbability":{"type":"number","description":"Close probability (0-100)"},"status":{"type":"string","description":"Opportunity status","enum":["won","lost","open","archived","break"]},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"}},"required":["id","name","createdAt","updatedAt"]}}}}
```

## The PublicApiDeleteOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiOpportunityIntegrationDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiOpportunityIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiOpportunityIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiOpportunityIntegrationsResponseDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"integrations":{"description":"List of opportunity integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityIntegrationDto"}}},"required":["opportunityId","integrations"]},"PublicApiOpportunityIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiGetOpportunityIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetOpportunityIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiOpportunityIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityIntegrationsResponseDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"integrations":{"description":"List of opportunity integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityIntegrationDto"}}},"required":["opportunityId","integrations"]},"PublicApiOpportunityIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiOpportunityContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiOpportunityContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## The PublicApiGetOpportunityContactsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetOpportunityContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"contactFirstName":{"type":"string","description":"Contact first name"},"contactLastName":{"type":"string","description":"Contact last name"},"contactEmail":{"type":"string","description":"Contact email"},"contactTitlePosition":{"type":"string","description":"Contact title/position"}},"required":["contactId","contactEmail"]}}}}
```

## The PublicApiOpportunityCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiOpportunityCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"},"isPrimary":{"type":"boolean","description":"Is primary company for this opportunity"}},"required":["companyId","companyName"]}}}}
```

## The PublicApiGetOpportunityCompaniesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetOpportunityCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiOpportunityCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiOpportunityCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"},"isPrimary":{"type":"boolean","description":"Is primary company for this opportunity"}},"required":["companyId","companyName"]}}}}
```

## The PublicApiCreateOpportunityContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityContactDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"}},"required":["contactId"]}}}}
```

## The PublicApiCreateOpportunityContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteOpportunityContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteOpportunityContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteOpportunityCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteOpportunityCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCreateOpportunityCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## The PublicApiCreateOpportunityCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateOpportunityCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## The PublicApiGetContactsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetContactsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## The PublicApiGetContactByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetContactByIdResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## The PublicApiCreateContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"}},"required":["email"]}}}}
```

## The PublicApiCreateContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## The PublicApiUpdateContactDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateContactDto":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"}}}}}}
```

## The PublicApiUpdateContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUpdateContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact"},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"salutation":{"type":"string","description":"Salutation of the contact"},"birthday":{"format":"date-time","type":"string","description":"Birthday of the contact"},"email":{"type":"string","description":"Email address of the contact"},"phone":{"type":"string","description":"Phone number of the contact"},"genderIdentity":{"type":"string","description":"Gender identity of the contact"},"pronouns":{"type":"string","description":"Pronouns of the contact"},"fax":{"type":"string","description":"Fax number of the contact"},"linkedinUrl":{"type":"string","description":"LinkedIn URL of the contact"},"address":{"type":"string","description":"Address of the contact"},"postalCode":{"type":"string","description":"Postal code of the contact"},"city":{"type":"string","description":"City of the contact"},"state":{"type":"string","description":"State of the contact"},"country":{"type":"string","description":"Country of the contact"},"currency":{"type":"string","description":"Currency preference of the contact"},"titlePosition":{"type":"string","description":"Title/Position of the contact"},"language":{"type":"string","description":"Language preference of the contact"},"assistant":{"type":"string","description":"Assistant name of the contact"},"assistantPhone":{"type":"string","description":"Assistant phone number"},"division":{"type":"string","description":"Division of the contact"},"department":{"type":"string","description":"Department of the contact"},"description":{"type":"string","description":"Description of the contact"},"leadSource":{"type":"string","description":"Lead source of the contact"},"leadRecordType":{"type":"string","description":"Lead record type"},"reportsTo":{"type":"string","description":"Reports to contact ID"},"createdAt":{"format":"date-time","type":"string","description":"Creation date"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date"},"personId":{"type":"string","description":"ID of the person associated with this contact"}},"required":["id","email","createdAt","updatedAt","personId"]}}}}
```

## The PublicApiDeleteContactResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteContactResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiContactIntegrationDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiContactIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiContactIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiContactIntegrationsResponseDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"integrations":{"description":"List of contact integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiContactIntegrationDto"}}},"required":["contactId","integrations"]},"PublicApiContactIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiGetContactIntegrationsResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetContactIntegrationsResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiContactIntegrationsResponseDto"}},"required":["statusCode","count","error","data"]},"PublicApiContactIntegrationsResponseDto":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact ID"},"integrations":{"description":"List of contact integrations","type":"array","items":{"$ref":"#/components/schemas/PublicApiContactIntegrationDto"}}},"required":["contactId","integrations"]},"PublicApiContactIntegrationDto":{"type":"object","properties":{"integrationType":{"type":"string","description":"Integration type"},"integrationName":{"type":"string","description":"Integration name"},"integrationId":{"type":"string","description":"ID of the record in the integration"}},"required":["integrationType","integrationName","integrationId"]}}}}
```

## The PublicApiContactCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiContactCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"}},"required":["companyId","companyName"]}}}}
```

## The PublicApiGetContactCompaniesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetContactCompaniesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactCompanyDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"}},"required":["companyId","companyName"]}}}}
```

## The PublicApiContactOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiContactOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## The PublicApiGetContactOpportunitiesResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetContactOpportunitiesResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiContactOpportunityDto"}}},"required":["statusCode","count","error","data"]},"PublicApiContactOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"},"opportunityName":{"type":"string","description":"Opportunity name"},"opportunityAmount":{"type":"number","description":"Opportunity amount"},"opportunityStatus":{"type":"string","description":"Opportunity status"}},"required":["opportunityId","opportunityName"]}}}}
```

## The PublicApiCreateContactCompanyDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactCompanyDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"}},"required":["companyId"]}}}}
```

## The PublicApiCreateContactCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteContactCompanyResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteContactCompanyResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiCreateContactOpportunityDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactOpportunityDto":{"type":"object","properties":{"opportunityId":{"type":"string","description":"Opportunity ID"}},"required":["opportunityId"]}}}}
```

## The PublicApiCreateContactOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiCreateContactOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiDeleteContactOpportunityResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiDeleteContactOpportunityResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"boolean"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiUserDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUserDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the user"},"email":{"type":"string","description":"Email address of the user"},"firstName":{"type":"string","description":"First name of the user"},"lastName":{"type":"string","description":"Last name of the user"},"phone":{"type":"string","description":"Phone number of the user"},"position":{"type":"string","description":"Job position of the user","enum":["founder","c_level","engineering_product","sales_manager","account_executive","closer","sales_development_representative","marketing","customer_support_success","finance","business_analyst","operations","other"]},"metadata":{"type":"object","description":"Additional metadata for the user"},"personId":{"type":"string","description":"ID of the person associated with this user"}},"required":["id","email","firstName","lastName","personId"]}}}}
```

## The PublicApiGetUsersResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetUsersResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"description":"Array of users","type":"array","items":{"$ref":"#/components/schemas/PublicApiUserDto"}}},"required":["statusCode","count","error","data"]},"PublicApiUserDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the user"},"email":{"type":"string","description":"Email address of the user"},"firstName":{"type":"string","description":"First name of the user"},"lastName":{"type":"string","description":"Last name of the user"},"phone":{"type":"string","description":"Phone number of the user"},"position":{"type":"string","description":"Job position of the user","enum":["founder","c_level","engineering_product","sales_manager","account_executive","closer","sales_development_representative","marketing","customer_support_success","finance","business_analyst","operations","other"]},"metadata":{"type":"object","description":"Additional metadata for the user"},"personId":{"type":"string","description":"ID of the person associated with this user"}},"required":["id","email","firstName","lastName","personId"]}}}}
```

## The PublicApiUserMetadataUpdateDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUserMetadataUpdateDto":{"type":"object","properties":{"metadata":{"type":"object","description":"Metadata fields to update for the user"}},"required":["metadata"]}}}}
```

## The PublicApiUserMetadataResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiUserMetadataResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"type":"object","description":"Updated user metadata"}},"required":["statusCode","count","error","data"]}}}}
```

## The PublicApiVoiceAgentCallDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiVoiceAgentCallDto":{"type":"object","properties":{}}}}}
```

## The PublicApiGetVoiceAgentCallByIdResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiGetVoiceAgentCallByIdResponseDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PublicApiVoiceAgentCallDto"}}},"PublicApiVoiceAgentCallDto":{"type":"object","properties":{}}}}}
```

## The PublicApiStartCallWebhookDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiStartCallWebhookDto":{"type":"object","properties":{"name":{"type":"string","description":"Full name of the contact"},"email":{"type":"string","description":"Email address of the contact (optional if phone is provided)"},"phone":{"type":"string","description":"Phone in E.164 format (e.g., +1234567890)"},"dynamicVariables":{"type":"object","description":"Dynamic variables to be used in the voice agent prompt. Must match the variables configured in the agent."}},"required":["name","phone"]}}}}
```

## The PublicApiStartCallWebhookResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiStartCallWebhookResponseDto":{"type":"object","properties":{"callId":{"type":"string","description":"ID of the created voice agent call"},"status":{"type":"string","description":"Status of the call","enum":["queued","ringing","in_progress","completed","failed","cancelled"]},"contactId":{"type":"string","description":"ID of the contact associated with the call"},"phoneNumber":{"type":"string","description":"Phone number being called"},"createdAt":{"format":"date-time","type":"string","description":"Timestamp when the call was created"}},"required":["callId","status","contactId","phoneNumber","createdAt"]}}}}
```

## The PublicApiMailAddressDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiMailAddressDto":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["email"]}}}}
```

## The PublicApiSendMailRequestDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSendMailRequestDto":{"type":"object","properties":{"grantId":{"type":"string","description":"Optional connected mailbox identifier. Prefer senderEmail so the backend resolves the active mailbox."},"senderEmail":{"type":"string","description":"Email address of the connected mailbox. Must match the configured mailbox."},"fromName":{"type":"string"},"to":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}},"cc":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}},"bcc":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}},"replyTo":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}},"replyToMessageId":{"type":"string"},"subject":{"type":"string"},"html":{"type":"string","description":"HTML email body."},"text":{"type":"string","description":"Plain text fallback body."},"metadata":{"type":"object","description":"Optional metadata for tracing the n8n execution."}},"required":["to","subject"]},"PublicApiMailAddressDto":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["email"]}}}}
```

## The PublicApiSendMailResultDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSendMailResultDto":{"type":"object","properties":{"messageId":{"type":"string","nullable":true},"threadId":{"type":"string","nullable":true},"senderEmail":{"type":"string"},"to":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}}},"required":["messageId","threadId","senderEmail","to"]},"PublicApiMailAddressDto":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["email"]}}}}
```

## The PublicApiSendMailResponseDto object

```json
{"openapi":"3.0.0","info":{"title":"Salescaling API","version":"1.0"},"components":{"schemas":{"PublicApiSendMailResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","default":200},"count":{"type":"number"},"error":{"type":"string","nullable":true},"data":{"$ref":"#/components/schemas/PublicApiSendMailResultDto"}},"required":["statusCode","count","error","data"]},"PublicApiSendMailResultDto":{"type":"object","properties":{"messageId":{"type":"string","nullable":true},"threadId":{"type":"string","nullable":true},"senderEmail":{"type":"string"},"to":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiMailAddressDto"}}},"required":["messageId","threadId","senderEmail","to"]},"PublicApiMailAddressDto":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["email"]}}}}
```


# Webhooks

Configura webhooks de Salescaling para recibir eventos en tiempo real sobre reuniones, llamadas y actividad comercial.

Los webhooks te permiten recibir notificaciones en tiempo real sobre eventos que ocurren en Salescaling. Cuando se produce un evento, Salescaling enviará una solicitud HTTP POST a la URL que hayas configurado.

## Configuración de Webhooks

Para configurar un webhook, necesitas proporcionar:

* Nombre del webhook
* URL de destino
* Tipo de evento a escuchar
* Headers personalizados (opcional)
* Descripción (opcional)

## Tipos de Eventos

Actualmente soportamos los siguientes tipos de eventos:

### 1. Cambios en el Estado de Reuniones (`meeting_status_changed`)

Este evento se dispara cuando hay cambios en el estado de una reunión. Los posibles estados son:

* `meeting_created`: Cuando se crea una nueva reunión
* `meeting_deleted`: Cuando se elimina una reunión
* `meeting_transcript_done`: Cuando se completa la transcripción
* `meeting_summary_done`: Cuando se completa el resumen
* `meeting_video_done`: Cuando se completa el procesamiento del vídeo
* `meeting_notes_done`: Cuando se completa el procesamiento de las notas

#### Payload

```json
{
  "meetingId": "string",
  "status": "meeting_created" | "meeting_deleted" | "meeting_transcript_done" | "meeting_summary_done" | "meeting_video_done" | "meeting_notes_done"
}
```

#### Notas

* El procesamiento del vídeo y del contenido de la reunión se realiza de forma paralela, por lo que el evento `meeting_video_done` se puede recibir antes del evento `meeting_summary_done`.
* Si se quiere saber cuando se completa el procesamiento del contenido de la reunión, se puede utilizar el evento `meeting_summary_done`.
* Si se quiere saber cuando se completa el procesamiento de las notas, se puede utilizar el evento `meeting_notes_done`.

### 2. Cambios en Notas de Reuniones (`meeting_note_status_changed`)

Este evento se dispara cuando hay cambios en al menos una nota de una reunión. Los posibles estados son:

* `meeting_note_created`: Cuando se crea una nueva nota
* `meeting_note_deleted`: Cuando se elimina una nota
* `meeting_note_updated`: Cuando se actualiza una nota

#### Payload

```json
{
  "meetingNoteId": "string",
  "status": "meeting_note_created" | "meeting_note_deleted" | "meeting_note_updated"
}
```

#### Notas

* Este evento se dispara una vez por cada nota que se procese.
* Al generarse notas de forma automática, se dispara este evento para cada nota generada.

### 3. Detección de Señales Comerciales (`commercial_signal_detected`)

Este evento se dispara cuando se detecta una señal comercial en una actividad. Las señales comerciales son indicadores importantes que pueden ayudar a identificar oportunidades o riesgos en las interacciones con clientes.

#### Payload

```json
{
  "code": "string",
  "description": "string",
  "contactId": "string",
  "companyId": "string",
  "activityType": "string",
  "activityId": "string",
  "evidence": ["string"],
  "changeType": "string"
}
```

#### Campos

* `code`: Código de la señal comercial detectada. Los tipos disponibles son:
  * **Engagement & Intent**:
    * `buying_intent`: Intención de compra detectada
    * `interest_in_trial`: Interés en realizar una prueba
    * `opportunity_qualified`: Oportunidad calificada
    * `champion_detected`: Detección de un campeón interno
    * `gatekeeper_detected`: Detección de un guardián
    * `future_meeting_scheduled`: Reunión futura programada
    * `decision_timeline_mentioned`: Mencionada línea temporal de decisión
    * `follow_up_required`: Se requiere seguimiento
    * `follow_up_deadline_mentioned`: Mencionado plazo de seguimiento
    * `multi_department_involvement`: Involucrados múltiples departamentos
  * **Pricing, Budget & Negotiation**:
    * `pricing_discussed`: Discusión sobre precios
    * `budget_blocker`: Bloqueo por presupuesto
    * `budget_discussed`: Discusión sobre presupuesto
    * `discount_requested`: Solicitado descuento
    * `contractual_concerns`: Preocupaciones contractuales
    * `legal_process_discussed`: Discusión sobre proceso legal
    * `renewal_discussed`: Discusión sobre renovación
    * `upsell_opportunity`: Oportunidad de upsell
    * `pilot_success`: Éxito del piloto
    * `pilot_failure`: Fracaso del piloto
  * **Fit & Product**:
    * `product_fit_confirmed`: Confirmado ajuste del producto
    * `usage_feedback_positive`: Feedback positivo de uso
    * `usage_feedback_negative`: Feedback negativo de uso
    * `technical_validation_passed`: Pasada validación técnica
    * `technical_blocker`: Bloqueo técnico
    * `integration_concerns`: Preocupaciones sobre integración
    * `training_requested`: Solicitado entrenamiento
    * `feature_request_made`: Solicitada nueva funcionalidad
    * `security_concerns`: Preocupaciones de seguridad
    * `compliance_concern`: Preocupación sobre cumplimiento
  * **Competition**:
    * `competitor_mentioned`: Mencionado competidor
    * `competitor_comparison_favorable`: Comparación favorable con competidor
    * `competitor_comparison_unfavorable`: Comparación desfavorable con competidor
  * **Risk & Churn**:
    * `churn_risk`: Riesgo de abandono
    * `no_decision_maker`: Sin tomador de decisiones
    * `internal_disalignment`: Desalineación interna
    * `resistance_to_change`: Resistencia al cambio
    * `escalation_detected`: Detectada escalada
    * `low_engagement`: Bajo compromiso
    * `deadline_blocker`: Bloqueo por plazo
  * **Relationship & Communication**:
    * `positive_feedback_on_demo`: Feedback positivo en demo
    * `negative_feedback_on_demo`: Feedback negativo en demo
    * `rapport_detected`: Detectado rapport
    * `misalignment_on_goals`: Desalineación en objetivos
    * `client_asks_many_questions`: Cliente hace muchas preguntas
    * `client_confused_about_offering`: Cliente confundido sobre la oferta
    * `tone_aggressive`: Tono agresivo
    * `tone_passive`: Tono pasivo
    * `speaker_dominates_conversation`: El hablante domina la conversación
    * `client_drives_conversation`: El cliente dirige la conversación
* `description`: Descripción detallada de la señal
* `contactId`: ID del contacto relacionado
* `companyId`: ID de la empresa relacionada
* `category`: Categoría de la señal comercial. Los tipos disponibles son:
  * `positive`: Señal positiva
  * `risk`: Señal de riesgo
  * `neutral`: Señal neutral
* `activityType`: Tipo de actividad donde se detectó la señal. Los tipos disponibles son:
  * `meeting`: Reunión
  * `call`: Llamada
  * `mail`: Correo electrónico
* `activityId`: ID de la actividad donde se detectó la señal
* `evidence`: Array de evidencias textuales que soportan la detección de la señal
* `changeType`: Tipo de cambio que representa la señal. Los tipos disponibles son:
  * `new`: Nueva señal detectada
  * `unchanged`: Señal sin cambios
  * `escalated`: Señal escalada
  * `improved`: Señal mejorada
  * `recovered`: Señal recuperada

## Estructura de la Solicitud

Cada solicitud webhook incluye:

1. **Headers**:
   * `Content-Type: application/json`
   * Headers personalizados configurados
   * `X-Webhook-Signature`: Firma para verificar la autenticidad (próximamente)
2. **Body**:
   * Definido según el tipo de evento

## Mejores Prácticas

1. **Verificación de Payload**:
   * Implementa la verificación de la firma del webhook (Próximamente)
2. **Manejo de Errores**:
   * Responde con un código 2xx para confirmar la recepción
   * Implementa reintentos en caso de fallos
   * Mantén un registro de los eventos recibidos
3. **Seguridad**:
   * Utiliza HTTPS para tu endpoint
   * Implementa autenticación en tu endpoint, puedes especificar un token en las cabeceras de la solicitud
   * Valida los datos recibidos antes de procesarlos

## Ejemplo de Implementación

```javascript
app.post("/webhook", (req, res) => {
  const { type, payload } = req.body;

  switch (type) {
    case "meeting_status_changed":
      handleMeetingStatusChange(payload);
      break;
    case "meeting_note_status_changed":
      handleMeetingNoteStatusChange(payload);
      break;
  }

  res.status(200).send("OK");
});
```

## Límites y Restricciones

* Los webhooks tienen un tiempo de espera de 10 segundos
* Se realizarán hasta 3 reintentos en caso de fallo
* El tamaño máximo del payload es de 1MB

## Soporte

Si necesitas ayuda con la implementación de webhooks o tienes preguntas sobre los eventos disponibles, contacta con nuestro equipo de soporte.


# Términos y condiciones

Última actualización: 26 de mayo de 2025.

## Introducción

Estos Términos y Condiciones ("Términos") regulan tu acceso y uso de nuestra plataforma de software como servicio ("SaaS"), que proporciona una solución integral para grabar, transcribir y generar notas accionables a partir de llamadas de ventas. Al acceder o utilizar la plataforma de Salescaling (en adelante, “Salescaling” o la “Plataforma”), aceptas quedar obligado por estos Términos. Si no estás de acuerdo con estos Términos, por favor abstente de usar nuestros servicios.

La Plataforma está destinada exclusivamente a empresas, profesionales y organizaciones (en adelante, el “Cliente” o “Usuario”) que actúan dentro del ámbito de su actividad comercial, empresarial o profesional. En consecuencia, no se aplica a consumidores o usuarios finales según lo definido en el artículo 3 del Real Decreto Legislativo 1/2007, y la aceptación de estos Términos constituye una declaración expresa de que el usuario actúa en dicha capacidad profesional.

Estos Términos también se aplican a cualquier individuo que acceda, navegue o interactúe con la Plataforma o sus servicios, incluso sin registrarse o crear una cuenta. Al acceder o usar cualquier parte de la Plataforma, tales individuos aceptan quedar vinculados por las obligaciones generales y restricciones aquí establecidas, especialmente las relativas a la propiedad intelectual, uso aceptable, protección de datos y limitaciones de responsabilidad.

Sin embargo, dichos individuos no serán considerados Clientes o Usuarios según se definen en estos Términos, y su acceso no les otorga ningún derecho a usar los servicios de la Plataforma más allá de la navegación pasiva o funcionalidades de prueba permitidas.

Al usar nuestra plataforma, reconoces que has leído, comprendido y aceptado cumplir con estos Términos, así como con las leyes y regulaciones aplicables. Si usas Salescaling en nombre de una empresa u organización, confirmas que estás autorizado para vincular a dicha entidad con estos Términos.\
Ten en cuenta que Salescaling puede actualizar estos Términos periódicamente para reflejar mejoras en nuestra plataforma, cambios en los requisitos legales u otras necesidades comerciales. Te informaremos de cualquier cambio significativo, pero te recomendamos revisar este documento regularmente para estar al tanto de actualizaciones.

## La Empresa

* SALESCALING SOFTWARE, S.L.
* C/ Crujiola, 6, Edificio Alsaca, Torre 2, Piso 5
* 38530 Candelaria (Santa Cruz de Tenerife)
* NIF B19825488

Si tienes alguna pregunta o inquietud respecto a estos Términos, por favor contacta con nosotros en <support@salescaling.com>

## Definiciones

A lo largo de estos Términos y Condiciones, los siguientes términos tendrán los significados descritos a continuación. Estas definiciones son esenciales para asegurar que los usuarios comprendan claramente los términos clave y su aplicación al usar el software.

### 1.1. "Plataforma"

Se refiere al software como servicio (SaaS) provisto por Salescaling, que permite a los usuarios grabar, transcribir, analizar y generar notas de llamadas y reuniones de ventas utilizando herramientas digitales y basadas en la nube.

### 1.2. "Software"

El software proporcionado por Salescaling incluye todas las aplicaciones, interfaces, módulos y funcionalidades disponibles en la Plataforma, ya sea accesado a través de un navegador web o aplicación móvil. Esto incluye herramientas para grabación de audio, transcripción automatizada, análisis de conversaciones, entre otros.

### 1.3. "Usuario"

Cualquier persona, empresa u organización que acceda o use la Plataforma de Salescaling. El término "Usuario" incluye tanto a individuos que crean una cuenta como a aquellos que acceden al servicio en nombre de una organización. Los "Usuarios" pueden ser clientes directos, representantes, empleados o cualquier otro tercero autorizado para usar la Plataforma.

### 1.4. "Cliente"

Se refiere a la persona, empresa u organización que ha celebrado un acuerdo o contrato con Salescaling para acceder a los servicios de la Plataforma. El Cliente puede tener múltiples Usuarios que acceden a la Plataforma bajo la misma cuenta o suscripción.

### 1.5. "Contenido"

Toda la información, datos, grabaciones de audio, transcripciones de texto, notas generadas y otros materiales creados, enviados, almacenados o transmitidos por los Usuarios a través de la Plataforma. El Contenido incluye tanto la información grabada de llamadas como las transcripciones y notas automáticas generadas por Salescaling.

### 1.6. "Datos del Usuario"

Cualquier información proporcionada por el Usuario, incluyendo datos de registro, información de contacto, detalles de reuniones y cualquier otro dato relevante introducido en la Plataforma o recolectado automáticamente durante el uso de los servicios, como grabaciones de llamadas.

### 1.7. "Transcripción"

El proceso automatizado mediante el cual Salescaling convierte las grabaciones de audio de llamadas de ventas en texto escrito utilizando tecnología de reconocimiento de voz.

### 1.8. "Notas de Reunión"

Las notas generadas automáticamente por Salescaling, basadas en el análisis de conversaciones y llamadas de ventas grabadas. Estas notas resaltan puntos clave, decisiones y acciones sugeridas, mejorando la productividad de las reuniones.

### 1.9. "Grabación de Llamada"

La funcionalidad de la Plataforma que captura y almacena el contenido de llamadas o reuniones de ventas en formato digital de audio. Estas grabaciones se usan para la posterior transcripción y análisis.

### 1.10. "Inteligencia Artificial (IA)"

El conjunto de algoritmos y tecnologías de aprendizaje automático que Salescaling utiliza para analizar llamadas de ventas, identificar puntos clave de la conversación, generar transcripciones automáticas y crear notas inteligentes de las reuniones.

### 1.11. "Acceso"

Se refiere al acto de iniciar sesión y usar la Plataforma o Software, ya sea a través de un navegador web, aplicación móvil o cualquier otro dispositivo compatible.

### 1.12. "Suscripción"

El acuerdo comercial bajo el cual el Cliente obtiene acceso a la Plataforma de Salescaling basado en los términos de un plan de pago específico, ya sea mensual, anual u otro.

### 1.13. "Servicio Beta"

Los servicios beta significan un producto, servicio o funcionalidad proporcionados por Salescaling que pueden estar disponibles para que los pruebes opcionalmente y sin coste adicional, claramente designados como beta, piloto, lanzamiento limitado, no producción, acceso anticipado, evaluación, laboratorios o por una descripción similar.

### 1.14. "Terceros"

Cualquier individuo o entidad que no sea el Usuario o Salescaling pero que pueda interactuar con la Plataforma o los servicios del Cliente, como socios comerciales o clientes del Cliente.

### 1.15. "Política de Privacidad"

El documento que detalla cómo Salescaling recopila, utiliza, almacena y protege la información personal y los datos del Usuario o Cliente de acuerdo con las leyes aplicables de protección de datos.

### 1.16. "Add-on/s"

Servicios complementarios que podrán ser contratados por el Cliente junto a los servicios básicos. Durante el proceso de contratación se le informará al Cliente sobre los distintos Add-on/s y qué servicios son de obligatoria suscripción para la contratación de los Add-on/s.

### 1.17. "Servicio SDR"

Add-on que permite a los Clientes automatizar comunicaciones y llamadas, y agendar nuevas reuniones con clientes potenciales a través de un agente conversacional configurable con voz sintética.

## 2. Cuenta y Registro

* 2.1 Para acceder a la Plataforma y las funcionalidades del Software, debes registrarte para crear un perfil y cuenta ("Cuenta"), la cual estará protegida con una contraseña. Durante el registro, se te podrá solicitar información específica, que manejaremos conforme a estos Términos. Tras el registro, verificaremos tu información, confirmaremos la titularidad y, una vez validada, te proporcionaremos acceso a la Plataforma.
* 2.2 Tu Cuenta es intransferible, y eres responsable de mantener la confidencialidad de tus credenciales de acceso y de asegurar el acceso a tu cuenta de correo electrónico. Cualquier actividad bajo tu Cuenta es exclusivamente tu responsabilidad, incluyendo acciones realizadas por usuarios no autorizados si tus credenciales son comprometidas. Debes proteger tus dispositivos y actualizar regularmente la información de tu Cuenta para garantizar la seguridad. Notifícanos inmediatamente al contacto indicado en la Sección 15 si detectas acceso no autorizado o actividad sospechosa.
* 2.3 Además, puedes tener la opción de iniciar sesión mediante servicios de terceros, cuyo uso de datos estará regulado por la política de privacidad del tercero correspondiente. Podemos acceder a tu Cuenta únicamente para asistirte en la gestión de tu Cuenta o uso del Software, aunque puedes solicitarnos restringir este acceso en cualquier momento. Si detectamos actividad sospechosa o fraudulenta, podremos suspender tu Cuenta para proteger tus datos, notificándote por correo electrónico hasta que el asunto se resuelva.

## 3. Uso del Software y accesibilidad

### 3.1. Concesión de Licencia.

Sujeto a la suscripción a uno de los planes disponibles durante el proceso de contratación, Salescaling te concede una licencia limitada, no exclusiva, intransferible y revocable para acceder y usar la Plataforma y el Software únicamente para tus fines comerciales internos, estrictamente conforme a los términos del plan suscrito, durante la duración de dicha suscripción, y sujeto al cumplimiento total de las obligaciones de pago correspondientes. Esta licencia también podrá estar limitada al número máximo de usuarios autorizados definido en el plan seleccionado según estos Términos.

### 3.2. Conducta del Usuario

Aceptas usar la Plataforma y el Software de manera responsable y conforme a todas las leyes y regulaciones aplicables. Eres responsable de asegurar que tu uso de la Plataforma no infrinja derechos de terceros. Las siguientes conductas están estrictamente prohibidas:

* Usar la Plataforma o el Software para fines ilegales o no autorizados.
* Interferir o perturbar la seguridad, integridad o rendimiento de la Plataforma.
* Intentar obtener acceso no autorizado a cualquier parte de la Plataforma, incluyendo cuentas de otros usuarios o sistemas.

### 3.3. Restricciones de Uso

Aceptas no:

* Licenciar, sublicenciar, vender, revender, alquilar, arrendar, transferir, ceder, distribuir o explotar comercialmente la Plataforma o el Software.
* Usar la Plataforma para almacenar o transmitir contenido ilegal, dañino o que viole derechos de terceros.
* Intentar realizar ingeniería inversa, descompilar, desensamblar o extraer de cualquier otra forma el código fuente del Software.
* Usar sistemas automatizados, como bots o rastreadores, para acceder a la Plataforma o sus datos sin permiso expreso por escrito de Salescaling.

### 3.4. Disponibilidad del Servicio

Salescaling realizará esfuerzos razonables para asegurar que la Plataforma y el Software estén disponibles y funcionen correctamente. Sin embargo, no garantizamos un servicio ininterrumpido o libre de errores. El acceso a la Plataforma puede suspenderse temporalmente para mantenimiento, actualizaciones o por factores fuera de nuestro control.

### 3.5. Responsabilidad sobre los Datos

El Cliente es responsable de la precisión, calidad y legalidad de los datos y contenido que ingresa o transmite a través de la Plataforma. Salescaling no asume responsabilidad alguna por errores, omisiones o problemas relacionados con los datos proporcionados por los usuarios.

### 3.6 Cumplimiento de las leyes de grabación y consentimiento para almacenamiento.

El Cliente es el único responsable de cumplir con todas las leyes aplicables de grabación. Al usar las funciones de grabación proporcionadas a través de proveedores de servicios terceros, el Cliente otorga permiso a Salescaling para almacenar las Grabaciones de Llamadas de cualquier reunión o videoconferencia en la que participes.

### 3.7 Retención y almacenamiento de Grabaciones

Salescaling conservará los datos personales procesados en nombre del Cliente mientras sea necesario para proveer los servicios contratados y durante la vigencia de la Suscripción activa del Cliente a la Plataforma.

Tras la terminación o expiración de la Suscripción, Salescaling tendrá derecho a eliminar dichos datos dentro de un período de 30 días naturales, salvo que el Cliente solicite la eliminación anticipada o acuerde un periodo de retención extendido bajo un acuerdo separado. Cualquier retención extendida podrá estar sujeta a tarifas adicionales, que serán notificadas previamente. El Cliente es el único responsable de exportar cualquier grabación o dato relacionado antes de su eliminación programada. Salescaling no será responsable por la pérdida de datos eliminados conforme a esta cláusula.

De acuerdo con el artículo 28.3 (g) del Reglamento General de Protección de Datos (RGPD), el Cliente podrá instruir a Salescaling para devolver o eliminar todos los datos personales al final de la prestación de los servicios. Según el plan de Suscripción contratado, podrán aplicarse cargos proporcionales por la devolución o descarga masiva de grabaciones, los cuales serán comunicados y acordados previamente con el Usuario.

### 3.8 Acceso y descarga de Grabaciones

El acceso y descarga de las Grabaciones y Transcripciones almacenadas podrá estar limitado a la duración de la Suscripción activa y al alcance de las funcionalidades incluidas en el plan seleccionado. Salescaling se reserva el derecho de cobrar tarifas adicionales por exportaciones masivas o almacenamiento extendido, según lo especificado en la tabla de precios aplicable.

### 3.9 Servicios SDR

#### a) Descripción del servicio

El servicio SDR está basado en tecnología generativa y síntesis de voz proporcionada por ElevenLabs, que constituye un Sistema de Inteligencia Artificial de Propósito General, tal y como se define en el artículo 3(63) del Reglamento (UE) 2024/1689 del Parlamento Europeo y del Consejo sobre Inteligencia Artificial ("Ley de IA").

El SDR no realiza ventas ni toma decisiones comerciales por iniciativa propia. Ejecuta exclusivamente las instrucciones configuradas por el Cliente, en función de los datos y parámetros proporcionados por el Cliente (como números de contacto, mensajes de apertura, objetivos de llamada y flujo de conversación). Bajo ninguna circunstancia el SDR decide a quién contactar ni actúa de forma autónoma más allá de dicha configuración.

#### b) Actores en virtud de la Ley de IA

* ElevenLabs actúa como proveedor del modelo fundacional.
* Salescaling actúa como proveedor de un sistema integrado de IA de propósito general, de la Ley de IA, incorporando el modelo dentro de su entorno SaaS.
* El Cliente actúa como implementador del sistema (artículo 3 (9) de la Ley de IA) y es el único responsable del uso específico que se haga del Agente en el desarrollo de su actividad comercial.

#### c) Funcionalidades del SDR configurables y responsabilidad del Cliente

El Cliente reconoce y acepta que:

* El SDR puede grabar llamadas solo si el Cliente habilita esta funcionalidad. En tal caso, el Cliente será responsable de informar a los interlocutores y obtener su consentimiento, o de cumplir con la base legal aplicable, según lo dispuesto en la Sección 3.6 de estos Términos.
* El SDR puede, si así lo configura el Cliente, solicitar información adicional al interlocutor durante la conversación (por ejemplo, confirmar el nombre, la dirección de correo electrónico o la disponibilidad de la reunión). El Cliente será responsable de garantizar que dichas preguntas y cualquier tratamiento posterior de los datos cumplan con la normativa de protección de datos y los principios de licitud, transparencia y minimización de datos.
* La normativa nacional o europea en materia de comunicaciones comerciales puede limitar el uso de determinados números o extensiones para la realización de llamadas automatizadas o promocionales. En este sentido, Salescaling recomienda utilizar números fijos o extensiones asociadas al local comercial del Cliente y evitar el uso de líneas móviles personales o no registradas.

El Cliente será plenamente responsable del cumplimiento de la normativa aplicable en materia de telecomunicaciones y sectorial, incluidas las relativas a las listas de exclusión publicitaria o "Listas Robinson", en su caso.

#### d) Obligaciones del cliente (como implementador del sistema)

Como implementador del sistema, el Cliente se compromete a:

* Utilizar el SDR únicamente con fines legales, éticos y profesionales, y de acuerdo con las instrucciones de Salescaling.
* Informar claramente a los interlocutores que están interactuando con un agente de inteligencia artificial automatizado, de conformidad con el artículo 50, apartado 1, letra a), de la Ley de IA, y ofrecerles la opción de ser atendidos por un representante humano. Salescaling se ha diseñado para permitir al al Cliente incluir el referido aviso y para configurar la voz, tono, y características del agente de tal forma que el Cliente podrá cumplir la normativa. A continuación proponemos un pequeño aviso informativo que puede servir a modo de ejemplo para informar a los clientes finales de la llamada: "Hola, este es el asistente virtual de \[nombre de la empresa]. Esta llamada puede ser grabada para mejorar nuestro servicio".
* Asegurar el cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y de Comercio Electrónico (LSSI) y del Reglamento General de Protección de Datos (RGPD), incluyendo la obtención de las autorizaciones necesarias y el establecimiento de una base legal válida para el tratamiento de datos y la realización de comunicaciones automatizadas o comerciales.

## 4. Privacidad y Protección de Datos

* 4.1 Salescaling se compromete a proteger la privacidad y los datos personales de sus usuarios conforme al Reglamento General de Protección de Datos (Reglamento (UE) 2016/679, "RGPD") y cualquier otra legislación europea aplicable.
* 4.2 Los datos de contacto de los representantes y empleados de cada Parte que puedan procesarse bajo estos Términos serán tratados por la otra Parte únicamente para permitir el desarrollo, ejecución y control de la relación contractual entre las Partes. La base legal para este procesamiento es la ejecución de la relación contractual. Dichos datos se conservarán durante la prestación de los servicios y mientras sea necesario para cumplir con las obligaciones legales aplicables o hasta la expiración de responsabilidades derivadas. Cada Parte podrá ejercer sus derechos de acceso, rectificación, supresión, limitación, portabilidad y oposición contactando a la otra Parte en los correos electrónicos proporcionados. En caso de desacuerdo, podrán presentar reclamación ante la Agencia Española de Protección de Datos (AEPD) o autoridad supervisora competente.
* 4.3 Salescaling recopila y procesa datos personales en nombre del Cliente durante la prestación de los servicios. Esta información puede incluir datos personales como nombres, datos de contacto y cargos laborales, así como grabaciones de audio y video. Los datos recogidos se usan principalmente para proveer nuestros servicios, incluyendo pero no limitados a la integración con sistemas CRM de terceros y para mejorar la experiencia del usuario mediante mejoras del producto.
* 4.4 Respecto a los datos personales que el Cliente pone a disposición de Salescaling en relación con la prestación de los Servicios, el usuario confirma y garantiza que:
  * actúa como Responsable del Tratamiento conforme a la legislación aplicable;
  * cuenta con una base legal válida para el procesamiento de dichos datos y para su divulgación y subcontratación a Salescaling para la prestación de los Servicios;
  * ha tomado todas las medidas necesarias para asegurar el procesamiento lícito, incluyendo informar y, cuando corresponda, obtener el consentimiento de los interesados;
  * y cumplirá en todo momento con las disposiciones aplicables del Reglamento General de Protección de Datos (Reglamento UE 2016/679 – RGPD) y las leyes nacionales aplicables.
* 4.5 El procesamiento de datos personales por parte de Salescaling actuando como Encargado del Tratamiento en nombre del Cliente es necesario para la correcta prestación de los servicios bajo este acuerdo. Salescaling no accederá, usará ni procesará datos personales recolectados o subidos por el Cliente para ningún otro propósito que no sea el estrictamente necesario para la prestación de los servicios descritos en estos Términos y en el Acuerdo de Tratamiento de Datos aplicable (“ATD” en adelante).
* 4.6 El ATD puede consultarse [aquí](/cumplimiento-y-legal/procesamiento-datos) y forma parte integral y vinculante de la relación contractual entre el Cliente y Salescaling, y regula el procesamiento de datos personales por parte de Salescaling en nombre del Usuario, conforme al artículo 28 del RGPD, incluyendo, entre otros elementos, una descripción detallada de las categorías de datos personales tratados, los tipos de interesados afectados, la naturaleza y finalidad del tratamiento, las categorías de destinatarios (incluidos subencargados), las medidas técnicas y organizativas de seguridad implementadas por Salescaling y los derechos y obligaciones del usuario como Responsable del Tratamiento.

Al aceptar la casilla correspondiente durante el proceso de registro o creación de cuenta, el Cliente acepta expresamente quedar obligado por el ATD en su totalidad y confirma que tiene la autoridad para actuar en nombre de la entidad que representa. La fecha y hora de aceptación, junto con registros técnicos (incluyendo dirección IP y versión de los Términos), servirán como prueba de la aceptación del Cliente del ATD y estos Términos.

* 4.7 Para más información relacionada con el tratamiento de datos personales por Salescaling visita nuestra [Política de Privacidad](/cumplimiento-y-legal/privacidad).

## 5. Derechos de Propiedad Intelectual

* 5.1. Salescaling y sus licenciantes conservan todos los derechos, títulos e intereses sobre la Plataforma y el Software, incluyendo todo el contenido, información, materiales, código y tecnologías asociados. Esto abarca, pero no se limita a, derechos de autor, patentes, marcas comerciales, arquitectura de navegación, bases de datos, servicios, gráficos, videos y cualquier otro componente visual integral a la app, así como logotipos, iconos, interfaces de usuario, scripts, textos, imágenes, sonidos, música y obras artísticas (“Nuestra Propiedad Intelectual”).
* 5.2. Salvo consentimiento expreso por escrito o lo permitido por la ley aplicable, no puedes, total ni parcialmente, copiar, distribuir, reproducir, adaptar, almacenar, transmitir, descifrar, imprimir, exhibir, comercializar, ejecutar, publicar, crear obras derivadas, ofrecer a la venta o usar de cualquier otra forma parte de Nuestra Propiedad Intelectual. Tus derechos se limitan estrictamente a los expresamente concedidos en estos Términos.
* 5.3. Aceptas no: eludir, eliminar, alterar, desactivar, degradar o socavar ninguna protección de contenido en el Software; usar medios automatizados como robots, arañas o scrapers para acceder al Software; descompilar, realizar ingeniería inversa o desensamblar cualquier software o producto accesible mediante el Software; insertar código o manipular el contenido del Software; o emplear métodos de minería o extracción de datos. Además, aceptas no subir, publicar, enviar por correo electrónico o transmitir material diseñado para interrumpir, dañar o limitar la funcionalidad de cualquier software, hardware o equipo de telecomunicaciones asociado, incluyendo virus o códigos informáticos dañinos.
* 5.4. Sujeto a estos Términos, nos otorgas permiso para usar o divulgar cualquier material, contenido, dato e información proporcionada a Salescaling para y durante la prestación de los servicios (colectivamente, “Tu Contenido”) solo en la medida necesaria para que el Software funcione o según se permita aquí. Representas y garantizas que: (i) eres propietario o has adquirido todos los derechos necesarios para enviar Tu Contenido a la Plataforma; y (ii) Tu Contenido no infringe ninguna ley aplicable, derechos de terceros o políticas. Si Salescaling sospecha que violas derechos o estos Términos, podremos suspender tu acceso a la Plataforma y tu cuenta.

## 6. Servicios de Terceros

* 6.1 Si eliges habilitar, acceder o usar servicios de terceros en conjunto con Salescaling, ten en cuenta que tu acceso y uso de estos servicios de terceros se rige exclusivamente por los términos y condiciones de dichos servicios. Salescaling no respalda, no es responsable ni hace representaciones o garantías sobre ningún aspecto de estos servicios de terceros, incluyendo su contenido, cómo manejan datos (incluyendo tus datos personales) o cualquier interacción entre tú y los proveedores de servicios terceros.
* 6.2 Al habilitar estos servicios, reconoces y aceptas que Salescaling no será responsable por daños o pérdidas causados o supuestamente causados por tu uso o confianza en estos servicios, incluyendo sus prácticas de privacidad, protocolos de seguridad de datos u otras políticas. Renuncias irrevocablemente a cualquier reclamación contra Salescaling respecto al uso de dichos servicios terceros.
* 6.3 En ciertos casos, se te podrá requerir registrarte o iniciar sesión directamente mediante estos servicios terceros. Al habilitar cualquier servicio tercero, autorizas expresamente a Salescaling a compartir los datos necesarios, incluyendo tus credenciales de inicio de sesión y otra información relevante, según sea necesario para facilitar el uso de la integración con estos servicios.
* 6.4 Salescaling no asume responsabilidad sobre cómo terceros procesan o aseguran tus datos una vez compartidos, y te recomendamos revisar las políticas de privacidad y términos de estos servicios terceros antes de usarlos.

## 7. Facturación, Planes y Pagos

* 7.1 Salescaling ofrece varios planes de suscripción con diferentes características, incluyendo pero no limitados a, grabación de llamadas, servicios de transcripción y funcionalidades de toma de notas. Estos planes están disponibles de forma mensual o anual, con precios y características claramente detallados en nuestra Plataforma durante el proceso de registro. Al seleccionar un plan de suscripción, aceptas pagar las tarifas asociadas.
* 7.2 El Usuario se compromete a pagar las tarifas aplicables puntualmente, conforme a los términos económicos establecidos entre las partes. Dichos términos podrán establecerse mediante:
  * un acuerdo específico entre el Usuario y Salescaling;
  * cualquier notificación o comunicación intercambiada entre las partes que expresamente establezca dichos términos; o
  * el registro y contratación en línea de servicios por medios telemáticos, incluyendo la Plataforma u otro canal puesto a disposición por Salescaling.\
    En todo caso, el Usuario reconoce que el registro, activación o uso de los servicios, así como la aceptación expresa de estos Términos y Condiciones, constituyen aceptación plena de las obligaciones de pago derivadas del plan de servicio seleccionado.
* 7.3 Los pagos de los planes de suscripción se facturan por adelantado, ya sea mensualmente o anualmente, según el plan elegido. Tu suscripción se renovará automáticamente al final de cada ciclo de facturación salvo que la canceles antes de la fecha de renovación. Autorizas a Salescaling a cobrar la tarifa de suscripción aplicable al método de pago seleccionado para cada renovación. Si el pago no se procesa correctamente por vencimiento, fondos insuficientes u otra razón, Salescaling se reserva el derecho de suspender o terminar tu acceso a la Plataforma hasta que se reciba el pago completo.
* 7.4 Requisitos para la contratación de servicios complementarios: El acceso a ciertos Add-ons puede estar sujeto a la suscripción de ciertos servicios básicos. El Cliente será informado durante el proceso de contratación sobre los servicios esenciales y diferentes Add-ons disponibles.
* 7.5 Si decides actualizar tu plan de suscripción o incrementar el número de usuarios autorizados durante tu período de suscripción (una "Actualización de Suscripción"), cualquier cargo adicional asociado con la actualización será prorrateado durante el periodo restante de tu suscripción actual. Estos cargos incrementales se aplicarán a tu cuenta y serán exigibles inmediatamente tras la implementación de la actualización. En cualquier periodo de suscripción posterior, los cargos reflejarán el plan actualizado, incluyendo cualquier mejora previa.
* 7.6 Salescaling se reserva el derecho de modificar las tarifas de sus planes en cualquier momento. Cualquier cambio de precio será comunicado con al menos 30 días de antelación, y las nuevas tarifas se aplicarán al inicio del siguiente ciclo de facturación. Si no estás de acuerdo con los cambios de tarifas, podrás cancelar tu suscripción antes de que las nuevas condiciones entren en vigor.
* 7.7 Impuestos: Todos los precios mostrados en la plataforma son importes netos. Se añadirán impuestos indirectos aplicables según la ubicación y estatus fiscal del cliente. Salescaling Software, S.L., como empresa establecida en las Islas Canarias, está sujeta al Impuesto General Indirecto Canario (IGIC) conforme a la Ley 20/1991 y otras normativas fiscales aplicables.
* 7.8 Los clientes son responsables de proporcionar información fiscal válida y actualizada, incluyendo números de IVA o IGIC cuando corresponda. En ausencia de documentación suficiente, Salescaling se reserva el derecho de aplicar la tasa impositiva por defecto según su jurisdicción. El cliente reconoce y acepta que cualquier impuesto, arancel o cargo que surja en su jurisdicción en relación con el uso de los servicios de Salescaling será de su exclusiva responsabilidad.

## 8. Responsabilidad del Usuario

* 8.1 Al usar los servicios de Salescaling, aceptas cumplir con todas las leyes, regulaciones y estos Términos y Condiciones. El usuario, como responsable del tratamiento de datos personales, será el único responsable de garantizar que cualquier tratamiento de datos personales realizado a través de Salescaling se base en una base legal válida conforme al artículo 6 del Reglamento (UE) 2016/679 (RGPD), respecto a cualquier persona física cuyos datos sean tratados, incluyendo empleados, personal, clientes, usuarios finales u otros individuos sobre los que el usuario actúe como responsable.

En particular, el responsable declara y garantiza que, al usar funcionalidades que impliquen la grabación, transcripción o análisis de conversaciones (incluyendo videollamadas, llamadas de voz o reuniones grabadas), ha informado debidamente a los interesados y, cuando sea requerido, obtenido su consentimiento explícito, o que el tratamiento se basa en otra base legal válida como ejecución de contrato, cumplimiento de obligación legal o interés legítimo.

Reconoces que grabar llamadas sin el consentimiento necesario puede ser ilegal en ciertas jurisdicciones, y es tu responsabilidad determinar y cumplir con los requisitos legales de tu ubicación y uso previsto. El responsable mantendrá indemne a Salescaling, como encargado del tratamiento, frente a cualquier reclamación, sanción o daño derivado del uso de Salescaling sin base legal válida o del incumplimiento de requisitos del RGPD.

* 8.2 Debes asegurar que cualquier contenido, incluyendo grabaciones de llamadas, notas y otra información almacenada en la plataforma de Salescaling, no viole derechos de terceros ni contenga material ilegal, dañino o difamatorio. Salescaling se reserva el derecho de eliminar o restringir el acceso a contenido que considere, a su exclusivo criterio, violatorio de estos Términos o perjudicial para nuestros servicios o usuarios.
* 8.3 Para mantener la seguridad de tu cuenta, aceptas mantener confidenciales tus credenciales de acceso y notificar a Salescaling inmediatamente si sospechas uso no autorizado. Cualquier actividad realizada bajo tu cuenta es tu responsabilidad, y serás responsable por pérdidas o daños resultantes de uso indebido o negligencia.
* 8.4 El uso indebido de los servicios de Salescaling, incluyendo intentos de acceso a datos no autorizados, interferencia con cuentas de otros usuarios o comprometer la integridad de la plataforma, puede resultar en la suspensión o terminación inmediata de tu acceso al servicio. Salescaling se reserva el derecho a emprender acciones legales por cualquier uso indebido que infrinja estos Términos y Condiciones o la ley aplicable.
* 8.5 El Cliente reconoce y acepta que el uso del servicio SDR, tal como se describe en la Sección 3.9 de estos Términos, implica el uso de un sistema de inteligencia artificial de propósito general integrado en la Plataforma, cuya configuración e implementación práctica dependen exclusivamente del Cliente. En consecuencia:

  a) El Cliente será el único responsable de la configuración y uso del SDR, incluidos los datos de contacto compartidos por el Cliente, las instrucciones proporcionadas, los mensajes utilizados y las decisiones de comunicación tomadas a través del sistema.

  b) Salescaling no será responsable de las decisiones, interacciones o resultados generados por el SDR que resulten de la información, datos o delas instrucciones suministradas por el Cliente, ni de los incumplimientos que puedan surgir en relación con las leyes de protección de datos personales, de comercio electrónico y comunicación comercial u otra legislación aplicable.
* 8.6 El Usuario acepta pagar el precio acordado por los servicios descritos en estos Términos y Condiciones en la forma y plazo especificados. En caso de incumplimiento de pago de cualquier cuota mensual o importe acordado en la fecha de vencimiento, Salescaling podrá suspender el acceso a los servicios y restringir el uso de la plataforma sin necesidad de aviso o requerimiento previo, hasta que se reciba el pago completo.

Además, si la falta de pago persiste por más de 15 días naturales, Salescaling podrá rescindir el contrato con efecto inmediato mediante comunicación escrita al Usuario, sin necesidad de aviso previo.

Salescaling tendrá derecho a reclamar, desde el día siguiente al vencimiento, intereses de demora al tipo legal aplicable a transacciones comerciales, conforme a la Directiva 2011/7/UE y legislación nacional (incluyendo, en su caso, la Ley española 3/2004, de 29 de diciembre). El tipo aplicable será el publicado semestralmente por el Banco Central Europeo más el margen legal establecido.

Esto será sin perjuicio de otros derechos, recursos o reclamaciones que correspondan a Salescaling, incluyendo la recuperación total de las cuotas pendientes, intereses acumulados y costes razonables de cobro.

## 9. Suspensión y Terminación del Servicio

* 9.1. El Cliente o Salescaling pueden optar por terminar la Cuenta del Cliente y la suscripción al Servicio al final del período de Suscripción vigente mediante aviso escrito con al menos treinta (30) días antes del fin del período o cancelando la Suscripción directamente a través de la Plataforma, cuando esta funcionalidad esté disponible.

Si no se notifica la terminación, la suscripción se renovará automáticamente por un período equivalente al del término que vence. Salvo acuerdo distinto, los cargos de suscripción para cualquier renovación reflejarán las tarifas estándar vigentes de Salescaling al inicio del período renovado.

* 9.2 No se emitirán reembolsos, créditos o importes prorrateados si el Cliente decide terminar el Servicio o cancelar la Cuenta antes del fin del período activo de Suscripción. Tras la terminación o cancelación, Salescaling se reserva el derecho de eliminar todos los Datos del Cliente conforme a su política de retención de datos y estos Términos. Una vez eliminados, los Datos del Cliente no podrán recuperarse.
* 9.3 Si el Cliente termina el Servicio o cancela la Cuenta antes de que expire el período de Suscripción, o si Salescaling termina la cuenta conforme a la Sección 9.4, el Cliente deberá pagar inmediatamente los cargos pendientes de suscripción asociados al periodo restante.
* 9.4 Salescaling se reserva el derecho de modificar, suspender o terminar el acceso al Servicio, la Cuenta del Cliente o los derechos de cualquier usuario y usuario final para acceder al Servicio si:
  * Violación de Términos: Salescaling cree razonablemente que el Cliente o sus usuarios han incumplido estos Términos y Condiciones.
  * Riesgos de Seguridad o Integridad del Servicio: Salescaling detecta actividades que pongan en peligro la seguridad del Servicio, integridad de datos o estabilidad general de las operaciones de Salescaling.
  * Actividad Sospechosa: Actividades fraudulentas, abusivas o ilegales sospechadas, que podrán también ser reportadas a las autoridades a discreción exclusiva de Salescaling.

Salescaling hará esfuerzos comercialmente razonables para notificar al Cliente por correo electrónico antes de tomar tales acciones, salvo que la ley lo prohíba. Salescaling no será responsable frente al Cliente, sus usuarios ni terceros por modificación, suspensión o terminación de derechos de Servicio.

* 9.5 Tras suspensión o terminación del Servicio, aplicarán las siguientes condiciones:
  * Acceso a Datos: Salescaling podrá conservar o eliminar Datos del Cliente conforme al Acuerdo de Tratamiento de Datos (ATD) y políticas de retención. Los datos eliminados no podrán restaurarse.
  * Cargos Pendientes: El Cliente sigue siendo responsable de cualquier cuota pendiente al momento de terminación.
  * Reactivación: Si el Servicio del Cliente es suspendido en lugar de terminado, Salescaling podrá restablecer el acceso una vez que el Cliente resuelva los problemas que causaron la suspensión.\
    Salescaling se reserva el derecho de imponer cargos por reactivación o condiciones adicionales.

## 10. Limitación de Responsabilidad

* 10.1 Salescaling niega todas las garantías expresas o implícitas, incluyendo pero no limitado a garantías implícitas de exactitud, idoneidad, disponibilidad, integridad o fiabilidad. Salescaling no será responsable, contractual ni extracontractualmente, por daños directos o indirectos, incluyendo pérdida de negocio, ingresos, beneficios, datos u otras pérdidas intangibles derivadas de tu acceso o uso del Software, o de la confianza en su contenido.
* 10.2 Salescaling no garantiza la exactitud, integridad o puntualidad de la información proporcionada por usuarios finales o grabada a través de llamadas entre Clientes y usuarios finales. Cualquier confianza depositada en dicha información es bajo tu propio riesgo, y Salescaling rechaza toda responsabilidad derivada de dicha confianza por ti o terceros que puedan acceder a este contenido.
* 10.3 Salescaling no garantiza que el Software cumplirá tus expectativas, sea ininterrumpido, seguro o libre de errores, ni que los datos proporcionados estarán almacenados de forma segura en todo momento.
* 10.4 Salescaling no se responsabiliza por el contenido, datos o conducta de terceros, incluyendo sitios vinculados o productos y servicios de terceros usados junto con el Software. Liberas a Salescaling y sus afiliados de cualquier reclamación o daño, conocido o desconocido, relacionado con interacciones o reclamaciones con terceros. Ninguna información, oral o escrita, obtenida de Salescaling constituye garantía no expresamente establecida aquí.
* 10.5 Reconoces que el uso del Software no transfiere la responsabilidad de gestionar tus servicios de centro de llamadas. Eres el único responsable de garantizar el cumplimiento de las leyes de protección de datos aplicables en tus operaciones.
* 10.6 Suspensión o Terminación de Cuenta\
  Salescaling no será responsable por pérdidas incurridas si usas el Software en violación de estos Términos, independientemente de si Salescaling termina o suspende tu cuenta.
* 10.7 La responsabilidad total de Salescaling, contractual, por garantía, agravio u otra teoría, derivada de tu uso o imposibilidad de uso del Software, no excederá el importe pagado por ti a Salescaling en el mes inmediatamente anterior al reclamo o 100€, lo que sea menor. Donde la ley aplicable limite estas restricciones, la responsabilidad de Salescaling se limitará al máximo permitido. No se podrá presentar reclamo contra Salescaling más de un (1) año después de que se descubrió o ocurrió el problema alegado.

## 11. Garantías y Renuncias

Salescaling proporciona el Software "tal cual" y "según disponibilidad", sin garantías expresas o implícitas de ningún tipo. En la máxima medida permitida por la ley, Salescaling renuncia a todas las garantías, incluyendo garantías implícitas de comerciabilidad, idoneidad para un propósito particular y no infracción. Salescaling no garantiza que el Software cumplirá tus requisitos, operará sin interrupciones o estará libre de errores o componentes dañinos. Cualquier confianza en el Software es bajo tu propio riesgo, y Salescaling no garantiza la exactitud, fiabilidad o integridad de la información o contenido proporcionado.

## 12. Miscelánea

* 12.1 Acuerdo Completo: Estos Términos y cualquier Acuerdo de Servicio aplicable constituyen el acuerdo completo entre Salescaling y tú respecto al uso del Software, reemplazando cualquier acuerdo o comunicación previa.
* 12.2 Modificación de términos: Salescaling se reserva el derecho de modificar, añadir o eliminar partes de estos Términos en cualquier momento. Proporcionaremos aviso previo de cualquier cambio, siempre que sea razonablemente posible, mediante notificación por correo electrónico. Animamos a los usuarios a revisar estos Términos periódicamente en la Plataforma para mantenerse informados de cualquier actualización que pueda afectar el uso de nuestros servicios. Si no estás de acuerdo con los Términos modificados, debes interrumpir el acceso a la plataforma y uso del software. El uso continuado de Salescaling tras cualquier cambio significará tu aceptación de los Términos revisados.
* 12.3 Ley Aplicable: Estos Términos, junto con la Política de Privacidad y la Política de Cookies, y cualquier acceso o uso de la Plataforma y Software, se rigen exclusivamente por las leyes de España, excluyendo cualquier principio de conflicto de leyes que requiera la aplicación de leyes de otra jurisdicción. Cualquier disputa, reclamación o controversia derivada o relacionada con estos Términos, incluyendo la Política de Privacidad y la Política de Cookies, o vinculada al acceso o uso de la Plataforma y Software, se resolverá en los tribunales de Madrid, España.

## 13. Aceptación

Las Partes acuerdan que podrán utilizar una firma electrónica simple para firmar estos Términos y Condiciones y, en consecuencia, aceptan y reconocen que el uso de una firma electrónica simple tendrá la misma validez que una firma manuscrita en papel para la perfección del mismo.

## 14. Notificaciones

Notificaciones:

Todas las notificaciones, solicitudes y otras comunicaciones relacionadas con estos Términos y Condiciones serán proporcionadas por Salescaling mediante uno de los siguientes métodos: (i) una notificación dentro de la plataforma, (ii) un correo electrónico enviado a la dirección que proporcionaste durante el registro, o (iii) cualquier otra información de contacto que hayas facilitado a Salescaling.

Las notificaciones de Salescaling se considerarán efectivas inmediatamente al ser publicadas dentro de la plataforma, o veinticuatro (24) horas después de ser enviadas por correo electrónico, salvo que la notificación especifique una fecha efectiva posterior. Es tu responsabilidad asegurarte de que Salescaling cuenta con información de contacto actualizada, incluyendo una dirección de correo electrónico válida.


# Política de privacidad

**Última revisión de la política:** 13/05/2025

## ¿Quién es el Responsable del tratamiento?

**SALESCALING SOFTWARE, S.L.**\
**N.I.F.:** B19825488\
**Domicilio postal:** C/ Crujiola, 6-edificio Alsaca, Torre 2, Piso 5, 38530, Candelaria (Santa Cruz de Tenerife)\
**Correo electrónico:** <legal@salescaling.com>

Si desea contactar con nosotros en relación con sus Datos personales puede hacerlo en la dirección indicada en el punto anterior.\
El Responsable del Tratamiento puede ser referido alternativamente como “SALESCALING”, el “Responsable”, “Plataforma” o “nosotros”.

## Introducción

SALESCALING (es propietaria del dominio <https://salescaling.com>, <https://app.salescaling.com>) así como de esta página web y/o de la App web y/o cualquier otro tipo de programa informático desarrollado, operado y/o mantenido por SALESCALING (en adelante la “Plataforma”).

Mediante el presente texto, se pone a disposición del Usuario (en adelante también referido como “Usuario”, “Interesado” o “usted”) la Política de Privacidad de SALESCALING con objeto de describir la información personal que recogemos, el propósito con el que la usamos y, en general, los procesos y formas en que la tratamos durante el transcurso del uso y/o de la Plataforma por parte de los Usuarios (tanto registrados como no registrados según los tratamientos) durante su navegación a través de la misma.

SALESCALING podrá poner a disposición del Usuario la presente Política de Privacidad en distintos idiomas. En dicho caso, la presente versión en español será la que prevalezca en caso de conflicto interpretativo.

## Tratamiento de datos personales por cuenta de nuestros clientes

Cuando la Plataforma es integrada por nuestros clientes finales dentro de su actividad empresarial en virtud de un contrato de servicios, la Plataforma tratará los datos personales para la prestación de los servicios por cuenta de dichos clientes, actuando como Encargado del Tratamiento.

En dicho caso, será el referido cliente el Responsable del tratamiento de los datos personales que comparte con, o que introduzca en la Plataforma.

El tratamiento de datos personales por parte de SALESCALING como Encargado del Tratamiento no se regirá por la presente Política de privacidad, sino por lo dispuesto en el contrato de prestación de servicios entre la Plataforma y el cliente final, conforme con las instrucciones y finalidades especificadas en el mismo, así como en el Acuerdo específico de Encargo del Tratamiento y con la política de privacidad del cliente final que integra nuestros servicios, en cumplimiento con la normativa vigente en materia de protección de datos.

## Tratamientos y finalidades para las que tratamos sus datos como responsables del tratamiento

### Tratamientos que realizamos como Responsables del Tratamiento:

#### Funcionalidad de la Plataforma

* **Finalidad:** permitir el uso de la Plataforma y navegación a través de la misma por parte de Usuarios garantizando el correcto funcionamiento de la Plataforma, permitir actualizaciones y mantenimientos técnicos, mejorar la navegabilidad, seguridad y el rendimiento de la misma.
* **Categorías de datos tratados:**\
  Datos de Uso de la Plataforma por parte del Usuario y datos de la aplicación y del dispositivo; incluyendo los siguientes: datos de navegación y uso, dirección IP, preferencias de uso, visitas realizadas, idioma, información del dispositivo, tipo de navegador, tipo de dispositivo y sistema operativo, ubicación aproximada sobre región y país de acceso; así como cookies; y datos estadísticos anonimizados.\
  Del mismo modo, si el Usuario llega a la Plataforma a través de una fuente externa (como sería, por ejemplo, a través de un enlace de una página web o de una red social de terceros), el Responsable recopilará información estadística y anónima sobre la fuente de la que procede el visitante con la finalidad de comprender mejor cómo los usuarios descubren y llegan a la Plataforma y/o para mejorar las estrategias de marketing y posicionamiento de la empresa.
* **Categorías de Interesados:** Usuarios registrados y no registrados que hagan uso de la Plataforma.
* **Método de obtención:** compartidos por el Usuario a través de la navegación por el entorno la Plataforma.
* **Bases de legitimación:** nuestro interés legítimo en garantizar el funcionamiento adecuado, actualizado y garantizar la mejora y seguridad de la Plataforma y de los Usuarios, y en conocer el origen y fuente de la que procede el usuario; o el consentimiento del Usuario en caso contrario (p.ej.: respecto de las cookies que no sean necesarias para garantizar el funcionamiento de la Plataforma)
* **Periodo de retención:** los Datos de Uso se conservarán durante el máximo de 12 meses desde que se recogieron, conforme a la Ley 25/2007 de conservación de datos en redes electrónicas. Transcurrido dicho plazo, los datos se eliminarán salvo que sean requeridos por una autoridad pública. Los datos estadísticos anonimizados podrán ser almacenados de forma indefinida por no contener datos personales.
* **Comunicación:** los datos recabados podrán ser comunicados a nuestros proveedores de servicios tecnológicos, informáticos y/o de alojamiento de datos esenciales para garantizar la finalidad para la que se recogieron. Sus datos no serán objeto de venta a terceros.

#### Seguridad y prevención de fraudes

* **Finalidad:** Recopilamos y analizamos datos del Interesado para garantizar la seguridad de nuestros Usuarios, prevenir fraudes, y realizar investigaciones oportunas y hacer uso de la información para posibles reclamaciones en interés propio o de terceros. Este tratamiento incluye:
* **Recopilación de datos de tráfico:** Recopilamos información sobre las visitas a nuestra página web, incluyendo direcciones IP, tipo de navegador, páginas visitadas, tiempo de permanencia y otros datos de navegación.
* **Análisis de patrones de comportamiento:** Utilizamos herramientas de análisis para identificar patrones de comportamiento inusuales o sospechosos que puedan indicar intentos de fraude o accesos no autorizados.
* **Detección de Amenazas:** Implementamos sistemas de detección de intrusiones y otras amenazas que analizan el tráfico en tiempo real para identificar y bloquear actividades maliciosas.
* **Verificación de identidad:** Utilizamos los datos de tráfico para verificar la identidad de los usuarios y asegurar que las transacciones y accesos sean legítimos.
* **Mantenemos registros detallados** de los accesos y actividades en nuestra página web para realizar auditorías de seguridad y responder rápidamente a cualquier incidente.
* **Colaboración con autoridades:** En caso de detectar actividades fraudulentas o sospechosas, podremos colaborar con las autoridades competentes proporcionando la información necesaria para la investigación en cumplimiento de una obligación legal. Estos procesos nos permiten proteger la integridad de nuestra página web y la seguridad de nuestros Usuarios, asegurando un entorno digital seguro y confiable.
* **Categorías de datos tratados:**\
  Datos de navegación y uso, dirección IP, registros de acceso, intentos fallidos de inicio de sesión y actividad sospechosa, información del dispositivo, tipo de navegador, tipo de dispositivo y sistema operativo, ubicación aproximada sobre región y país de acceso.
* **Categoría de interesados:** Usuarios que hagan uso de la Plataforma
* **Método de obtención:** compartidos por el Usuario a través de la navegación por la Plataforma.
* **Base legitimadora aplicable:**\
  Cumplimiento de obligaciones legales en relación con el registro de acceso y actividad.\
  El tratamiento se basará en el interés legítimo del Responsable en investigar, detectar, prevenir y perseguir el fraude, proteger sus intereses o de terceros; así como en defender sus intereses ante posibles reclamaciones por incumplimientos contractuales o de la normativa aplicable por parte de los Usuarios y en garantizar el funcionamiento correcto y seguro de la Plataforma, de los Usuarios y de terceros.
* **Plazo de retención:**\
  Los registros de acceso y actividad serán conservados durante 1 año, conforme a la Ley 25/2007 de conservación de datos en redes electrónicas. Transcurrido dicho plazo, los datos podrán ser bloqueados durante los plazos previstos legalmente para cumplir con las obligaciones normativas y plazos de prescripción legal si consideramos que puede haber riesgo de recibir una reclamación.
* **Comunicaciones a terceros:**\
  Los datos recabados podrán ser comunicados a nuestros proveedores de servicios tecnológicos, informáticos y/o de alojamiento de datos esenciales para garantizar la finalidad para la que se recogieron, así como a las autoridades públicas y cuerpos de seguridad, cuando sea requerido.

#### Prestación de los servicios contratados

* **Finalidad:**\
  El tratamiento se realiza con la finalidad de garantizar la prestación de los servicios de la Plataforma consistentes en:
  * La grabación de las conversaciones a través de videollamadas en formato video y audio, así como en la transcripción de las mismas en formato texto y almacenamiento de las grabaciones y transcripciones. El interesado deberá estar legitimado para grabar y transcribir las conversaciones en las que aparezcan terceros y deberá informar a las mismas sobre dicha circunstancia y sobre sus derechos de protección de datos.
  * El procesamiento de los calendarios del interesado cuyo acceso haya sido explícitamente concedido.
  * El procesamiento de los correos electrónicos del interesado cuyo acceso haya sido explícitamente concedido.
  * El tratamiento incluirá la gestión de solicitudes, mandatos o gestiones previas y durante la contratación y la de realizar comunicaciones sobre la operativa del servicio.
  * Igualmente, se realizará un tratamiento de datos para garantizar el registro en la Plataforma y para gestionar los pagos, entre otros tratamientos derivados que permitan garantizar la prestación de los servicios y ejecutar el contrato.
  * En caso de obtener el consentimiento y que el Usuario lo configure en su dispositivo, podrá recibir notificaciones en su dispositivo.
* **Categorías de datos tratados:**
  * Datos identificativos de facturación: nombre y apellidos, número de identidad o fiscal, pasaporte o similar
  * Datos de contacto: incluyendo dirección de correo electrónico y número de teléfono
  * Información relacionada con el servicio, incluyendo las grabaciones en formato audio y video, pudiendo contener imágenes y grabaciones de voz del interesado y de los terceros que participen en la conversación
  * Datos de pago, incluyendo algunos dígitos de la tarjeta bancaria, código de seguridad y fecha de caducidad de la tarjeta, en caso de contratar los servicios a través de la Plataforma. No obstante, los datos de pago serán compartidos por el Usuario y almacenados por el proveedor de pasarela de pago puesto a disposición del Usuario para realizar el pago de los servicios
  * Datos de acceso de Usuarios registrados, como el nombre de usuario, dirección de correo electrónico y, en su caso, el avatar designado por el mismo en la plataforma de terceros a través de la cual inicia sesión o se registra en SALESCALING (como, por ejemplo, Google o Microsoft)
* **Categorías de Interesados:**\
  Usuarios registrados que contraten y hagan uso de los servicios de la Plataforma y terceros que participen en las conversaciones con el interesado; y de trabajadores o personal dependiente de los clientes finales que contratan los servicios de la Plataforma para integrarla dentro de su compañía.
* **Método de obtención:**
  * Directamente del interesado cuando los datos sean incluidos por este a través del uso de la Plataforma
  * A través de las empresas que hayan integrado los servicios de la Plataforma en su compañía y comparten los datos con la Plataforma para la prestación de los servicios
* **Bases de legitimación:**\
  El tratamiento es necesario para la ejecución de un contrato en el que el Interesado o la compañía es parte o para la aplicación, a petición de este, de medidas precontractuales.
* **Periodo de retención:**\
  Mientras dure la prestación de servicios y, tras su finalización, sus datos podrán ser bloqueados durante los plazos previstos legalmente para cumplir con las obligaciones normativas, incluyendo las normativas fiscales, mercantiles y de prevención de blanqueo de capitales, así como durante el plazo de prescripciones legales.\
  Las grabaciones de video y/o de audio se conservarán durante el plazo acordado en el contrato de prestación de servicios y/o por el plan o suscripción contratado por el Usuario.
* **Comunicaciones a terceros:**\
  Sus datos no serán comunicados con carácter general.\
  No obstante, podrán ser comunicados a nuestros proveedores externos de servicios tecnológicos, informáticos esenciales, incluyendo a proveedores de servicios de cloud, de servicios de pago, comunicaciones, de inteligencia artificial generativa, y/o de comunicaciones cuando sea necesario para garantizar la finalidad en cumplimiento de la ejecución del contrato de prestación de servicios. Y, del mismo modo, podrá ser compartido a las autoridades cuando sea requerido por obligación legal o requerimiento judicial.

#### Envío de comunicaciones comerciales

* **Finalidad:**\
  Envío de comunicaciones comerciales, ofertas, promociones, o similares, de los productos ofrecidos por el Responsable, según las distintas posibilidades:
  * **Comunicaciones por correo electrónico:** Envío de promociones y/o ofertas a la dirección de correo electrónico del Usuario. El Usuario podrá oponerse a recibir comunicaciones comerciales en cualquier momento contactando a la dirección de correo electrónico del Responsable o, en su caso, mediante la opción habilitada incluida en el propio correo electrónico.
  * **Notificaciones “push”:** Envío de promociones y/o ofertas en el dispositivo de los Usuarios cuando así lo configuren voluntariamente y mediante su consentimiento. El usuario podrá dejar de recibir este tipo de notificaciones configurando su dispositivo para ello.
  * **Comunicaciones de terceros:** los Usuarios podrán recibir comunicaciones de terceros solamente cuando haya otorgado su consentimiento previamente. Podrá retirar su consentimiento en cualquier momento a través de las direcciones de contacto del Responsable.
  * **Comunicaciones personalizadas:** el envío de comunicaciones personalizadas según los intereses y preferencias de los Usuarios requerirá el consentimiento previo por parte de los mismos, y podrá retirarse en cualquier momento.

Si el Usuario desea dejar de recibir comunicaciones comerciales puede oponerse en cualquier momento contactando con el Responsable a través de su dirección postal, correo electrónico o a través de los canales habilitados para según las distintas modalidades de comunicación.

* **Datos tratados:**
  * Datos identificativos: nombre y apellidos
  * Datos de contacto: correo electrónico
  * Datos de la organización: nombre comercial
  * Datos relacionados con las preferencias del Usuario, en su caso
* **Método de obtención:** directamente del Usuario.
  * **Usuarios registrados o clientes de SALESCALING:** directamente del Interesado a través su registro en la plataforma.
  * **Usuarios no registrados:** directamente del Interesado a través de su inscripción en formularios, newsletter, y similares.
* **Bases de legitimación:**
  * En relación con los Usuarios registrados o clientes: se basará en los intereses legítimos del Responsable en informar a los Usuarios sobre productos contratados o similares e información relevante, y salvo que el Usuario se oponga a dicho tratamiento.
  * En relación con Usuarios con los que no tiene una relación contractual: será necesario el consentimiento.
  * También será necesario el consentimiento tanto para Usuarios registrados como no registrados, para el envío de notificaciones push, comunicaciones personalizadas, y de terceros, hasta que la retirada del consentimiento, oposición o supresión de cuenta por parte del Usuario.
* **Periodo de retención:**\
  Los datos serán tratados hasta que el Usuario retire su consentimiento. En caso de inactividad del usuario durante 24 meses, el Responsable dejará de enviar comunicaciones comerciales y suprimirá los datos relacionados con este tratamiento.\
  Transcurrido el plazo o retirado el consentimiento, los datos podrán ser bloqueados durante los plazos previstos legalmente para cumplir con las obligaciones normativas aplicables y plazos de prescripción legales.
* **Comunicación:**\
  Sus datos no serán comunicados a terceras empresas, salvo a aquellas que presten servicios informáticos, tecnológicos y/o técnicos, y solamente para garantizar las finalidades mencionadas.\
  Sus datos no serán objeto de venta o comunicación a terceros salvo previa información al Interesado y previa obtención de su consentimiento.

#### Resolución de consultas realizadas por el Usuario

* **Finalidad:**\
  Garantizar la comunicación por parte de los Usuarios con el Responsable para realizar consultas con atención al cliente, formular quejas, u otras similares, a través de cualquiera de los puntos de contacto del Responsable incluyendo los formularios, direcciones electrónicas o postales u otras puestas disposición del Usuario.
* **Categorías de datos tratados:**\
  Datos identificativos, concretamente nombre y apellidos y datos de contacto, incluyendo dirección de correo electrónico y/o número de teléfono.
* **Categorías de Interesados:**\
  Usuarios que formulen la consulta.
* **Método de obtención:**\
  Directamente de los Usuarios, cuando éstos contacten directamente con el Responsable o a través de proveedores externos subcontratados para ello.
* **Bases de legitimación:**\
  Consentimiento de los Usuarios o interés legítimo del Responsable en responder una consulta tras haber recibido la solicitud.
* **Periodo de retención:**\
  Una vez alcanzada la finalidad para la que fueron recabados, los datos serán conservados un plazo máximo de 24 meses, salvo que por motivos de interés legítimo o plazos de prescripción legales se requiera la conservación de los mismos durante un plazo superior.
* **Comunicación:**\
  Sus datos podrán ser comunicados a nuestros proveedores servicios tecnológicos, informáticos y/o de alojamiento de datos, que sean esenciales para garantizar la finalidad para la que se recogieron. Sus datos no serán objeto de venta a terceros.

#### Análisis interno y desarrollo

* **Finalidad:**\
  El Responsable podrá recopilar y tratar los datos anonimizados de uso para analizar el comportamiento y uso de la Plataforma, los patrones de navegación, funcionalidades utilizadas por el Usuario con la finalidad de mejorar la experiencia de usuario y optimizar funcionalidades, analizar tendencias de uso para el desarrollo de nuevas herramientas o servicios, etc.
* **Categorías de datos:**\
  Datos anonimizados sobre uso de la plataforma, patrones de navegación, y funcionalidades utilizadas.
* **Categorías de Interesados:**\
  Usuarios registrados y visitantes de la plataforma (en formato anonimizado).
* **Bases de legitimación:**\
  Intereses legítimos en analizar información estadística y agregada para ofrecer productos y servicios mejorados a los Interesados.
* **Método de obtención:**\
  Datos compartidos por el Usuario en relación con el uso de los Servicios.
* **Periodo de retención:**\
  Con el objetivo de cumplir la finalidad indicada, los datos podrán ser almacenados y conservados de forma indefinida, siempre de forma disociada o anónima, de modo que no pueda identificarse a los Interesados.
* **Comunicación:**\
  Sus datos no serán comunicados con carácter general. No obstante, podrán ser comunicados a nuestros proveedores de servicios externos tecnológicos, informáticos y/o de alojamiento de datos esenciales para garantizar la finalidad para la que se recogieron, incluyendo a proveedores de servicios de automatización; o salvo a las autoridades cuando sea obligatorio por obligación legal o requerimiento judicial. Sus datos no serán objeto de venta a terceros.

### ¿De dónde provienen sus datos?

Por norma general, salvo que se haya indicado otra cosa en apartados específicos de la presente Política, todos los datos proceden del Interesado, ya sea por medio de la navegación o uso de la Plataforma o mediante una comunicación realizada por el Usuario por cualquiera de los medios puestos a su disposición.

### ¿A quién comunicamos sus datos?

Con carácter general el Responsable no comunicará sus Datos personales a terceros, salvo cuando la prestación de un servicio implique la necesidad de una relación contractual y sea estrictamente necesario para la gestión y el mantenimiento de la relación entre el Usuario y el Responsable y/o para cumplir las finalidades.

En tal caso, la comunicación se realizará siempre durante el tiempo estrictamente necesario para permitir las finalidades y de conformidad con los principios de protección de datos, mediante la aplicación de las medidas necesarias y adecuadas para garantizar la protección de los Datos personales (incluyendo la suscripción de un acuerdo de encargo del tratamiento). Dicho tratamiento se realizará bajo las mismas o similares condiciones, compromisos y responsabilidades en materia de privacidad y protección de datos a las que se somete el Responsable. Al finalizar la cesión, los referidos cesionarios o encargados del tratamiento devolverán los Datos personales al Responsable y eliminarán cualquier copia en su posesión.

En dicho sentido, y estrictamente con objeto de hacer cumplir las finalidades descritas en la presente Política, el Responsable podrá comunicar sus Datos personales a las categorías de destinatarios que se indican a continuación:

* Proveedores de servicios esenciales, incluyendo servicios informáticos y tecnológicos, como, a modo de ejemplo, proveedores de pasarela de pagos, de almacenamiento en la nube, de envío de comunicaciones, de servicios de autentificación y seguridad, y proveedores de tecnologías de inteligencia artificial, entre otros similares que sean necesarios para garantizar las finalidades.
* Autoridades públicas, por requerimiento judicial o por imperativo legal.
* Empresas y/o consultores que nos ayuden en la gestión de nuestros servicios y en el cumplimiento de finalidades.

Puede solicitar información adicional sobre las comunicaciones realizadas al Responsable a través de cualquiera de los puntos de contacto que se indican en la presente Política.

### ¿Realizamos transferencias de datos a terceros países u organismos internacionales?

Por norma general no se realizarán transferencias de Datos personales a terceros países u organizaciones internacionales (“TTI”, en adelante).

No obstante, con objeto de garantizar las finalidades, se podrá realizar TTI a nuestros proveedores de servicios que sean esenciales para garantizar la/s finalidad/es para la/s que se recogieron. Asimismo, independientemente de que SALESCALING no realice dichas TTI directamente, dichas TTI podrán ser realizadas por los proveedores de servicios.

En dicho caso, el Responsable contratará con proveedores que cumplan con el RGDP y mediante la aplicación de algunas de las garantías previstas en los arts. 44 RGPD y siguientes, para garantizar un nivel de seguridad adecuado del tratamiento de Datos personales, incluyendo la decisión de adecuación (listado de países basados en una decisión de adecuación) o mediante Cláusulas Contractuales Tipo de la Comisión Europea (“CCT”, en adelante).

Para obtener más información sobre las transferencias internacionales de datos y las garantías específicas aplicadas, puede ponerse en contacto con nosotros a través de los datos de contacto indicados en la presente Política de Privacidad.

### ¿Tratamos categorías especiales de datos personales?

El Responsable no solicitará ni tratará datos de “categorías especiales de datos personales”, entendiendo como tales los datos que revelen “el origen étnico o racial, las opiniones políticas, las convicciones religiosas o filosóficas, o la afiliación sindical, y el tratamiento de datos genéticos, datos biométricos dirigidos a identificar de manera unívoca a una persona física, datos relativos a la salud o datos relativos a la vida sexual o las orientación sexuales de una persona física”, de conformidad con los artículos 9 y 10 del Reglamento (UE) n. 2016/679.

No obstante, en caso de que el usuario decida compartir tal información, dicho tratamiento será realizado conforme al consentimiento del mismo.

### Modalidad de tratamiento

El tratamiento de los datos proporcionados se basa en los principios de licitud, transparencia, limitación de la finalidad y conservación, minimización de datos, exactitud, integridad y confidencialidad, y se realizará, en todo caso, con sujeción a lo dispuesto al respecto en el Reglamento UE 2016/679 y en la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos personales y garantía de los derechos digitales.

En particular, el tratamiento se podrá llevar a cabo utilizando papel, herramientas informáticas y telemáticas, también de conformidad con lo dispuesto en el artículo 29 del Reglamento UE 2016/679 y, en todo caso, con medios adecuados para garantizar su seguridad y confidencialidad de conformidad con lo dispuesto en el artículo 32 del mismo Reglamento UE núm. 2016/679.

### Decisiones automatizadas

No existe un proceso automatizado de toma de decisiones, ni siquiera para finalidad de elaboración de perfiles, de conformidad con el artículo 13.2 letra f), del Reglamento UE n. 679/2016.

### Cookies

Adicionalmente a los tratamientos expuestos en la presente Política, el Responsable también podrá recabar Datos personales a través del uso de cookies y otras tecnologías de seguimiento análogas o similares, tal y como se describe en la Política de Cookies accesible a través del siguiente enlace.

### Retención de sus datos personales

Por norma general, el Responsable conservará sus Datos personales sólo durante el tiempo que sea necesario para el fin para el que se recogieron al inicio, y durante los plazos máximos señalados en cada uno de los tratamientos referidos en la presente Política.

#### Plazos de conservación según la tipología de datos, finalidades y normativa aplicable:

| Tipo de Documento/Dato                       | Base legal / normativa aplicable    | Plazo de conservación                    |
| -------------------------------------------- | ----------------------------------- | ---------------------------------------- |
| Documentación contractual con clientes       | Código de Comercio                  | 6 años desde la terminación del contrato |
| Blanqueo de capitales                        | Ley 10/2010                         | 10 años                                  |
| Usuarios de la Plataforma y web              | RGPD y LOPDGDD                      | 5 años o hasta solicitud de borrado      |
| Datos de tráfico (IP, IMSI, IMEI, etc.)      | LSSI y Ley de conservación de datos | 1 año                                    |
| Cookies y tecnologías similares              | LSSI                                | 18 meses                                 |
| Análisis interno y desarrollo (anonimizados) | Art. 4.1 y Considerando 26 RGPD     | Indefinido                               |
| Plazos de prescripción legales (genéricos)   | Art. 1967 del Código Civil          | 5 años                                   |

Transcurrido los plazos antes señalados, los datos serán automáticamente suprimidos, sin perjuicio de su posterior conservación bloqueados cuando sea necesario para el cumplimiento de determinadas obligaciones, por disposiciones legales o responsabilidad, o solicitudes y/u órdenes emitidas por las Administraciones Públicas y/o Autoridades de Control, por algunas de las razones indicadas en los apartados anteriores.

En relación con la información anónima, el Responsable aplicará cuanto descrito en el Considerando 26 del RGPD, que establece que “Por lo tanto los principios de protección de datos no deben aplicarse a la información anónima, es decir, información que no guarda relación con una persona física identificada o identificable, ni a los datos convertidos en anónimos de forma que el interesado no sea identificable, o deje de serlo”. En consecuencia, el presente Reglamento no afecta al tratamiento de dicha información anónima, inclusive con fines estadísticos o de investigación.

### Cuáles son los derechos sobre sus datos?

De conformidad con el RGPD, el Interesado tiene los siguientes derechos en relación con sus Datos personales:

* **Acceso** a sus datos, que también puede consultar en la sección "mis datos".
* **Rectificación** de sus datos, porque también queremos asegurarnos de que su información es exacta y está actualizada.
* **Supresión** de sus datos.
* **Limitación** del tratamiento de los datos que le conciernen.
* **Oposición** al tratamiento de sus datos, cuando la legitimación para el tratamiento sea nuestro interés legítimo.
* **Retirada del consentimiento**, cuando la legitimación sea su consentimiento.
* **Portabilidad** de sus datos, cuando la legitimación para el tratamiento de sus datos sea su consentimiento o la ejecución de un contrato.

Para ejercer sus derechos, el Interesado podrá ponerse en contacto con el Responsable a través de las direcciones designadas en la presente Política.

Además, el Interesado tiene derecho a presentar una reclamación ante la Agencia Española de Protección de Datos (AEPD) si tiene dudas o no está satisfecho con el ejercicio de sus derechos o el tratamiento que realizamos. Sus datos de contacto son:

**Agencia Española de Protección de Datos -España- (AEPD)**\
Calle Jorge Juan, 6\
C.P.: 28004 - Madrid\
Atención telefónica: +34 901 100 099 / +34 91 266 35 17\
<https://www.aepd.es>


# Acuerdo de encargo del tratamiento de datos

### Acuerdo de encargo del tratamiento

SALESCALING, en su condición de Encargado del Tratamiento (en adelante el “ENCARGADO”) tratará los datos personales que reciba del CLIENTE, como Responsable del Tratamiento (en adelante el “RESPONSABLE”) en relación con la ejecución del Contrato para la prestación de los Servicios siguiendo las instrucciones y finalidades determinadas por el RESPONSABLE.

A los efectos de este Acuerdo, “CLIENTE” se refiere a cualquier persona física o jurídica o entidad afiliada del Cliente que haya celebrado un contrato de prestación de servicios con SALESCALING y trate datos personales de los que este es responsable para garantizar la prestación de los servicios en virtud del contrato entre ambos.

Ambas partes, en el ejercicio de sus respectivas facultades, acuerdan suscribir el presente Acuerdo de Encargo del Tratamiento de Datos Personales (en adelante, el “Acuerdo”), en cumplimiento de lo establecido en el Reglamento (UE) 2016/679 del Parlamento Europeo y del Consejo de 27 de abril de 2016 (Reglamento General de Protección de Datos, en adelante “RGPD”) y la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos Personales y Garantía de los Derechos Digitales (“LOPDGDD”), de conformidad con las siguientes,

### Estipulaciones

#### 1. Objeto

1.1. El ENCARGADO, en el marco del presente Acuerdo, tratará datos personales por cuenta del RESPONSABLE conforme a los términos y condiciones establecidos en el presente documento.

1.2. La finalidad del tratamiento es la prestación de los Servicios especificados en el contrato de prestación de servicios que ampara el presente Acuerdo.

1.3. La duración del encargo tendrá lugar mientras se mantenga la relación contractual entre las partes y hasta la eliminación de los datos personales conforme a lo establecido en este Acuerdo.

1.4. En relación con el Acuerdo, el RESPONSABLE es la persona que determina los fines y los medios para los cuales se procesan los Datos del RESPONSABLE por el encargad (como se define a continuación).

1.5. Los datos personales facilitados por el RESPONSABLE al ENCARGADO se refieren a las categorías de datos y de interesados indicados en el Apéndice I.

#### 2. Obligaciones del Encargado del Tratamiento

El ENCARGADO y todo su personal se compromete a las siguientes obligaciones:

2.1. Utilizar los datos personales objeto de tratamiento, o los que recoja para su inclusión, sólo para la finalidad objeto de este encargo. En ningún caso podrá utilizar los datos para fines propios. 2.2. Tratar los datos de acuerdo a las instrucciones documentadas del RESPONSABLE. 2.3. Si el ENCARGADO considera que alguna de las instrucciones infringe el RGPD, LOPDGDD o cualquier otra disposición en materia de protección de datos de la Unión Europea o de los Estados miembros, el ENCARGADO informará inmediatamente al RESPONSABLE. 2.4. No comunicar los datos a terceras personas, salvo que cuente con la previa autorización expresa por escrito del RESPONSABLE, en los supuestos legalmente establecidos y admisibles. 2.5. El ENCARGADO puede comunicar los datos a otros encargados del tratamiento del mismo responsable, de acuerdo con las instrucciones del RESPONSABLE. En este caso, el RESPONSABLE identificará, de forma previa y por escrito, la entidad a la que se deben comunicar los datos, los datos a comunicar y las medidas de seguridad a aplicar para proceder a la comunicación. 2.6. El ENCARGADO realizará transferencias de datos personales a un tercer país o a una organización únicamente bajo las instrucciones documentadas del RESPONSABLE. Si el ENCARGADO debe transferir dichos datos personales a un tercer país o una organización internacional, en virtud del Derecho de la Unión Europea o de los Estados miembros que le sea aplicable, informará al RESPONSABLE de esa exigencia legal de manera previa, salvo que tal Derecho lo prohíba por razones importantes de interés público. 2.7. Asimismo, el ENCARGADO se obliga a devolver al RESPONSABLE, el soporte o soportes con los datos personales, o a destruirlos, a petición de esta última, una vez finalizada la prestación de servicios, sin conservar copia alguna de los mismos, salvo que así lo establezca el RESPONSABLE.

2.8. **Subcontratación.**

a. El ENCARGADO podrá subcontratar con terceros la ejecución de actividades del tratamiento de datos personales para la correcta prestación de los servicios objeto del presente Acuerdo, incluyendo determinados servicios técnicos e informáticos necesarios y servicios auxiliares necesarios.

b. En virtud de lo dispuesto en el RGPD y LOPDGDD, cualquier subcontratación del servicio que se lleve a cabo para el cumplimiento del contrato que quiera realizar el ENCARGADO, deberá ser comunicada al RESPONSABLE a la dirección de correo electrónico indicada en las Condiciones Particulares, indicando los tratamientos que se pretende subcontratar e identificando de forma clara e inequívoca la empresa subcontratista y sus datos de contacto. La subcontratación podrá llevarse a cabo si el RESPONSABLE no manifiesta su oposición en el plazo de 5 días desde la comunicación.

c. La lista de Subencargados o proveedores autorizados se encuentra en el Apéndice I.

d. El subcontratista, que también tendrá la condición de encargado de tratamiento, está obligado igualmente a cumplir las obligaciones establecidas en este documento para el ENCARGADO y las instrucciones que dicte el RESPONSABLE.

e. Corresponde al ENCARGADO suscribir un nuevo contrato con el nuevo encargado de forma que quede sujeto a las mismas condiciones y con los mismos requisitos formales que él, en lo referente al adecuado tratamiento de los datos personales y a la garantía de los derechos de las personas afectadas. En el caso de incumplimiento por parte del subencargado, el ENCARGADO seguirá siendo plenamente responsable ante el RESPONSABLE en lo referente al cumplimiento de las obligaciones.

2.9. El ENCARGADO podrá compartir datos personales del RESPONSABLE con aquellos proveedores de servicios o terceras empresas, incluyendo de servicios de inteligencia artificial, por instrucción del RESPONSABLE. En dicho caso, dado que el ENCARGADO actúa siguiendo instrucciones del RESPONSABLE no deberá preavisar a este, y será el RESPONSABLE quien velará por que dicho proveedor cumpla con las garantías en materia de protección de datos personales y sobre su adecuación a la normativa aplicable.

2.10. Mantener el deber de secreto respecto de los datos de carácter personales a los que haya tenido acceso el ENCARGADO en virtud de los servicios prestados al RESPONSABLE, incluso después de finalizada la relación entre ambos.

2.11. Garantizar que las personas autorizadas para tratar datos personales se comprometan, de forma expresa y por escrito, a respetar la confidencialidad y a cumplir las medidas de seguridad correspondientes, de las que hay que informarles convenientemente.

2.12. Mantener a disposición del RESPONSABLE la documentación acreditativa del cumplimiento de la obligación establecida en el apartado anterior.

2.13. Garantizar la formación necesaria en materia de protección de datos personales de las personas autorizadas para tratar dichos datos.

2.14. Asistir al RESPONSABLE teniendo cuenta la naturaleza del tratamiento, a través de medidas técnicas y organizativas apropiadas, siempre que sea posible, para que este pueda cumplir con su obligación de responder a las solicitudes que tengan por objeto el ejercicio de los derechos de los interesados.

2.15. Cuando las personas afectadas ejerzan los derechos de acceso, rectificación, supresión y oposición, limitación del tratamiento, portabilidad de datos y a no ser objeto de decisiones individualizadas automatizadas, ante el ENCARGADO, éste debe comunicarlo por correo electrónico a la dirección indicada por el RESPONSABLE. La comunicación debe hacerse tan pronto como sea posible, haciendo sus mayores esfuerzos por que se produzca dentro de los 3 días laborables desde la recepción de la solicitud, e incluirá, en su caso, otras informaciones que puedan ser relevantes para resolver la solicitud.

2.16. Derecho de información. Corresponde al RESPONSABLE facilitar el derecho de información en el momento de la recogida de los datos.

2.17. **Notificación de violaciones de la seguridad de los datos**

a. El ENCARGADO notificará al RESPONSABLE, sin dilación indebida, y en cualquier caso antes del plazo máximo de 36 horas, y a través de una comunicación simple, las violaciones de la seguridad de las que tenga conocimiento de los datos a su cargo, junto con toda la información y documentación relevante de la incidencia.

b. No será necesaria la notificación cuando sea improbable que dicha violación de la seguridad constituya un riesgo para los derechos y las libertades de las personas físicas.

c. La notificación incluirá como mínimo la información siguiente:

```
  i. Descripción de la naturaleza de la violación de la seguridad de los datos personales, inclusive, cuando sea posible, las categorías y el número aproximado de interesados afectados, y las categorías y el número aproximado de registros de datos personales afectados.

  ii. El nombre y los datos de contacto del delegado de protección de datos o de otro punto de contacto en el que pueda obtenerse más información.

  iii. Descripción de las posibles consecuencias de la violación de la seguridad de los datos personales.

  iv. Descripción de las medidas adoptadas o propuestas para poner remedio a la violación de la seguridad de los datos personales, incluyendo, si procede, las medidas adoptadas para mitigar los posibles efectos negativos. Si no es posible facilitar la información simultáneamente, y en la medida en que no lo sea, la información se facilitará de manera gradual sin dilación indebida.
```

2.18. Dar apoyo al RESPONSABLE en la realización de las evaluaciones de impacto relativas a la protección de datos, cuando proceda.

2.19. Dar apoyo al RESPONSABLE en la realización de las consultas previas a la autoridad de control, cuando proceda.

2.20. Poner a disposición del RESPONSABLE toda la información necesaria para demostrar el cumplimiento de sus obligaciones, así como para la realización de las auditorías o las inspecciones que realicen el responsable u otro auditor autorizado por él, cuando sea requerido.

2.21. **Medidas de Seguridad.** El ENCARGADO se compromete a aplicar a los datos de carácter personal las medidas de seguridad necesarias para evitar su alteración, pérdida, tratamiento o acceso no autorizado, habida cuenta del estado de la tecnología, la naturaleza de los datos almacenados y los riesgos a que están expuestos, ya provengan de la acción humana o del medio físico o natural. En este sentido, de conformidad con lo dispuesto en los artículos 24 y 32 del RGPD, el ENCARGADO está obligado a tener implementadas las medidas de seguridad técnicas y organizativas apropiadas.

2.22. Concretamente, el ENCARGADO adoptará las medidas de seguridad establecidas en el Apéndice I.

2.23. **Destino de los datos.** El ENCARGADO se compromete a destruir los datos, una vez cumplida la prestación. No obstante, el ENCARGADO puede conservar una copia, con los datos debidamente boqueados, mientras puedan derivarse responsabilidades de la ejecución de la prestación.

***

### 3. Obligaciones del Responsable del tratamiento

El RESPONSABLE se compromete a:

3.1. Responder de los datos personales objeto de tratamiento.

3.2. Realizar una evaluación del impacto en la protección de datos personales de las operaciones de tratamiento a realizar por el encargado cuando proceda.

3.3. Garantizar el deber de información frente a los interesados de conformidad con los arts. 13 y 14 RGPD.

3.4. Realizar las consultas previas que corresponda.

3.5. Velar, de forma previa y durante todo el tratamiento, por el cumplimiento del RGPD y LOPDGDD por parte del ENCARGADO.

3.6. Comunicar los cambios de la estructura básica de los datos que impliquen o puedan implicar un cambio en la aplicación de las medidas de seguridad.

3.7. Facilitar el acceso al ENCARGADO únicamente de aquellos datos que resulten adecuados, pertinentes y no excesivos, en razón de la finalidad del servicio contratado.

3.8. EL RESPONSABLE deberá garantizar al titular de los datos de carácter personal en función de la naturaleza, el ámbito, el contexto y los fines del tratamiento, en base a lo dispuesto en el artículo 24 del RGPD, que ha adoptado las medidas técnicas y organizativas apropiadas para mantener la seguridad de los datos personales facilitados.

3.9. Corresponde al RESPONSABLE comunicar en el menor tiempo posible las violaciones de la seguridad de los datos a los interesados, cuando sea probable que la violación suponga un alto riesgo para los derechos y las libertades de las personas físicas.

La comunicación debe realizarse en un lenguaje claro y sencillo y deberá, como mínimo:

a. Explicar la naturaleza de la violación de datos.

b. Indicar el nombre y los datos de contacto del delegado de protección de datos o de otro punto de contacto en el que pueda obtenerse más información.

c. Describir las posibles consecuencias de la violación de la seguridad de los datos personales.

d. Describir las medidas adoptadas o propuestas por el responsable del tratamiento para poner remedio a la violación de la seguridad de los datos personales, incluyendo, si procede, las medidas adoptadas para mitigar los posibles efectos negativos.

3.10. El RESPONSABLE velará por que los proveedores de servicios o terceras empresas a las que el ENCARGADO comunique datos personales bajo instrucción del RESPONSABLE cumplan con las garantías en materia de protección de datos y resto de normativa vigente y se responsabiliza frente al ENCARGADO.

***

### Apéndice I al Acuerdo de encargo del tratamiento sobre los detalles del tratamiento

#### 1. Finalidad(es) del tratamiento:

Garantizar la prestación del/los servicio/s contratados por el RESPONSABLE, conforme al Contrato de prestación de servicios. Dicho tratamiento podrá incluir distintos servicios tecnológicos, como la grabación y transcripción de llamadas y reuniones, así como la el uso de SDRs a través de Agentes de IA entre el RESPONSABLE y sus trabajadores o clientes finales.

#### 2. Tipología de datos personales facilitados por el RESPONSABLE al ENCARGADO:

1. Datos identificativos (Ej.: nombre y apellidos, teléfono, correo electrónico, etc.)
2. Datos profesionales y de empresa (Ej.: cargo, empresa, sector de actividad, datos de contacto profesional, identificador de usuario en sistemas internos)
3. Datos de acceso y uso de sistemas (Ej.: identificadores de usuario, registros de acceso, direcciones IP, cookies, logs)
4. Datos técnicos y operacionales.
5. Grabaciones de audio y video de las llamadas.
6. Las Partes no recogerán ni tratarán intencionadamente ninguna categoría especial de datos. El ENCARGADO informará inmediatamente de cualquier recepción involuntaria de categorías especiales de datos.

#### 3. Categorías de datos personales tratados por el ENCARGADO:

1. Empleados del RESPONSABLE.
2. Clientes, potenciales clientes, empleados de los mismos, contactos o usuarios finales del RESPONSABLE.

#### 4. Tipología de tratamiento realizado

El Encargo implicará los siguientes procesamientos realizados de datos personales:

1. Almacenamiento y conservación de datos, registro, recuperación e introducción de datos.
2. Acceso y consulta de información
3. Grabación de voz.
4. Procesamiento de información mediante IA.
5. Trascripción de audio mediante IA.
6. Análisis semántico del texto.
7. Análisis y procesamiento de datos
8. Integración con plataformas de IA o sistemas de terceros
9. Anonimización o seudonimización de datos.
10. Eliminación o destrucción de datos.
11. Actualización de los datos, incluyendo su corrección, adaptación, alteración, alineación y combinación.

#### 5. Medidas de seguridad

**Categoría | Medida de seguridad implementada**

**Medidas organizativas**

* Evaluaciones periódicas de seguridad.
* Procesos seguros y automatizados (CI/CD).

**Medidas técnicas**

* Cifrado de datos en reposo y tránsito.
* Tokens de sesión.
* Escaneo antivirus.
* Protección contra ataques (inyección, XSS, SSRF).

**Medidas de control de acceso**

* Autenticación por proveedores confiables y OTP.
* Autorización por roles (OpenFGA).
* 2FA en interfaces administrativas.

**Medidas de continuidad y recuperación**

* Despliegues automatizados con recuperación <10 min.
* Monitorización y verificación de configuraciones.
* Copias de seguridad periódicas.

***

#### 6. Subencargados del tratamiento autorizados

| Proveedor/Subencargado | Servicio prestado                  | Ubicación | Transferencias internacionales |
| ---------------------- | ---------------------------------- | --------- | ------------------------------ |
| Bunny.net              | CDN y almacenamiento de vídeos     | UE        | N/A                            |
| Google Cloud           | Infraestructura en la nube / IA    | UE        | N/A                            |
| Vercel                 | Hosting y despliegue               | UE        | N/A                            |
| Hyperdoc               | Grabación de reuniones             | UE        | N/A                            |
| Crisp                  | Chat en vivo                       | UE        | N/A                            |
| Nylas                  | API correo y calendario            | UE        | N/A                            |
| Hookdeck               | Gestión de webhooks                | UE        | N/A                            |
| Supabase               | Base de datos                      | UE        | N/A                            |
| AWS                    | Backup e infraestructura adicional | UE        | N/A                            |
| Auth0                  | Autenticación y autorización       | UE        | N/A                            |
| Stripe                 | Procesamiento de pagos             | UE        | N/A                            |
| Resend                 | Envío de correos                   | UE        | N/A                            |
| DigitalOcean           | Infraestructura en la nube         | UE        | N/A                            |
| Posthog                | Análisis de uso                    | UE        | N/A                            |
| Datadog                | Monitorización y logs              | UE        | N/A                            |
| Assembly AI            | Transcripción de audio mediante IA | UE        | N/A                            |
| Elevenlabs             | Modelos de IA Conversacional       | UE        | N/A                            |


# Seguridad

En Salescaling, la seguridad y privacidad de los datos son fundamentales. Este documento detalla las medidas de seguridad implementadas y cómo manejamos la información de nuestros usuarios.

## Procesamiento de Datos con IA

### Modelo de IA Actual

* Utilizamos Google Gemini como modelo LLM de IA Generativa
* Se aplica la política de privacidad de Google
* Google no utiliza los datos de entrada para entrenar sus modelos
* Toda la información viaja cifrada en tránsito hasta llegar al LLM

### Futuras Mejoras

* Estamos desarrollando la opción para que los clientes utilicen su propio modelo de IA si lo desean
* Esto permitirá un control absoluto sobre el procesamiento de la información
* Los clientes podrán elegir el modelo que mejor se adapte a sus necesidades de privacidad

## Medidas de Seguridad

### Cifrado de Datos

* Todas las comunicaciones están cifradas mediante TLS
* Los datos almacenados en la base de datos están cifrados en reposo mediante AES-256
* Los backups diarios están cifrados y se retienen durante 14 días

### Autenticación y Autorización

* Utilizamos Auth0 como plataforma de autenticación
* No almacenamos contraseñas
* Los permisos se gestionan en función del rol dentro de cada organización

### Aislamiento de Datos

* Los datos se segmentan a nivel de base de datos
* Cada organización solo puede acceder a sus propios datos

### Monitorización y Control

* Monitorizamos los registros de acceso
* Implementamos alertas para operaciones sensibles
* Realizamos seguimiento de la actividad de usuarios para depuración
* Mantenemos un registro detallado de todas las operaciones críticas

### Infraestructura

* Utilizamos infraestructura en la nube
* Aplicamos políticas de mínimo privilegio
* El acceso está restringido únicamente al personal autorizado

## Soporte

Si tienes preguntas sobre seguridad, por favor contacta con nuestro equipo de soporte.

## Detección de Vulnerabilidades

Si encuentras una vulnerabilidad, por favor contacta con nuestro equipo de seguridad en <security@salescaling.com>.


# Preguntas frecuentes

### ¿Puedo registrarme si no tengo una cuenta de Google o Microsoft?

Sí, puedes registrarte con tu correo electrónico sin necesidad de una cuenta de Google o Microsoft.

### ¿Puedo usar Salescaling sin invitar al *bot*?

Aunque el bot es necesario para grabar tus videollamadas en las plataformas aceptadas, puedes subir archivos de audio o video de grabaciones pasadas para transcribirlos y analizarlos en Salescaling.

### ¿Puedo usar Salescaling en mi idioma?

La plataforma está disponible en inglés, aunque ofrecemos traducciones a múltiples idiomas como el español, francés, portugués, alemán, italiano, árabe, chino y japonés. Si necesitas otro idioma, ponte en contacto con nosotros.

### ¿Qué proveedores de videoconferencia soporta Salescaling?

Salescaling soporta los siguientes proveedores de videoconferencia:

* Google Meet
* Microsoft Teams
* Zoom

Si necesitas soporte para otro proveedor, ponte en contacto con nosotros.

### ¿Puedo usar Salescaling en mi idioma?

Ofrecemos sistemas de traducción automática para el contenido generado a múltiples idiomas como el inglés, español, francés, portugués, alemán, italiano, árabe, chino y japonés. Si necesitas otro idioma, ponte en contacto con nosotros.

Actualmente, las cadenas de texto de la plataforma están disponibles en inglés, pero estamos trabajando para ofrecer traducciones de las cadenas de texto de la plataforma a más idiomas.

### ¿Puedo personalizar los roles y permisos de mi organización?

Actualmente, los roles y permisos de la plataforma están diseñados para ofrecer un control granular sobre el acceso a las funcionalidades de la plataforma y puedes encontrar más información en el siguiente enlace: [Roles y Permisos](/primeros-pasos/roles-permisos)

Puedes solicitar un ajuste de roles y permisos para tu organización si lo necesitas, ponte en contacto con nosotros.


