Skip to content

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

text
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_startedpendingprocessingcompleted. 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:

bash
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:

bash
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.

json
{
  "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:

json
{
  "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:

json
{
  "evaluation": {
    "rubric": "Did the agent: 1) Greet the customer warmly, 2) Identify the issue, 3) Provide a resolution or escalation?"
  }
}

The result includes:

FieldTypeDescription
passedbooleanWhether the agent met the rubric criteria
scorenumberNumeric score (0-1)
reasoningstringExplanation 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

bash
curl https://api.rymi.live/v1/calls/CALL_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

The response includes an intelligence block:

json
{
  "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

bash
curl https://api.rymi.live/v1/calls/CALL_ID/summary \
  -H "Authorization: Bearer YOUR_API_KEY"

Recording Only

bash
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:

bash
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_status is set to skipped, with skip_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 — there is nothing for the model to analyze either way.

Recording can still be enabled independently of transcription.