Saltar al contenido principal

Histórico de Mensajes

La API de Neoagent te permite recuperar el historial de mensajes de un chatbot enviando una solicitud POST al endpoint /chat/Chatbot/ChatContentHistory.

Tiempo de lectura

~3-4 minutos

Endpoint​

URL de la Solicitud: https://app.neoagent.co/chat/Chatbot/ChatContentHistory
Método: POST

Headers requeridos​

  • Authorization: <Your-Secret-Key> - cadena, obligatorio - La clave secreta para autenticar la solicitud API

Cuerpo de la Solicitud​

{
"SerialNumber": "36XXGxiYDigrQgg5xz4n45bcBW7qeYyW35",
"StartTime": "2025-01-01",
"EndTime": "2025-03-07"
}

Parámetros​

  • SerialNumber - cadena, obligatorio - El identificador único del chatbot
  • StartTime - cadena, opcional - Fecha de inicio para el filtro (formato: YYYY-MM-DD, zona horaria UTC)
  • EndTime - cadena, opcional - Fecha de fin para el filtro (formato: YYYY-MM-DD, zona horaria UTC)
Sugerencia de Filtros

Si no se especifican StartTime y EndTime, la API devolverá todos los mensajes disponibles. Para mejorar el rendimiento, se recomienda limitar el rango temporal.

Ejemplos de Solicitud​

const res = await fetch('https://app.neoagent.co/chat/Chatbot/ChatContentHistory', {
method: 'POST',
headers: {
"Authorization": "<Your-Secret-Key>"
},
body: JSON.stringify({
"SerialNumber": "36XXGxiYDigrQgg5xz4n45bcBW7qeYyW35",
"StartTime": "2025-01-01",
"EndTime": "2025-03-07"
})
});

const data = await res.json();
console.log(data);

Respuesta​

La respuesta de la API será un objeto JSON con la siguiente estructura:

{
// objeto - Mensajes en el período temporal del chatbot
"Data": [
{
"SessionID": 31302,
"CreateTime": "2023-11-21T16:22:42.264484Z",
"URI": "xxx",
"Messages": [
{
"Type": "AI",
"Content": "¡Hola! ¿Cómo puedo ayudarte?"
},
{
"Type": "User",
"Content": "quiero reservar una cita"
},
{
"Type": "AI",
"Content": "¡Perfecto! Selecciona la fecha y la hora que prefieras..."
}
]
}
],
// cadena - Versión API
"Version": "1.0.0",
// booleano - Estado de éxito de la operación
"Success": true,
// entero - Código de estado HTTP
"Code": 200,
// cadena - Mensaje de error si existe
"Message": ""
}

Estructura de los Datos​

Objeto de Sesión​

  • SessionID - entero - Identificador único de la sesión de chat
  • CreateTime - cadena - Timestamp de creación de la sesión (formato ISO 8601 UTC)
  • URI - cadena - URI de la página web donde se llevó a cabo la conversación
  • Messages - array - Lista de los mensajes de la sesión

Objeto de Mensaje​

  • Type - cadena - Tipo de mensaje ("AI" o "User")
  • Content - cadena - Contenido textual del mensaje

Casos de Uso​

📊 Análisis de Conversaciones​

async function analyzeConversations(serialNumber, startDate, endDate, apiKey) {
const response = await fetch(/* llamada a la API */);
const result = await response.json();

if (result.Success) {
const sessions = result.Data;

// Estadísticas básicas
const totalSessions = sessions.length;
const totalMessages = sessions.reduce((sum, session) => sum + session.Messages.length, 0);
const avgMessagesPerSession = totalMessages / totalSessions;

// Análisis de tipos de solicitudes
const userMessages = sessions.flatMap(s =>
s.Messages.filter(m => m.Type === "User").map(m => m.Content)
);

console.log(`Análisis periodo ${startDate} - ${endDate}:`);
console.log(`- Sesiones totales: ${totalSessions}`);
console.log(`- Mensajes totales: ${totalMessages}`);
console.log(`- Media de mensajes por sesión: ${avgMessagesPerSession.toFixed(2)}`);

return { totalSessions, totalMessages, avgMessagesPerSession, userMessages };
}
}

📈 Reportes Periódicos​

async function generateMonthlyReport(serialNumber, month, year, apiKey) {
const startDate = `${year}-${month.toString().padStart(2, '0')}-01`;
const endDate = new Date(year, month, 0).toISOString().split('T')[0]; // Último día del mes

const stats = await analyzeConversations(serialNumber, startDate, endDate, apiKey);

// Genera el reporte
const report = {
period: `${month}/${year}`,
metrics: stats,
recommendations: generateRecommendations(stats)
};

return report;
}

function generateRecommendations(stats) {
const recommendations = [];

if (stats.avgMessagesPerSession < 3) {
recommendations.push("📝 Las conversaciones son cortas - considera mejorar el engagement");
}

if (stats.totalSessions > 1000) {
recommendations.push("🚀 Volumen alto - considera actualizar el plan para mejores rendimientos");
}

return recommendations;
}

🔍 Búsqueda y Filtrado​

async function searchConversations(serialNumber, searchTerm, apiKey) {
const response = await fetch(/* llamada a la API con rango temporal amplio */);
const result = await response.json();

if (result.Success) {
const matchingSessions = result.Data.filter(session =>
session.Messages.some(message =>
message.Content.toLowerCase().includes(searchTerm.toLowerCase())
)
);

return matchingSessions.map(session => ({
sessionId: session.SessionID,
date: new Date(session.CreateTime).toLocaleDateString('es-ES'),
matchingMessages: session.Messages.filter(m =>
m.Content.toLowerCase().includes(searchTerm.toLowerCase())
)
}));
}
}

// Uso
const results = await searchConversations("36XXG...", "cita", "your-api-key");
console.log("Conversaciones con 'cita':", results);

Limitaciones y Rendimiento​

Paginación​

Esta API no soporta paginación nativa. Para gestionar grandes volúmenes de datos:

async function getHistoryInChunks(serialNumber, startDate, endDate, apiKey, chunkDays = 7) {
const start = new Date(startDate);
const end = new Date(endDate);
const allSessions = [];

while (start < end) {
const chunkEnd = new Date(start);
chunkEnd.setDate(chunkEnd.getDate() + chunkDays);
if (chunkEnd > end) chunkEnd.setTime(end.getTime());

const chunkData = await getChatHistory(
serialNumber,
start.toISOString().split('T')[0],
chunkEnd.toISOString().split('T')[0],
apiKey
);

if (chunkData) allSessions.push(...chunkData);

start.setDate(start.getDate() + chunkDays + 1);
}

return allSessions;
}

Limitación de Tasa​

  • Límite recomendado: Máx 10 solicitudes/minuto para este endpoint
  • Estrategia: Implementa caching para reducir llamadas repetitivas
  • Procesamiento por lotes: Solicita períodos más largos en lugar de múltiples llamadas

Manejo de Errores​

Si la solicitud falla, debes:

  1. Verificar el código de estado HTTP para errores a nivel de red
  2. Examinar los campos Code y Message en la respuesta para errores a nivel de negocio
  3. El campo Message contendrá información detallada sobre el error

Posibles Errores​

CódigoDescripciónAcción Recomendada
400Parámetros no válidos (fechas malformadas)Verifica el formato de las fechas (YYYY-MM-DD)
401Clave API no válidaVerifica las credenciales de autenticación
404Chatbot no encontradoVerifica que el SerialNumber sea correcto
413Rango temporal demasiado amplioReduce el intervalo de fechas solicitado

Ejemplo de Manejo de Errores​

async function safeGetChatHistory(serialNumber, startTime, endTime, apiKey) {
try {
const response = await fetch(/* ... */);
const result = await response.json();

if (!result.Success) {
switch (result.Code) {
case 413:
console.warn('Rango demasiado amplio, reintentando con chunks más pequeños');
return await getHistoryInChunks(serialNumber, startTime, endTime, apiKey);
case 404:
console.error('Chatbot no encontrado:', serialNumber);
return null;
default:
console.error('Error API:', result.Message);
return null;
}
}

return result.Data;
} catch (error) {
console.error('Error de red:', error);
return null;
}
}
Zona Horaria

Todas las fechas en la API están en UTC. Asegúrate de convertir correctamente entre tu zona horaria local y UTC cuando sea necesario.