Skip to main content
Conversation History gives you a searchable log of every call handled by your agents. Each entry includes the transcript, metadata, call outcome, and optionally an AI-extracted data summary.

Browsing conversations

Navigate to Conversation History in the sidebar. The list shows all conversations from agents that belong to your account — other tenants’ conversations are automatically filtered out.

Available filters

FilterDescription
AgentShow conversations from a specific agent
Call outcomeFilter by success or failure
Date range (before)Show calls that started before a Unix timestamp
Date range (after)Show calls that started after a Unix timestamp
Page sizeNumber of results per page (1–100, default 20)
Results are paginated using a cursor. Click Load more to advance to the next page.

Conversation list fields

Each row in the list shows:
FieldDescription
Agent nameThe agent that handled the call
DateCall start time formatted as Mar 25, 2026, 10:00 AM
DurationCall length in M:SS format
MessagesNumber of transcript turns
Statussuccessful, error, processing, or no_answer

Viewing a conversation

Click any row to open the full conversation detail page. The detail view includes:
The full turn-by-turn transcript with speaker labels (user / assistant) and the time offset within the call for each message.
Call start time, duration in seconds, cost in ElevenLabs credits, phone call details (caller/callee numbers), and whether the call originated from a batch campaign.
ElevenLabs call outcome (call_successful), transcript summary, and any evaluation criteria results configured on the agent.
Per-model token usage and cost split by irreversible_generation (agent responses) and initiated_generation (proactive agent messages), plus the base llm_price charge.
Any variables injected at the start of the conversation via conversation_initiation_client_data, such as customer name or account ID.

Audio playback

If the conversation has audio (has_audio: true), you can stream or download the recording:
GET /conversation-history/{conversationId}/audio
The response streams the audio as audio/mpeg (MP3). The filename is conversation_{conversationId}.mp3.
has_audio, has_user_audio, and has_response_audio are separate flags. A conversation can have response audio (agent voice) without user audio (caller audio) depending on recording settings.

AI-powered data extraction

Sniko uses OpenRouter to analyze a conversation’s transcript and extract structured information — such as caller intent, key details mentioned, and action items — using a language model. Extraction results are cached in the conversation_extractions table after the first run. Subsequent requests for the same conversation return the cached result instantly.

Triggering extraction on a single conversation

POST /conversation-history/{conversationId}/extract-information
The endpoint fetches the conversation from ElevenLabs, transforms the transcript, runs OpenRouter extraction, caches the result, and returns:
{
  "success": true,
  "data": { ... },
  "model_used": "openai/gpt-4o-mini",
  "cached": false,
  "message": "Information extracted successfully"
}
If the extraction was already cached, cached is true and message is "Information loaded from cache".
Conversations with no transcript return a 400 error. Extraction requires at least one transcript turn.

Auto-extraction

When you open the conversation list, Sniko automatically queues extraction jobs for any new conversations that have a transcript but no cached extraction. These jobs run in the background via the Laravel queue.

Batch extraction

To extract data from all conversations that are missing an extraction record, use the batch extraction endpoint:
POST /conversation-history/batch-extract-missing
This dispatches a background job (BatchExtractMissingInformation) and returns a cache_key you can use to poll progress:
{
  "success": true,
  "message": "Batch extraction started",
  "cache_key": "batch_extraction_42_64f3a1b2c9d4e"
}

Polling extraction progress

GET /conversation-history/batch-extraction-progress/{cacheKey}
Returns the current state of the batch job stored in the application cache:
{
  "success": true,
  "data": {
    "total": 120,
    "processed": 47,
    "succeeded": 45,
    "failed": 2
  }
}
Poll this endpoint at a reasonable interval (e.g. every 5 seconds) until processed equals total.

Checking how many conversations need extraction

GET /conversation-history/missing-extractions-count?agent_id={agentId}
Returns the count of conversations with a transcript but no cached extraction:
{
  "success": true,
  "count": 23,
  "total_conversations": 120
}

Downloading extracted data

Single conversation

GET /conversation-history/{conversationId}/download-extracted-info
Downloads the extracted data for one conversation as a plain-text .txt file. If no extraction exists yet, it runs the extraction first and caches it before downloading. Filename format: conversation_{conversationId}_info_{YYYY-MM-DD_HHmmss}.txt

All conversations (bulk report)

POST /conversation-history/download-all-extractions
Generates a single report file containing extracted data for every conversation across all your agents. The report:
  • Fetches all conversation pages (up to 10 pages × 100 results = 1,000 conversations)
  • Uses cached extractions where available, runs fresh extraction for missing ones
  • Formats each conversation with a header showing agent name and conversation ID
  • Includes a summary at the end: Successfully processed: N | Failed: M
The response streams the file directly as text/plain. Filename format: all_extractions_report_{YYYY-MM-DD_HHmmss}.txt
Bulk report generation sets a 5-minute execution time limit and 512 MB memory limit. For very large accounts, consider running batch extraction first so the report generation only reads from cache.

ConversationExtraction model

Extraction results are stored in the conversation_extractions database table:
FieldTypeDescription
conversation_idstringElevenLabs conversation ID
extracted_dataJSONStructured data returned by OpenRouter
model_usedstringThe OpenRouter model that performed the extraction (e.g. openai/gpt-4o-mini)
user_idinteger|nullUser ID for attribution (set during batch extraction)
created_attimestampWhen the extraction was first run
updated_attimestampLast update time

Deleting conversations

DELETE /conversation-history/{conversationId}
Deletes the conversation from ElevenLabs. The local conversation_extractions record (if any) is not automatically removed — extraction data remains in the database after the source conversation is deleted.
Conversation deletion is permanent and cannot be undone. The transcript, audio, and analysis data stored in ElevenLabs are removed immediately.

Build docs developers (and LLMs) love