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:
- Record and transcribe the call using
startRecording@v1
- Reformat the transcript for a clean AI prompt
- Send the prompt to OpenAI (or any API) and ask custom questions
- Store or email the AI responses
- 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 usingfetch@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?
Updated 13 days ago