Post-Call Intelligence
Every finished call can hand back a summary, a sentiment read, structured data extracted to your schema, and a rubric score, plus the recorded audio. The first four come from an LLM reading the transcript; the recording is the stored call audio.
How It Works
Call ends → Transcript finalized → Post-Call Intelligence Pipeline
│
├─ Summary (AI-generated key takeaways)
├─ Sentiment (positive / neutral / negative)
├─ Structured Extraction (JSON from your schema)
├─ Evaluation (rubric-based scoring)
└─ Recording (stored call audio)Post-call intelligence runs asynchronously after a call reaches terminal state. The intelligence_status field on the call record tracks progress: not_started → pending → processing → completed. A call can also land on skipped (no caller content, or transcription disabled: nothing to analyze), partial (analysis ran but some steps failed), failed, or dead_letter (all retries exhausted and the job was moved to the dead-letter queue).
Configuration
Post-call intelligence is configured at two levels:
1. Agent Defaults
Set post_call on an agent to apply to all calls with that agent:
curl -X PUT https://api.rymi.live/v1/agents/YOUR_AGENT_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"features": { "recording_enabled": true },
"post_call": {
"summary": { "enabled": true },
"structured_extraction": {
"json_schema": {
"type": "object",
"properties": {
"appointment_booked": { "type": "boolean" },
"customer_sentiment": { "type": "string" },
"follow_up_date": { "type": "string" },
"key_objections": { "type": "array", "items": { "type": "string" } }
}
}
},
"evaluation": {
"rubric": "Did the agent qualify the lead, handle objections professionally, and attempt to book a follow-up?"
}
}
}'2. Per-Call Overrides
Override the agent defaults for a specific call:
curl -X POST https://api.rymi.live/v1/calls \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "YOUR_AGENT_ID",
"participants": [
{ "transport": "pstn", "identity": "+15551234567", "from_number": "+15559876543" }
],
"post_call": {
"summary": { "enabled": true },
"structured_extraction": {
"json_schema": {
"type": "object",
"properties": {
"order_confirmed": { "type": "boolean" }
}
}
}
}
}'The per-call config is merged with the agent defaults and snapped onto the call record at creation time. post_call covers summary, structured_extraction, and evaluation. Recording is an agent-level toggle (features.recording_enabled) and can't be overridden per call.
Features
Summary
When summary.enabled is true, an AI model generates a concise summary of the call conversation.
{
"summary": {
"enabled": true,
"prompt": "Focus on action items and customer intent."
}
}The optional prompt field guides the summary generation.
Sentiment Analysis
Sentiment is analyzed on every call that gets post-call analysis, any call with caller content, regardless of which features you enable. The model that reads the transcript always returns a sentiment alongside the summary, extraction, and evaluation. (Only the non-LLM heuristic fallback, used if the model call fails, is tied to the summary toggle.) The result is one of positive, neutral, or negative.
Structured Data Extraction
Define a JSON schema and Rymi will extract structured data from every call transcript:
{
"structured_extraction": {
"json_schema": {
"type": "object",
"properties": {
"appointment_booked": { "type": "boolean" },
"customer_name": { "type": "string" },
"budget_range": { "type": "string" },
"next_steps": { "type": "array", "items": { "type": "string" } }
}
}
}
}Rymi auto-generates an extraction prompt from your schema. The result is stored on call_intelligence.structured_data.
TIP
Extraction runs whenever a json_schema is present. If you don't supply your own prompt, Rymi generates one automatically from the schema.
Evaluation Scoring
Provide a rubric to evaluate whether the agent met its goals:
{
"evaluation": {
"rubric": "Did the agent: 1) Greet the customer warmly, 2) Identify the issue, 3) Provide a resolution or escalation?"
}
}The result includes:
| Field | Type | Description |
|---|---|---|
passed | boolean | Whether the agent met the rubric criteria |
score | number | Numeric score (0-1) |
reasoning | string | Explanation of the evaluation |
Recording
When the agent's features.recording_enabled is true, Rymi records the call audio. Recordings are stored and accessible via GET /v1/calls/:id/recording.
Retrieving Intelligence
Full Call Detail
curl https://api.rymi.live/v1/calls/CALL_ID \
-H "Authorization: Bearer YOUR_API_KEY"The response includes an intelligence block:
{
"intelligence": {
"status": "completed",
"skip_reason": null,
"summary": "The customer called about a billing issue. The agent resolved it by applying a credit.",
"sentiment": "positive",
"structured_data": {
"appointment_booked": false,
"customer_name": "Alice",
"issue_resolved": true
},
"evaluation": {
"passed": true,
"score": 0.9,
"reasoning": "The agent greeted warmly, identified the issue quickly, and resolved it."
},
"errors": []
}
}Summary Only
curl https://api.rymi.live/v1/calls/CALL_ID/summary \
-H "Authorization: Bearer YOUR_API_KEY"Recording Only
curl https://api.rymi.live/v1/calls/CALL_ID/recording \
-H "Authorization: Bearer YOUR_API_KEY"Returns signed URLs for the recording artifacts.
Reprocessing
If analysis failed or you want to retry with updated config:
curl -X POST https://api.rymi.live/v1/calls/CALL_ID/reprocess \
-H "Authorization: Bearer YOUR_API_KEY"This re-queues the post-call intelligence pipeline for the call.
Transcript Privacy
If features.transcription_enabled is false on the agent:
- No transcript is persisted
- No transcript data packets are sent to participants
- Post-call transcript analysis is skipped entirely
intelligence_statusis set toskipped, withskip_reason: "transcription_disabled"on the intelligence record
The same skipped status (with skip_reason: "no_user_content") is used when transcription is on but the caller never produced any transcribed speech, so there is nothing for the model to analyze either way.
Recording can still be enabled independently of transcription.

