curl --request GET \
--url https://api.instaview.sk/conversations/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.instaview.sk/conversations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.instaview.sk/conversations/{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://api.instaview.sk/conversations/{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 => [
"Authorization: Bearer <token>"
],
]);
$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.instaview.sk/conversations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.instaview.sk/conversations/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/conversations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "123e4567-e89b-12d3-a456-426614174000",
"contactId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "987e6543-e21b-12d3-a456-426614174000",
"agentId": "456e7890-e12b-34d5-a678-901234567890",
"status": "SCHEDULED",
"scheduledAt": "2025-11-20T10:00:00Z",
"createdAt": "2024-11-16T10:30:00Z",
"updatedAt": "2024-11-16T10:30:00Z",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"runId": "789e0123-e45b-67d8-a901-234567890123",
"durationMinutes": 15,
"finishedDate": "2025-11-20T10:15:00Z",
"metadata": {
"externalInterviewId": "INT-789"
},
"callAttempts": [
{
"id": "c9c9a6e8-fb4a-45f3-80fc-bf94f071cd2a",
"direction": "OUTBOUND",
"status": "COMPLETED",
"reasonCode": "NO_ANSWER",
"notes": "Candidate did not pick up, mailbox full",
"retryNumber": 2,
"recordingUrl": "https://audio.example.com/recording.mp3",
"duration": 180,
"scheduledAt": "2025-07-22T10:00:00Z",
"calledAt": "2025-07-22T10:01:00Z",
"transcript": [
{
"speaker": "AI",
"text": "Hello, thank you for taking the time to speak with me today.",
"startTime": 0,
"endTime": 3.5,
"language": "en"
}
]
}
],
"analysis": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"general": {
"createdAt": "2024-11-16T10:30:00Z",
"updatedAt": "2024-11-16T10:30:00Z",
"overallRating": 85,
"scoringIncompleteReason": "model_unavailable",
"companyFitRating": "HIGH",
"education": "Master's degree in Computer Science",
"experience": "5 years of experience in software development",
"strongPoints": [
"Excellent communication skills",
"Strong technical expertise in React and Node.js",
"Proven track record of leading teams"
],
"weakPoints": [
"Limited experience with microservices",
"Needs improvement in system design"
],
"evaluation": [
"Strong candidate with relevant experience",
"Good cultural fit for the team",
"Recommended for next round"
],
"status": 3
},
"specific": {
"pronunciationScores": {
"accuracy": 90,
"fluency": 85,
"prosody": 82
},
"grammar": {
"level": "C1"
}
}
},
"analytics": {
"matchScore": 72,
"updatedAt": "2026-08-03T10:30:00Z",
"fields": [
{
"key": "budget_confirmed",
"label": "Budget confirmed",
"type": "string",
"value": true,
"confidence": 0.5,
"evidence": "Said they have signed off on 15k for this quarter"
}
],
"scoring": {
"total": 72,
"items": [
{
"key": "budget_confirmed",
"kind": "field",
"label": "Budget confirmed",
"score": 80,
"weightPercent": 33.3,
"importance": "REQUIRED",
"reasoning": "<string>"
}
]
},
"outcomes": [
{
"key": "meeting_booked",
"label": "Meeting booked",
"met": true,
"confidence": 0.5,
"evidence": "<string>"
}
],
"tags": [
{
"key": "needs_followup",
"label": "Needs follow-up",
"applied": true,
"reason": "<string>"
}
],
"qa": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"question": "<string>",
"answered": true,
"answer": "<string>",
"evidence": "<string>"
}
],
"evaluation": {
"strengths": [
"<string>"
],
"concerns": [
"<string>"
],
"objections": [
"<string>"
],
"assessment": [
"<string>"
]
},
"sentiment": {
"overall": "positive",
"score": 0.5,
"trajectory": "improving",
"notes": "<string>"
},
"summary": "Qualified lead; demo booked for Thursday."
},
"isTest": false
}Get Conversation
Returns a single conversation, ensuring it belongs to the API key’s company.
curl --request GET \
--url https://api.instaview.sk/conversations/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.instaview.sk/conversations/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.instaview.sk/conversations/{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://api.instaview.sk/conversations/{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 => [
"Authorization: Bearer <token>"
],
]);
$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.instaview.sk/conversations/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.instaview.sk/conversations/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/conversations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "123e4567-e89b-12d3-a456-426614174000",
"contactId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "987e6543-e21b-12d3-a456-426614174000",
"agentId": "456e7890-e12b-34d5-a678-901234567890",
"status": "SCHEDULED",
"scheduledAt": "2025-11-20T10:00:00Z",
"createdAt": "2024-11-16T10:30:00Z",
"updatedAt": "2024-11-16T10:30:00Z",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"runId": "789e0123-e45b-67d8-a901-234567890123",
"durationMinutes": 15,
"finishedDate": "2025-11-20T10:15:00Z",
"metadata": {
"externalInterviewId": "INT-789"
},
"callAttempts": [
{
"id": "c9c9a6e8-fb4a-45f3-80fc-bf94f071cd2a",
"direction": "OUTBOUND",
"status": "COMPLETED",
"reasonCode": "NO_ANSWER",
"notes": "Candidate did not pick up, mailbox full",
"retryNumber": 2,
"recordingUrl": "https://audio.example.com/recording.mp3",
"duration": 180,
"scheduledAt": "2025-07-22T10:00:00Z",
"calledAt": "2025-07-22T10:01:00Z",
"transcript": [
{
"speaker": "AI",
"text": "Hello, thank you for taking the time to speak with me today.",
"startTime": 0,
"endTime": 3.5,
"language": "en"
}
]
}
],
"analysis": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"general": {
"createdAt": "2024-11-16T10:30:00Z",
"updatedAt": "2024-11-16T10:30:00Z",
"overallRating": 85,
"scoringIncompleteReason": "model_unavailable",
"companyFitRating": "HIGH",
"education": "Master's degree in Computer Science",
"experience": "5 years of experience in software development",
"strongPoints": [
"Excellent communication skills",
"Strong technical expertise in React and Node.js",
"Proven track record of leading teams"
],
"weakPoints": [
"Limited experience with microservices",
"Needs improvement in system design"
],
"evaluation": [
"Strong candidate with relevant experience",
"Good cultural fit for the team",
"Recommended for next round"
],
"status": 3
},
"specific": {
"pronunciationScores": {
"accuracy": 90,
"fluency": 85,
"prosody": 82
},
"grammar": {
"level": "C1"
}
}
},
"analytics": {
"matchScore": 72,
"updatedAt": "2026-08-03T10:30:00Z",
"fields": [
{
"key": "budget_confirmed",
"label": "Budget confirmed",
"type": "string",
"value": true,
"confidence": 0.5,
"evidence": "Said they have signed off on 15k for this quarter"
}
],
"scoring": {
"total": 72,
"items": [
{
"key": "budget_confirmed",
"kind": "field",
"label": "Budget confirmed",
"score": 80,
"weightPercent": 33.3,
"importance": "REQUIRED",
"reasoning": "<string>"
}
]
},
"outcomes": [
{
"key": "meeting_booked",
"label": "Meeting booked",
"met": true,
"confidence": 0.5,
"evidence": "<string>"
}
],
"tags": [
{
"key": "needs_followup",
"label": "Needs follow-up",
"applied": true,
"reason": "<string>"
}
],
"qa": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"question": "<string>",
"answered": true,
"answer": "<string>",
"evidence": "<string>"
}
],
"evaluation": {
"strengths": [
"<string>"
],
"concerns": [
"<string>"
],
"objections": [
"<string>"
],
"assessment": [
"<string>"
]
},
"sentiment": {
"overall": "positive",
"score": 0.5,
"trajectory": "improving",
"notes": "<string>"
},
"summary": "Qualified lead; demo booked for Thursday."
},
"isTest": false
}GET /interviews/{id} is a permanent alias of this endpoint and keeps working unchanged, with the same scopes and the same response. See Resource names.Overview
This endpoint returns everything recorded about one conversation: its current status, the transcript, the AI analysis or analytics when there is any, and every associated field. It is the primary way to read a call’s results.Use Cases
- Read results: analysis, analytics and transcript once the call has finished
- Check status: follow a conversation’s progress
- Access transcripts: the full transcript of what was said
- Review scoring: the AI-generated assessment and its scores
Response Data
The response includes:- Conversation details: status, timestamps, duration, scheduled time
- Transcript: the full transcript, when available
- Analysis: AI-generated assessment with scores and recommendations
- Call attempts: each attempt and its recording
- Contact & agent:
contactId(withcandidateIdalongside it, always identical) andagentId - Run:
runId, the run that produced this conversation, ornullfor one created on its own
Analysis Data
Once a conversation has completed, the response carries its analysis. The structure is ageneral object holding the overall assessment, plus an optional specific object for data particular to the conversation type:
{
"analysis": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"general": {
"overallRating": 85,
"companyFitRating": "HIGH",
"education": "MASTER_LEVEL",
"experience": "THREE_TO_5_YEARS",
"strongPoints": ["Strong technical skills", "Clear communication"],
"weakPoints": ["Limited leadership experience"],
"evaluation": ["Strong hire for senior individual contributor role"],
"status": 3,
"createdAt": "2024-01-20T14:30:00Z",
"updatedAt": "2024-01-20T14:30:00Z"
},
"specific": null
}
}
specific field carries data particular to the conversation type, when there is any. See the Conversations Resource Guide for what each type produces.
analysis is null.Custom Agent Analytics
A conversation run by a custom agent carries a second, separate object:analytics, containing whatever that agent’s analyticsConfig asked for. It is not a variant of analysis — analysis is the recruiting pipeline’s output and is typically absent on a custom call, while analytics is the agent’s own design.
{
"analytics": {
"matchScore": 72,
"fields": [
{
"key": "budget_confirmed",
"label": "Budget confirmed",
"type": "bool",
"value": true,
"confidence": 0.9,
"evidence": "Said they have signed off on 15k for this quarter"
},
{ "key": "timeline", "label": "Timeline", "type": "string", "value": null }
],
"scoring": {
"total": 72,
"items": [
{
"key": "budget_confirmed",
"kind": "field",
"label": "Budget confirmed",
"score": 90,
"weightPercent": 50,
"importance": "REQUIRED"
}
]
},
"outcomes": [{ "key": "meeting_booked", "label": "Meeting booked", "met": true }],
"tags": [{ "key": "needs_followup", "label": "Needs follow-up", "applied": false }],
"qa": [
{
"id": "3f1a8c2e-question-uuid",
"question": "What are you using today?",
"answered": true,
"answer": "Spreadsheets, rebuilt by hand every week",
"evidence": "It's the worst two hours of my Monday"
}
],
"evaluation": {
"strengths": ["Clear pain point, already shopping for a replacement"],
"concerns": ["Finance sign-off not secured"],
"objections": ["Worried about migrating two years of historical data"],
"assessment": ["Strong fit; the only real risk is procurement timing"]
},
"sentiment": { "overall": "positive", "score": 0.8, "trajectory": "improving" },
"summary": "Qualified lead; demo booked for Thursday.",
"updatedAt": "2026-08-03T14:30:00Z"
}
}
key on each field, outcome and tag is the one configured on the agent, so you can switch on it directly. Reading it back:
value: nullon a field means the call did not surface it — distinct from afalseor empty value that was surfaced.- In
scoring.items, an entry withkind: "question"carries the flow question’s id rather than a configured key — a question has none, which is why its scoring is set inline on the question. Entries withkind: "field"or"criterion"carry the configured key. weightPercentis each scored item’s share of the match score, so the shares sum to exactly 100. The weights you configured are relative, not percentages.matchScoreis always present, andnullwhen scoring has not run yet.- In
qa,answered: falsemeans the call never reached the question, not that it was answered with nothing —answeris empty in both cases, so switch onanswered. evaluationholds four independent arrays of lines (strengths,concerns,objections,assessment); any one can be empty while the others are populated.- Each slice is produced by its own after-call job, and each job only runs when the agent asked for it — so an absent
outcomesorsentimentmeans “not configured, or not run yet”.
analysis.completed webhook, so you
do not have to poll for it.Status Checking
async function checkConversationStatus(conversationId) {
const response = await fetch(
`https://api.instaview.sk/conversations/${conversationId}`,
{
headers: { Authorization: `Bearer ${apiKey}` },
// Without a deadline a stalled request never settles.
signal: AbortSignal.timeout(10_000),
},
);
if (!response.ok) {
throw new Error(
`Reading the conversation failed: ${response.status} ${response.statusText}`,
);
}
const data = await response.json();
return {
status: data.status,
hasAnalysis: data.analysis !== null,
durationMinutes: data.durationMinutes,
finishedDate: data.finishedDate,
};
}
Company Isolation
You can only read conversations belonging to contacts in your own company. Reaching for one from another company returns403 Forbidden.
Error Scenarios
- 404 Not Found: the conversation does not exist, or has been deleted
- 403 Forbidden: the conversation belongs to a different company
Related Resources
Conversations Resource Guide
List Conversations
Create Conversation
Get Analysis PDF
Authorizations
API key for authentication using Bearer scheme
Path Parameters
Query Parameters
Required for ATS API keys to specify which company to access. Ignored for standard company API keys.
Response
Conversation ID
"123e4567-e89b-12d3-a456-426614174000"
Contact ID
"987e6543-e21b-12d3-a456-426614174000"
Deprecated alias of contactId, always identical to it. Kept for the life of v1 so existing integrations keep working; new callers should read contactId.
"987e6543-e21b-12d3-a456-426614174000"
Agent ID
"456e7890-e12b-34d5-a678-901234567890"
Conversation status
UNDEFINED, SCHEDULED, CANCELLED, FAILED, COMPLETED, IN_PROGRESS, UNREACHABLE "SCHEDULED"
Scheduled time
"2025-11-20T10:00:00Z"
Created timestamp
"2024-11-16T10:30:00Z"
Updated timestamp
"2024-11-16T10:30:00Z"
Job ID associated with this conversation, if any
"123e4567-e89b-12d3-a456-426614174000"
The run that produced this conversation, or null for one created on its own. A run mints one conversation per contact, so this is how a conversation is traced back to the batch it came from without listing the run.
"789e0123-e45b-67d8-a901-234567890123"
Conversation duration in minutes
15
Finished date
"2025-11-20T10:15:00Z"
Custom metadata
{ "externalInterviewId": "INT-789" }
Call attempt logs for this conversation. Present for PHONE conversations, typically empty or undefined for ONLINE ones.
Show child attributes
Show child attributes
Conversation analysis data. Present only if analysis has been generated.
Show child attributes
Show child attributes
What the agent's own analytics configuration produced on this call: extracted fields, match score, outcomes and tags. Present only for a custom agent whose after-call analysis has run.
Show child attributes
Show child attributes
Whether this is a test conversation. A test conversation is created with isTest=true, completes immediately without consuming billing minutes, and is excluded from billing and usage summaries. Use them to exercise webhook handlers and integration flows.
false