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

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, so there is nothing for the model to analyze either way.

Recording can still be enabled independently of transcription.