List run conversations
curl --request GET \
--url https://api.instaview.sk/runs/{id}/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.instaview.sk/runs/{id}/conversations"
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/runs/{id}/conversations', 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/runs/{id}/conversations",
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/runs/{id}/conversations"
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/runs/{id}/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/runs/{id}/conversations")
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{
"data": [
{
"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
}
],
"total": 150,
"page": 1,
"limit": 20,
"totalPages": 8
}Runs
List Run Conversations
Pages through the conversations a run has produced — one per contact it has dispatched, in the same shape GET /conversations returns. A run that has not been launched has none yet. Requires read:runs and read:conversations.
GET
/
runs
/
{id}
/
conversations
List run conversations
curl --request GET \
--url https://api.instaview.sk/runs/{id}/conversations \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.instaview.sk/runs/{id}/conversations"
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/runs/{id}/conversations', 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/runs/{id}/conversations",
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/runs/{id}/conversations"
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/runs/{id}/conversations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/runs/{id}/conversations")
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{
"data": [
{
"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
}
],
"total": 150,
"page": 1,
"limit": 20,
"totalPages": 8
}Pages through the conversations one run has produced.
Overview
A run mints one conversation per contact it dispatches. This endpoint is the per-contact drill-down behind the aggregate on Get Run: each row is a full conversation resource, in exactly the shape List Conversations returns — status, call attempts, and the analysis or analytics of the call. A run that has not been launched has no conversations yet, and answers with an empty page rather than a404.
This endpoint needs both
read:runs and read:conversations, because its rows are
conversation resources rather than a run-shaped summary. read:interviews satisfies the second
— see Scopes and Permissions.Use Cases
- Drill into a batch: see which contacts were reached and which were not
- Collect results: read every analysis or analytics object a run produced, one page at a time
- Triage: find the failed and unreachable contacts to follow up by hand
Basic Usage
GET /runs/789e0123-e45b-67d8-a901-234567890123/conversations
With Pagination
// Walk the whole run, a page at a time
async function* runConversations(runId) {
for (let page = 1; ; page++) {
const response = await fetch(
`https://api.instaview.sk/runs/${runId}/conversations?page=${page}&limit=100`,
{
headers: { Authorization: `Bearer ${apiKey}` },
signal: AbortSignal.timeout(10_000),
},
);
if (!response.ok) {
throw new Error(`Reading the run's conversations failed: ${response.status}`);
}
const body = await response.json();
yield* body.data;
if (page >= body.totalPages) return;
}
}
limit is capped at 100. See the Pagination Guide for the page object’s fields.
Reading the Results
Each row is the ordinary conversation resource, so everything the conversation endpoints document applies here:statusis the conversation’s own status, not the run’sanalysiscarries the recruiting pipeline’s output,analyticswhatever a custom agent’sanalyticsConfigasked for. A custom agent typically producesanalyticsand noanalysisrunIdis this run’s id on every row, which is what lets you attribute a conversation to a run when you receive it any other way
Analysis and analytics are only present once a call has completed and its after-call jobs have
run. While the run is dispatching, most rows carry neither.
Company Isolation
You can only read runs belonging to your own API key’s company. A run in another company returns404 Not Found, the same as one that does not exist.
Error Scenarios
- 404 Not Found: the run does not exist, has been deleted, or belongs to a different company
- 403 Forbidden: the API key does not hold both
read:runsandread:conversations(read:interviewssatisfies the second)
Related Resources
Get Run
The run’s status and aggregate progress
Get Conversation
One conversation in full, with its transcript
Runs Resource Guide
How a run batches conversations
Pagination
How pages work across the API
Authorizations
API key for authentication using Bearer scheme
Path Parameters
Query Parameters
Page number (1-based)
Required range:
1 <= x <= 10000Example:
1
Number of items per page
Required range:
1 <= x <= 100Example:
20
Required for ATS API keys to specify which company to access. Ignored for standard company API keys.
Response
200 - application/json