Get a scored call
curl --request GET \
--url https://client-api.salesfinity.co/v1/scored-calls/{id} \
--header 'x-api-key: <api-key>'import requests
url = "https://client-api.salesfinity.co/v1/scored-calls/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://client-api.salesfinity.co/v1/scored-calls/{id}', 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://client-api.salesfinity.co/v1/scored-calls/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://client-api.salesfinity.co/v1/scored-calls/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://client-api.salesfinity.co/v1/scored-calls/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v1/scored-calls/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"_id": "6704a9b8c7d6e5f4a3b2c1d0",
"insight": {
"total_score": 71,
"lead": {
"function": "Sales",
"tech_stack_mentioned": [
"Salesforce",
"Outreach"
],
"current_vendor": "Competitor Inc",
"vendor_contract_end": null,
"budget_owner": true,
"has_budget": null,
"priority_level": "medium",
"timeline_to_buy": "3-6mo",
"fit_score": 80,
"is_decision_maker": true,
"is_correct_persona": true,
"pain_point_resonated": true,
"is_qualified_meeting": true,
"is_likely_to_buy": false,
"prospect_lifecycle_stage": [
"solution_aware"
]
},
"messaging": {
"value_prop_resonated": [
"efficiency",
"time_savings"
],
"objection_outcome": [
"handled"
],
"emotional_triggers": [
"frustration_with_current_tool"
],
"recommendation_to_nail_messaging": "Lead with the connect-rate gain for teams their size."
},
"targeting_feedback": {
"persona_fit": "excellent",
"industry_fit": "good",
"persona_seniority": "vp",
"title_relevance": "good",
"data_quality_issue": [],
"future_follow_up_needed": true,
"follow_up_reason": [
"renewal"
]
},
"metadata": {
"duration_sec": 184,
"asr_confidence_avg": 0.85,
"audio_features_available": false,
"talk_listen_ratio_rep": 0.48,
"total_questions": 8,
"open_question_ratio": 0.63,
"interruptions_by_rep": 1,
"core_pitch_duration_sec": 22,
"estimated_wpm_rep": 158,
"estimated_wpm_prospect": 142,
"objections_detected": [
"incumbent_solution"
]
},
"facets": {
"intro": {
"score": 4,
"weight_pct": 10,
"explanation": "Asked permission and gave a reason for the call within ten seconds.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 2.1,
"end_sec": 9.4,
"text": "Hi John, it's Jane from Salesfinity. Mind if I take 30 seconds to say why I called?",
"objection": null
}
],
"checks": {
"permission_opener_used": true,
"opener_length_sec": 7,
"time_to_opener_sec": 2,
"improvement_recommendation": "Name a peer company in the opener."
}
},
"discovery": {
"score": 3.5,
"weight_pct": 25,
"explanation": "Good open questions on current tools; timing never came up.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 31,
"end_sec": 36.2,
"text": "How are your reps building call lists today?",
"objection": null
}
],
"metrics": {
"total_questions": 8,
"open_question_ratio": 0.63,
"improvement_recommendation": "Ask when they plan to change tools.",
"topic_coverage": [
"pain",
"current_tools"
]
}
},
"pitch": {
"score": 3.5,
"weight_pct": 20,
"explanation": "Tied the pitch to the list-building pain they described.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 58.3,
"end_sec": 74,
"text": "Teams like yours usually triple live conversations per hour.",
"objection": null
}
],
"metrics": {
"core_pitch_duration_sec": 22,
"tailored_to_discovery": true,
"improvement_recommendation": "Add one customer result.",
"outcome_keywords": [
"more_meetings",
"save_time"
]
}
},
"tonality": {
"score": 4,
"weight_pct": 15,
"explanation": "Calm and conversational, with some filler words.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 80.5,
"end_sec": 86,
"text": "Totally fair, and that's why I wanted to ask.",
"objection": null
}
],
"metrics": {
"estimated_wpm": 158,
"interruptions_by_rep": 1,
"filler_density_per_min": 2.1,
"improvement_recommendation": "Pause instead of saying 'um'."
}
},
"objection_handling": {
"score": 3,
"weight_pct": 15,
"explanation": "Acknowledged the incumbent but did not probe why they chose it.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 95.2,
"end_sec": 99.8,
"text": "We already use another dialer.",
"objection": "incumbent_solution"
}
],
"metrics": {
"objections_detected": [
"incumbent_solution"
],
"followup_probe_present": false,
"resolution_check_present": true,
"improvement_recommendation": "Ask what they would change about their current dialer."
}
},
"cta": {
"score": 3.5,
"weight_pct": 15,
"explanation": "Asked for a meeting and offered two times.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 150,
"end_sec": 158.4,
"text": "Would Tuesday at 10 or Wednesday at 2 work for a quick demo?",
"objection": null
}
],
"metrics": {
"cta_attempted": true,
"cta_type": "meeting",
"specific_time_offered": true,
"improvement_recommendation": "Recap the agreed time before hanging up.",
"outcome": "accepted"
}
}
},
"gaps": {
"skill": 0.6,
"playbook": 0.3,
"rationale": "Discovery gaps look like habit rather than script."
},
"coaching": {
"top_wins": [
"Permission-based opener",
"Pitch tied to discovery"
],
"top_opportunities": [
"Ask about timing",
"Probe objections"
],
"suggested_drills": [
{
"facet": "discovery",
"assignment": "Run five practice calls that each cover timeline and decision process."
}
]
}
},
"call_log": {
"_id": "6703f1c2a9e4b0a1d2c3f4a5",
"contact": {
"first_name": "John",
"last_name": "Doe",
"company": "Acme Corp",
"title": "VP of Sales"
},
"recording_url": "https://recordings.example.com/call_abc123.mp3",
"duration": 184
},
"user": {
"_id": "64d2b3f2c4e3a6b8f2d9e1a7",
"first_name": "Jane",
"last_name": "Smith",
"email": "[email protected]"
},
"type": "call",
"createdAt": "2026-09-30T17:08:02.000Z",
"updatedAt": "2026-09-30T17:08:02.000Z"
}
}{
"message": "Invalid ObjectId format for parameter: id",
"error": "Bad Request",
"statusCode": 400,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Scored call not found",
"error": "Not Found",
"statusCode": 404,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Rate limit of 300 requests per minute exceeded. Retry in 12s.",
"error": "Too Many Requests",
"statusCode": 429,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}Scored calls
Get a scored call
Returns one call scorecard by its _id. Read-only. The fields are the same as in List scored calls. The ID is the scorecard’s, not the call log’s. AI roleplay scorecards and scorecards from another team return 404.
GET
/
v1
/
scored-calls
/
{id}
Get a scored call
curl --request GET \
--url https://client-api.salesfinity.co/v1/scored-calls/{id} \
--header 'x-api-key: <api-key>'import requests
url = "https://client-api.salesfinity.co/v1/scored-calls/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://client-api.salesfinity.co/v1/scored-calls/{id}', 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://client-api.salesfinity.co/v1/scored-calls/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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://client-api.salesfinity.co/v1/scored-calls/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://client-api.salesfinity.co/v1/scored-calls/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v1/scored-calls/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"_id": "6704a9b8c7d6e5f4a3b2c1d0",
"insight": {
"total_score": 71,
"lead": {
"function": "Sales",
"tech_stack_mentioned": [
"Salesforce",
"Outreach"
],
"current_vendor": "Competitor Inc",
"vendor_contract_end": null,
"budget_owner": true,
"has_budget": null,
"priority_level": "medium",
"timeline_to_buy": "3-6mo",
"fit_score": 80,
"is_decision_maker": true,
"is_correct_persona": true,
"pain_point_resonated": true,
"is_qualified_meeting": true,
"is_likely_to_buy": false,
"prospect_lifecycle_stage": [
"solution_aware"
]
},
"messaging": {
"value_prop_resonated": [
"efficiency",
"time_savings"
],
"objection_outcome": [
"handled"
],
"emotional_triggers": [
"frustration_with_current_tool"
],
"recommendation_to_nail_messaging": "Lead with the connect-rate gain for teams their size."
},
"targeting_feedback": {
"persona_fit": "excellent",
"industry_fit": "good",
"persona_seniority": "vp",
"title_relevance": "good",
"data_quality_issue": [],
"future_follow_up_needed": true,
"follow_up_reason": [
"renewal"
]
},
"metadata": {
"duration_sec": 184,
"asr_confidence_avg": 0.85,
"audio_features_available": false,
"talk_listen_ratio_rep": 0.48,
"total_questions": 8,
"open_question_ratio": 0.63,
"interruptions_by_rep": 1,
"core_pitch_duration_sec": 22,
"estimated_wpm_rep": 158,
"estimated_wpm_prospect": 142,
"objections_detected": [
"incumbent_solution"
]
},
"facets": {
"intro": {
"score": 4,
"weight_pct": 10,
"explanation": "Asked permission and gave a reason for the call within ten seconds.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 2.1,
"end_sec": 9.4,
"text": "Hi John, it's Jane from Salesfinity. Mind if I take 30 seconds to say why I called?",
"objection": null
}
],
"checks": {
"permission_opener_used": true,
"opener_length_sec": 7,
"time_to_opener_sec": 2,
"improvement_recommendation": "Name a peer company in the opener."
}
},
"discovery": {
"score": 3.5,
"weight_pct": 25,
"explanation": "Good open questions on current tools; timing never came up.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 31,
"end_sec": 36.2,
"text": "How are your reps building call lists today?",
"objection": null
}
],
"metrics": {
"total_questions": 8,
"open_question_ratio": 0.63,
"improvement_recommendation": "Ask when they plan to change tools.",
"topic_coverage": [
"pain",
"current_tools"
]
}
},
"pitch": {
"score": 3.5,
"weight_pct": 20,
"explanation": "Tied the pitch to the list-building pain they described.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 58.3,
"end_sec": 74,
"text": "Teams like yours usually triple live conversations per hour.",
"objection": null
}
],
"metrics": {
"core_pitch_duration_sec": 22,
"tailored_to_discovery": true,
"improvement_recommendation": "Add one customer result.",
"outcome_keywords": [
"more_meetings",
"save_time"
]
}
},
"tonality": {
"score": 4,
"weight_pct": 15,
"explanation": "Calm and conversational, with some filler words.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 80.5,
"end_sec": 86,
"text": "Totally fair, and that's why I wanted to ask.",
"objection": null
}
],
"metrics": {
"estimated_wpm": 158,
"interruptions_by_rep": 1,
"filler_density_per_min": 2.1,
"improvement_recommendation": "Pause instead of saying 'um'."
}
},
"objection_handling": {
"score": 3,
"weight_pct": 15,
"explanation": "Acknowledged the incumbent but did not probe why they chose it.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 95.2,
"end_sec": 99.8,
"text": "We already use another dialer.",
"objection": "incumbent_solution"
}
],
"metrics": {
"objections_detected": [
"incumbent_solution"
],
"followup_probe_present": false,
"resolution_check_present": true,
"improvement_recommendation": "Ask what they would change about their current dialer."
}
},
"cta": {
"score": 3.5,
"weight_pct": 15,
"explanation": "Asked for a meeting and offered two times.",
"insufficient_evidence": false,
"evidence": [
{
"start_sec": 150,
"end_sec": 158.4,
"text": "Would Tuesday at 10 or Wednesday at 2 work for a quick demo?",
"objection": null
}
],
"metrics": {
"cta_attempted": true,
"cta_type": "meeting",
"specific_time_offered": true,
"improvement_recommendation": "Recap the agreed time before hanging up.",
"outcome": "accepted"
}
}
},
"gaps": {
"skill": 0.6,
"playbook": 0.3,
"rationale": "Discovery gaps look like habit rather than script."
},
"coaching": {
"top_wins": [
"Permission-based opener",
"Pitch tied to discovery"
],
"top_opportunities": [
"Ask about timing",
"Probe objections"
],
"suggested_drills": [
{
"facet": "discovery",
"assignment": "Run five practice calls that each cover timeline and decision process."
}
]
}
},
"call_log": {
"_id": "6703f1c2a9e4b0a1d2c3f4a5",
"contact": {
"first_name": "John",
"last_name": "Doe",
"company": "Acme Corp",
"title": "VP of Sales"
},
"recording_url": "https://recordings.example.com/call_abc123.mp3",
"duration": 184
},
"user": {
"_id": "64d2b3f2c4e3a6b8f2d9e1a7",
"first_name": "Jane",
"last_name": "Smith",
"email": "[email protected]"
},
"type": "call",
"createdAt": "2026-09-30T17:08:02.000Z",
"updatedAt": "2026-09-30T17:08:02.000Z"
}
}{
"message": "Invalid ObjectId format for parameter: id",
"error": "Bad Request",
"statusCode": 400,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Scored call not found",
"error": "Not Found",
"statusCode": 404,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Rate limit of 300 requests per minute exceeded. Retry in 12s.",
"error": "Too Many Requests",
"statusCode": 429,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500,
"request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
}The
The scorecard comes back inside
id is the scorecard’s _id from List scored calls. It is
not the call log ID; that one is in call_log._id.
curl https://client-api.salesfinity.co/v1/scored-calls/6704a9b8c7d6e5f4a3b2c1d0 \
--header 'x-api-key: YOUR_API_KEY'
data, with the same fields as an item in the list. Facet scores
run from 0 to 5 and total_score from 0 to 100; see
how the score is built.Authorizations
Team-scoped API key generated in the Salesfinity dashboard under Settings → Connections → API & Webhooks. A missing or invalid key returns HTTP 403.
Path Parameters
Scorecard _id, a 24-character hex ID.
Response
The scorecard, wrapped in data.
Show child attributes
Show child attributes