Extract Call Data with AI ✨

You can combine Callr Actions with services like OpenAI, Claude, or Mistral to extract structured insights from real phone calls — in real time.

This enables you to:

  • Auto-summarize conversations
  • Detect the call's purpose
  • Extract key outcomes (e.g., appointment set or not)
  • Push AI-generated data to your backend or CRM
  • Send call reports via email to your team

No batch jobs — all handled live at the end of the call.

⚙️ How It Works


Step 1 – The call is recorded

The full conversation is captured for transcription and analysis.

Step 2 – Analyzed with AI

The transcript along with your questions is sent to an LLM to get structured answers.

Step 3 – Pushed to your tools

The results are delivered to your CRM, backend, or notification channels.



🧪 Example Scenario: Call Forwarding with AI Analysis

The example below shows how to:

  1. Record and transcribe the call using startRecording@v1
  2. Reformat the transcript for a clean AI prompt
  3. Send the prompt to OpenAI (or any API) and ask custom questions
  4. Store or email the AI responses
  5. Push the full dataset (transcription + AI) to your backend

This works for any Inbound Call, including those that are forwarded or answered by an AI agent.

description: >
  Call forwarding with transcriptions
  and AI-based data extraction

variables:
  $dial: null
  $aiAnswers: []
  $aiAnswersText: ""

  # MODIFIABLE VARIABLES BELOW
  $url: null # e.g., https://api.example.com/callr
  $openai:
    key: <openai-key>
    model: gpt-4o-mini
    temperature: 0.2
  $aiQuestions:
    - What is the reason for the call in less than 6 words?
    - What is the summary of the conversation in a few short sentences?
    - Was an appointment set up between the caller and the callee?
    - Did the caller reach voicemail?
  $dialTargets:
    - number: "+33199001020"
      timeout: 20
    - number: "+33639980010"
      timeout: 20
  $emails:
    - [email protected]
    - [email protected]

compat:
  version: "2025-09-01"

defaults:
  language: en-US
  voice: en-US-AndrewMultilingual

branches:
  inbound-call:
    actions:
      - action: say@v2
        params:
          what: >
            Hello, this call may be recorded for statistical and security purposes.

      - action: startRecording@v1
        events:
          ready:
            - action: javascript@v1
              params:
                code: |
                  let caller = call.fromNumber
                  let callee = scenario.name
                  let text = ""

                  if ($dial?.cdr?.callee) callee = $dial.cdr.callee
                  if (!caller) caller = "The caller"
                  for (const line of chat) {
                    const who = line.from === 'leg_a' ? caller : callee
                    text += who + ": «" + line.display + " »\r\n"
                  }
                  return { $text: text, $A: caller, $B: callee }

            - action: javascript@v1
              params:
                code: |
                  const $messages = [
                    { role: 'system', content: `You are given a transcript of a conversation between "${$A}" (caller) and "${$B}" (callee). The transcript is:` },
                    { role: 'system', content: $text },
                    { role: 'system', content: `Answer the following questions strictly based on this transcript. Do not add any details that are not present.` },
                    { role: 'system', content: `If the transcript does not provide enough information, answer with "-" only.` },
                    { role: 'system', content: `Keep answers concise. Format the output as a JSON object: { "Q1": "...", "Q2": "...", ... }.` },
                    { role: 'user', content: '- ' + $aiQuestions.join('\n- ') }
                  ]
                  return { $messages }

            - action: openai@v2
              params:
                secret: ${{ $openai.key }}
                endpoint: chat/completions
                properties:
                  model: ${{ $openai.model }}
                  messages: ${{ $messages }}
                  temperature: ${{ $openai.temperature }}
                  response_format:
                    type: json_object
                timeout: 60
              result: $openai

            - action: javascript@v1
              params:
                code: |
                  $aiAnswers = JSON.parse($openai?.choices[0]?.message?.content)
                  $aiAnswersText = $aiQuestions
                    .map((question, index) => {
                      const answerKey = `Q${index + 1}`
                      return `"${question}"\r\n\t=> ${$aiAnswers[answerKey]}`
                    }).join('\r\n')

            - if: $url
              action: fetch@v2
              params:
                method: POST
                url: ${{ $url }}
                headers:
                  Content-Type: application/json
                body: |
                  {
                    "run": ${{ JSON.stringify(run) }},
                    "call": ${{ JSON.stringify(call) }},
                    "scenario": ${{ JSON.stringify(scenario) }},
                    "recordingURL": ${{ JSON.stringify(recording?.url) }},
                    "transcription": ${{ JSON.stringify(recording?.transcription) }},
                    "chat": ${{ JSON.stringify(chat) }},
                    "ai": ${{ JSON.stringify($aiAnswers) }}
                  }

            - if: $emails?.length > 0
              action: email@v1
              params:
                subject: Call summary from ${{ call.fromNumber }}
                text: |
                  Hello,

                  Call from ${{ call.fromNumber }}. Duration: ${{ recording.duration }}s.

                  Audio recording: ${{ recording.url }}

                  AI Analysis:
                  ${{ $aiAnswersText }}

                  Transcription:
                  ${{ $text }}

                to: ${{ $emails }}

      - action: dial@v1
        params:
          targets: ${{ $dialTargets }}
          answerOnBranch: outbound
        result: $dial

      - if: "!$dial?.ok"
        action: say@v2
        params:
          what: Sorry, we are not available at the moment.

  outbound:
    actions:
      - action: say@v2
        params:
          what: >
            This call may be recorded for statistical and security purposes.
      - action: bridge@v1

🔁 Customize It for Your Workflow

You can:

  • Replace openai@v2 with any LLM API using fetch@v2
  • Customize the prompt and questions to extract any data relevant to your business
  • Push data to multiple systems — CRM, Slack, Notion, analytics — all via fetch@v2
  • Send results to a manager or team with email@v1
  • If can used with Click-to-Call and Outbound Calls too!

🏭 Use Cases by Industry

Voice AI isn't just about summarization — it's about automating insights that were previously locked inside conversations. Here's how different industries can use this scenario:


🏠 Real Estate

  • Extract property location, type (house, apartment, etc.), and budget
  • Identify if the caller is buying, renting, or selling
  • Detect urgency (e.g., "moving next month")
  • Generate a lead summary for agents automatically

Example Questions:

  • What city or area is mentioned in the call?
  • What kind of property is the caller looking for?
  • What is their estimated budget?

🏥 Healthcare

  • Extract appointment intent, preferred time, or reschedule requests
  • Detect if the call is about a new patient intake or a follow-up
  • Flag emergency language (e.g. “urgent”, “pain”, “as soon as possible”)

Example Questions:

  • Was the caller trying to book an appointment?
  • What kind of medical issue or department was mentioned?
  • Was a date or time proposed?

🧑‍⚖️ Legal Services

  • Identify case types (divorce, immigration, contract dispute, etc.)
  • Extract jurisdiction or opposing party names
  • Determine next action (e.g. sending documents, scheduling a meeting)

Example Questions:

  • What type of legal issue is being discussed?
  • Was a deadline or court date mentioned?
  • Did the caller request a consultation?

🛍️ E-commerce & Retail

  • Identify product interest or order issues
  • Capture order numbers, delivery complaints, or return requests
  • Flag escalation phrases (e.g. “I want a refund”, “this is unacceptable”)

Example Questions:

  • Is this call about an existing order?
  • Was a product name or issue mentioned?
  • Did the caller request a return, exchange, or refund?

🏦 Financial Services

  • Detect loan or account inquiries
  • Identify fraud mentions or credit card issues
  • Capture interest in insurance, investments, or mortgage refinancing

Example Questions:

  • What product or service is the caller asking about?
  • Did the caller mention a transaction or amount?
  • Was an issue with a payment, card, or loan mentioned?

📞 Contact Centers

  • Extract intent automatically from every call
  • Identify reasons for call drops or dissatisfaction
  • Classify calls by topic or urgency for downstream routing

Example Questions:

  • What is the primary reason for the call?
  • Was the issue resolved?
  • Did the caller express frustration or satisfaction?