Get call analysis
curl --request GET \
--url https://api.aura-app.ai/v1/calls/{id}/analysisimport requests
url = "https://api.aura-app.ai/v1/calls/{id}/analysis"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.aura-app.ai/v1/calls/{id}/analysis', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aura-app.ai/v1/calls/{id}/analysis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.aura-app.ai/v1/calls/{id}/analysis"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.aura-app.ai/v1/calls/{id}/analysis")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aura-app.ai/v1/calls/{id}/analysis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"analyzed_at": "2026-01-17T10:00:00Z",
"buyer_certainty_index": 55,
"call_id": "<string>",
"call_journey": [
{}
],
"closing_score": 65,
"coaching_data": {},
"confidence": 0.87,
"created_at": "2026-01-17T10:00:00Z",
"door": {
"note": "Prospect agreed to review the proposal with their partner and a follow-up was booked.",
"taken": 2
},
"emotional_score": 82,
"id": "550e8400-e29b-41d4-a716-446655440000",
"key_moments": [
{
"description": "Lead raised concern about implementation timeline",
"type": "breaking_point",
"id": "moment-1",
"speaker": "Sarah Smith",
"timestamp": 312,
"title": "Prospect Rejects Offer"
}
],
"metrics": {},
"objections_detected": [
{
"category": "smoke_screen",
"confidence": 0.92,
"quote": "That's a bit more than we budgeted for this quarter",
"handling_feedback": "Good reframe to value but missed opportunity to anchor to ROI",
"handling_score": 75
}
],
"offer_made": true,
"overall_score": 78,
"pack_id": "<string>",
"primary_objection": "price",
"quick_insights": [
{}
],
"reasoning": "<string>",
"status": "closed",
"structure_score": 71,
"updated_at": "2026-01-17T10:00:00Z",
"upgrades": [
{
"ctx": "Immediately after the prospect declines — the highest-leverage moment in the call.",
"say": "Before we wrap up — I totally respect that. Can I ask what gave you pause?",
"t": 312,
"was": "So unfortunately, we don't have a deal today."
}
],
"verdict": "retain"
},
"success": true
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"error": "Call analysis not found",
"success": false,
"code": "NOT_FOUND"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}Calls
Get call analysis
Retrieve the full AI review for a call. This is the complete output of the analysis pipeline — everything the Aura dashboard shows on a call’s review tab.
Response includes:
- Overall, closing, emotional and structure scores, plus the buyer certainty index
- AI verdict (
hire,retain,replace) with confidence and written reasoning - Every detected objection: category, the prospect’s verbatim quote, and how well it was handled
- Key moments with their offset into the call
- The stage-by-stage call journey (rapport → discovery → pitch → close), each stage scored
- Coaching output: quick insights, the specific script upgrades that would have changed the call, and the exit door taken
offer_made, which powers offer-rate reporting
Availability. The review runs asynchronously after the call ends, so it lands minutes to hours after the call itself. Until it does, this endpoint returns 404. Two ways to know when it is ready:
has_analysison the call object (GET /v1/calls,GET /v1/calls/{id})- the
call.analysis_completedwebhook, which carries the headline scores and a link back here — prefer this over polling
Evolving fields. coaching_data, metrics, call_journey and
quick_insights are pipeline outputs whose internal structure improves as the
models do. Their presence is contractual; their inner keys are not. Read them
defensively and do not pin to a specific shape.
GET
/
v1
/
calls
/
{id}
/
analysis
Get call analysis
curl --request GET \
--url https://api.aura-app.ai/v1/calls/{id}/analysisimport requests
url = "https://api.aura-app.ai/v1/calls/{id}/analysis"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.aura-app.ai/v1/calls/{id}/analysis', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aura-app.ai/v1/calls/{id}/analysis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.aura-app.ai/v1/calls/{id}/analysis"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.aura-app.ai/v1/calls/{id}/analysis")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aura-app.ai/v1/calls/{id}/analysis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"analyzed_at": "2026-01-17T10:00:00Z",
"buyer_certainty_index": 55,
"call_id": "<string>",
"call_journey": [
{}
],
"closing_score": 65,
"coaching_data": {},
"confidence": 0.87,
"created_at": "2026-01-17T10:00:00Z",
"door": {
"note": "Prospect agreed to review the proposal with their partner and a follow-up was booked.",
"taken": 2
},
"emotional_score": 82,
"id": "550e8400-e29b-41d4-a716-446655440000",
"key_moments": [
{
"description": "Lead raised concern about implementation timeline",
"type": "breaking_point",
"id": "moment-1",
"speaker": "Sarah Smith",
"timestamp": 312,
"title": "Prospect Rejects Offer"
}
],
"metrics": {},
"objections_detected": [
{
"category": "smoke_screen",
"confidence": 0.92,
"quote": "That's a bit more than we budgeted for this quarter",
"handling_feedback": "Good reframe to value but missed opportunity to anchor to ROI",
"handling_score": 75
}
],
"offer_made": true,
"overall_score": 78,
"pack_id": "<string>",
"primary_objection": "price",
"quick_insights": [
{}
],
"reasoning": "<string>",
"status": "closed",
"structure_score": 71,
"updated_at": "2026-01-17T10:00:00Z",
"upgrades": [
{
"ctx": "Immediately after the prospect declines — the highest-leverage moment in the call.",
"say": "Before we wrap up — I totally respect that. Can I ask what gave you pause?",
"t": 312,
"was": "So unfortunately, we don't have a deal today."
}
],
"verdict": "retain"
},
"success": true
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"error": "Call analysis not found",
"success": false,
"code": "NOT_FOUND"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}Retrieve the full AI review for a call. This is the complete output of the
analysis pipeline — everything the Aura dashboard shows on a call’s review tab.
Response includes:
- Overall, closing, emotional and structure scores, plus the buyer certainty index
- AI verdict (
hire,retain,replace) with confidence and written reasoning - Every detected objection: category, the prospect’s verbatim quote, and how well it was handled
- Key moments with their offset into the call
- The stage-by-stage call journey (rapport → discovery → pitch → close), each stage scored
- Coaching output: quick insights, the specific script upgrades that would have changed the call, and the exit door taken
offer_made, which powers offer-rate reporting
has_analysison the call object (GET /v1/calls,GET /v1/calls/{id})- the
call.analysis_completedwebhook, which carries the headline scores and a link back here — prefer this over polling
coaching_data, metrics, call_journey and
quick_insights are pipeline outputs whose internal structure improves as the
models do. Their presence is contractual; their inner keys are not. Read them
defensively and do not pin to a specific shape.