Endpoint
GET https://api.jelou.ai/v1/external/conversations
Autenticación
| Campo | Ubicación | Tipo | Requerido | Descripción |
|---|---|---|---|---|
| Authorization | Header | string | Sí | Credenciales en formato clientId:clientSecret. |
Parámetros de consulta
| Campo | Ubicación | Tipo | Requerido | Valor por defecto | Descripción |
|---|---|---|---|---|---|
| startAt | Query | string | Sí | — | Fecha de inicio del rango en formato ISO 8601 (UTC). Ejemplo: 2026-03-10T00:00:00.000Z |
| endAt | Query | string | Sí | — | Fecha de fin del rango en formato ISO 8601 (UTC). Ejemplo: 2026-03-17T23:59:59.999Z |
| limit | Query | integer | No | 10 | Número máximo de conversaciones por página. Máximo: 50. |
| page | Query | integer | No | 1 | Número de página. |
| botId | Query | string | No | — | Filtra conversaciones por el identificador del bot. |
| userId | Query | string | No | — | Filtra conversaciones por el identificador del usuario. |
| operatorId | Query | integer | No | — | Filtra conversaciones por el identificador del operador. |
| conversationId | Query | string | No | — | Filtra por el identificador único de una conversación. |
| state | Query | string | No | — | Filtra por estado de la conversación: active, closed, resolved, expired, transferred. |
Usa ventanas de tiempo acotadas para optimizar la consulta y evita rangos demasiado amplios si manejas altos volúmenes de conversaciones.
Ejemplos de solicitud
- cURL
- JavaScript
curl --request GET \
--url 'https://api.jelou.ai/v1/external/conversations?startAt=2026-03-10T00%3A00%3A00.000Z&endAt=2026-03-17T23%3A59%3A59.999Z&page=1' \
--header 'authorization: Basic <clientId:clientSecret>'
const axios = require('axios');
axios({
method: 'GET',
url: 'https://api.jelou.ai/v1/external/conversations',
params: {
startAt: '2026-03-10T00:00:00.000Z',
endAt: '2026-03-17T23:59:59.999Z',
page: 1,
limit: 10
},
headers: {
'Authorization': 'Basic <clientId:clientSecret>'
}
});
Respuestas
200 - Respuesta exitosa
200 - Respuesta exitosa
{
"pagination": {
"limit": 10,
"page": 1,
"total": 88,
"offset": 0,
"totalPages": 9
},
"_metadata": {},
"results": [
{
"_id": "CONVERSATION_ID_1",
"operator": {
"id": 1000,
"names": "OPERATOR_NAME",
"email": "[email protected]"
},
"user": {
"id": "USER_ID",
"names": "USER_NAME"
},
"bot": {
"id": "BOT_ID",
"name": "BOT_NAME"
},
"company": {
"name": "COMPANY_NAME"
},
"assignationMethod": {
"teamName": "TEAM_NAME"
},
"state": "transferred",
"wasReplied": false,
"childConversation": "CONVERSATION_ID_2",
"parentConversation": null,
"endedReason": "transferred",
"startAt": "2026-03-10 08:00:00",
"endAt": "2026-03-10 08:01:00",
"firstRepliedAtOperator": null,
"origin": "organic",
"timeRepliedOperator": null,
"conversationDuration": 60000,
"avgOperatorResponseTime": null
},
{
"_id": "CONVERSATION_ID_2",
"operator": {
"id": 2000,
"names": "OPERATOR_NAME_2",
"email": "[email protected]"
},
"user": {
"id": "USER_ID",
"names": "USER_NAME"
},
"bot": {
"id": "BOT_ID",
"name": "BOT_NAME"
},
"company": {
"name": "COMPANY_NAME"
},
"assignationMethod": {
"teamName": "TEAM_NAME_2"
},
"state": "closed",
"wasReplied": true,
"childConversation": null,
"parentConversation": "CONVERSATION_ID_1",
"endedReason": "closed_by_operator",
"startAt": "2026-03-10 08:01:00",
"endAt": "2026-03-10 08:02:00",
"firstRepliedAtOperator": "2026-03-10 08:01:10",
"origin": "transfer",
"timeRepliedOperator": 10000,
"conversationDuration": 60000,
"avgOperatorResponseTime": 0
}
],
"links": [
{
"number": 1,
"url": "/v1/external/conversations?startAt=2026-03-10T02%3A29%3A20.164Z&endAt=2026-03-17T02%3A29%3A20.164Z&page=1&limit=10"
},
{
"number": 2,
"url": "/v1/external/conversations?startAt=2026-03-10T02%3A29%3A20.164Z&endAt=2026-03-17T02%3A29%3A20.164Z&page=2&limit=10"
},
{
"number": 3,
"url": "/v1/external/conversations?startAt=2026-03-10T02%3A29%3A20.164Z&endAt=2026-03-17T02%3A29%3A20.164Z&page=3&limit=10"
}
]
}
401 - Unauthorized
401 - Unauthorized
{
"message": "Authentication failed"
}
422 - Unprocessable Entity
422 - Unprocessable Entity
{
"message": [
"Los valores ingresados no son correctos."
],
"statusMessage": "failed",
"status": 0,
"error": {
"code": "E0422",
"key": "VALIDATOR_ERROR",
"description": "Error to be thrown when cannot process request because of incoming values",
"developerMessages": {
"es": "Los valores del request no son correctos para ser procesados.",
"en": "The request values are not correct for processing."
},
"clientMessages": {
"es": "Los valores ingresados no son correctos.",
"en": "The values entered are not correct."
}
},
"validationError": {
"startAt": [
{
"es": "El campo startAt es requerido",
"en": "The startAt field is required",
"pt": "O campo startAt é obrigatório"
}
]
}
}
500 - Internal Server Error
500 - Internal Server Error
{
"message": ["We are having trouble processing your request. Please try again later."],
"statusMessage": "failed",
"status": 0
}
Detalle de la respuesta
Objeto results
| Campo | Tipo | Descripción |
|---|---|---|
| _id | string | Identificador único de la conversación. |
| operator | object | Información del operador que atendió la conversación. |
| operator.id | integer | Identificador del operador. |
| operator.names | string | Nombre del operador. |
| operator.email | string | Correo electrónico del operador. |
| user | object | Información del usuario. |
| user.id | string | Identificador del usuario. |
| user.names | string | Nombre del usuario. |
| bot | object | Información del bot asociado. |
| bot.id | string | Identificador del bot. |
| bot.name | string | Nombre del bot. |
| company | object | Información de la empresa. |
| company.name | string | Nombre de la empresa. |
| assignationMethod | object | Método de asignación. |
| assignationMethod.teamName | string | Nombre del equipo al que fue asignada la conversación. |
| state | string | Estado de la conversación: active, closed, resolved, expired, transferred. |
| wasReplied | boolean | Indica si la conversación recibió respuesta del operador. |
| childConversation | string | null | Identificador de la conversación hija en caso de transferencia. |
| parentConversation | string | null | Identificador de la conversación padre si fue recibida por transferencia. |
| endedReason | string | Motivo de cierre: closed_by_operator, expired, transferred, entre otros. |
| startAt | string | Fecha y hora de inicio de la conversación. |
| endAt | string | Fecha y hora de finalización de la conversación. |
| firstRepliedAtOperator | string | null | Fecha y hora de la primera respuesta del operador. |
| origin | string | Origen de la conversación: organic, transfer, induced_by_operator, entre otros. |
| timeRepliedOperator | number | null | Tiempo hasta la primera respuesta del operador en milisegundos. |
| conversationDuration | number | Duración total de la conversación en milisegundos. |
| avgOperatorResponseTime | number | null | Tiempo promedio de respuesta del operador en milisegundos. |
Métricas de rendimiento
Usa los campos
timeRepliedOperator y conversationDuration para analizar la eficiencia de tu equipo de soporte:- timeRepliedOperator: Mide el tiempo que tarda un asesor en dar la primera respuesta (en milisegundos).
- conversationDuration: Mide la duración total desde el inicio hasta el cierre de la conversación (en milisegundos).