Passa al contenuto principale

Storico Messaggi

L'API di Neoagent ti consente di recuperare la cronologia dei messaggi di un chatbot inviando una richiesta POST all'endpoint /chat/Chatbot/ChatContentHistory.

Tempo di lettura

~3-4 minuti

Endpoint

URL della Richiesta: https://app.neoagent.co/chat/Chatbot/ChatContentHistory
Metodo: POST

Headers richiesti

  • Authorization: <Your-Secret-Key> - string, obbligatorio - La chiave segreta per autenticare la richiesta API

Corpo della Richiesta

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

Parametri

  • SerialNumber - string, obbligatorio - L'identificativo univoco del chatbot
  • StartTime - string, opzionale - Data di inizio per il filtro (formato: YYYY-MM-DD, fuso orario UTC)
  • EndTime - string, opzionale - Data di fine per il filtro (formato: YYYY-MM-DD, fuso orario UTC)
Suggerimento Filtri

Se StartTime e EndTime non vengono specificati, l'API restituirà tutti i messaggi disponibili. Per performance migliori, è consigliabile limitare il range temporale.

Esempi di Richiesta

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);

Risposta

La risposta API sarà un oggetto JSON con la seguente struttura:

{
// object - Messaggi nel periodo temporale del chatbot
"Data": [
{
"SessionID": 31302,
"CreateTime": "2023-11-21T16:22:42.264484Z",
"URI": "xxx",
"Messages": [
{
"Type": "AI",
"Content": "Ciao! Come posso aiutarti?"
},
{
"Type": "User",
"Content": "voglio prenotare un appuntamento"
},
{
"Type": "AI",
"Content": "Perfetto! Seleziona la data e l'orario che preferisci..."
}
]
}
],
// string - Versione API
"Version": "1.0.0",
// boolean - Stato di successo dell'operazione
"Success": true,
// integer - Codice di stato HTTP
"Code": 200,
// string - Messaggio di errore se presente
"Message": ""
}

Struttura dei Dati

Session Object

  • SessionID - integer - Identificativo univoco della sessione di chat
  • CreateTime - string - Timestamp di creazione della sessione (formato ISO 8601 UTC)
  • URI - string - URI della pagina web dove è avvenuta la conversazione
  • Messages - array - Lista dei messaggi della sessione

Message Object

  • Type - string - Tipo di messaggio ("AI" o "User")
  • Content - string - Contenuto testuale del messaggio

Casi d'Uso

📊 Analisi Conversazioni

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

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

// Statistiche base
const totalSessions = sessions.length;
const totalMessages = sessions.reduce((sum, session) => sum + session.Messages.length, 0);
const avgMessagesPerSession = totalMessages / totalSessions;

// Analisi tipi di richieste
const userMessages = sessions.flatMap(s =>
s.Messages.filter(m => m.Type === "User").map(m => m.Content)
);

console.log(`Analisi periodo ${startDate} - ${endDate}:`);
console.log(`- Sessioni totali: ${totalSessions}`);
console.log(`- Messaggi totali: ${totalMessages}`);
console.log(`- Media messaggi per sessione: ${avgMessagesPerSession.toFixed(2)}`);

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

📈 Report Periodici

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]; // Ultimo giorno del mese

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

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

return report;
}

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

if (stats.avgMessagesPerSession < 3) {
recommendations.push("📝 Le conversazioni sono brevi - considera di migliorare l'engagement");
}

if (stats.totalSessions > 1000) {
recommendations.push("🚀 Volume alto - valuta l'upgrade del piano per performance migliori");
}

return recommendations;
}

🔍 Ricerca e Filtraggio

async function searchConversations(serialNumber, searchTerm, apiKey) {
const response = await fetch(/* API call con range temporale ampio */);
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('it-IT'),
matchingMessages: session.Messages.filter(m =>
m.Content.toLowerCase().includes(searchTerm.toLowerCase())
)
}));
}
}

// Utilizzo
const results = await searchConversations("36XXG...", "appuntamento", "your-api-key");
console.log("Conversazioni con 'appuntamento':", results);

Limitazioni e Performance

Paginazione

Questa API non supporta paginazione nativa. Per gestire grandi volumi di dati:

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;
}

Rate Limiting

  • Limite consigliato: Max 10 richieste/minuto per questo endpoint
  • Strategia: Implementa caching per ridurre chiamate ripetitive
  • Batch processing: Richiedi periodi più lunghi piuttosto che chiamate multiple

Gestione degli Errori

Se la richiesta fallisce, dovresti:

  1. Controllare il codice di stato HTTP per errori a livello di rete
  2. Esaminare i campi Code e Message nella risposta per errori a livello business
  3. Il campo Message conterrà informazioni dettagliate sull'errore

Possibili Errori

CodiceDescrizioneAzione Consigliata
400Parametri non validi (date malformate)Verifica il formato delle date (YYYY-MM-DD)
401Chiave API non validaControlla le credenziali di autenticazione
404Chatbot non trovatoVerifica che il SerialNumber sia corretto
413Range temporale troppo ampioRiduci l'intervallo di date richiesto

Esempio di Error Handling

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('Range troppo ampio, riprovo con chunks più piccoli');
return await getHistoryInChunks(serialNumber, startTime, endTime, apiKey);
case 404:
console.error('Chatbot non trovato:', serialNumber);
return null;
default:
console.error('Errore API:', result.Message);
return null;
}
}

return result.Data;
} catch (error) {
console.error('Errore di rete:', error);
return null;
}
}
Fuso Orario

Tutte le date nell'API sono in UTC. Assicurati di convertire correttamente tra il tuo fuso orario locale e UTC quando necessario.