curl --request POST \
--url https://api.instaview.sk/conversations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"agentId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "123e4567-e89b-12d3-a456-426614174000",
"agent": {
"type": "ONLINE",
"name": "Senior Developer Interview",
"language": "EN",
"duration": 30,
"companyPhoneNumberId": "123e4567-e89b-12d3-a456-426614174000",
"focus": "SCREENING",
"questions": [
"What is your experience with React?",
"Tell me about a challenging project you worked on"
],
"instructions": "Focus on technical skills and previous project experience",
"cefrLevel": "B1",
"contextConfig": {
"role": "an account executive for Acme",
"communicationStyle": "concise and direct",
"callToAction": "book a 30-minute demo",
"useContactContext": true
},
"analyticsConfig": {
"extractionTargets": [
{
"label": "Budget confirmed",
"type": "bool",
"key": "budget_confirmed",
"enumValues": [
"hot",
"warm",
"cold"
],
"ideal": "A confirmed budget of at least 10k",
"importance": "PREFERRED",
"weight": 40
}
],
"scoringCriteria": [
{
"label": "Handled objections",
"description": "Acknowledged the objection and answered it with a concrete example",
"key": "handled_objections",
"importance": "PREFERRED",
"weight": 40
}
],
"outcomes": [
{
"label": "Meeting booked",
"description": "The contact agreed to a specific date and time",
"key": "meeting_booked"
}
],
"outputTags": [
{
"label": "Needs follow-up",
"key": "needs_followup",
"description": "The contact asked to be called back"
}
],
"capture": {
"recording": true,
"transcript": true,
"summary": true,
"qa": true,
"evaluation": true,
"sentiment": true
}
},
"callConfig": {},
"overrides": {
"companyName": "Acme Manufacturing",
"companyDescription": "Acme makes industrial fasteners and employs 400 people across Slovakia."
}
},
"scheduleTime": "2025-11-20T10:00:00Z",
"metadata": {
"externalInterviewId": "INT-789",
"interviewerNotes": "Focus on technical skills"
},
"isTest": false
}
'import requests
url = "https://api.instaview.sk/conversations"
payload = {
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"agentId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "123e4567-e89b-12d3-a456-426614174000",
"agent": {
"type": "ONLINE",
"name": "Senior Developer Interview",
"language": "EN",
"duration": 30,
"companyPhoneNumberId": "123e4567-e89b-12d3-a456-426614174000",
"focus": "SCREENING",
"questions": ["What is your experience with React?", "Tell me about a challenging project you worked on"],
"instructions": "Focus on technical skills and previous project experience",
"cefrLevel": "B1",
"contextConfig": {
"role": "an account executive for Acme",
"communicationStyle": "concise and direct",
"callToAction": "book a 30-minute demo",
"useContactContext": True
},
"analyticsConfig": {
"extractionTargets": [
{
"label": "Budget confirmed",
"type": "bool",
"key": "budget_confirmed",
"enumValues": ["hot", "warm", "cold"],
"ideal": "A confirmed budget of at least 10k",
"importance": "PREFERRED",
"weight": 40
}
],
"scoringCriteria": [
{
"label": "Handled objections",
"description": "Acknowledged the objection and answered it with a concrete example",
"key": "handled_objections",
"importance": "PREFERRED",
"weight": 40
}
],
"outcomes": [
{
"label": "Meeting booked",
"description": "The contact agreed to a specific date and time",
"key": "meeting_booked"
}
],
"outputTags": [
{
"label": "Needs follow-up",
"key": "needs_followup",
"description": "The contact asked to be called back"
}
],
"capture": {
"recording": True,
"transcript": True,
"summary": True,
"qa": True,
"evaluation": True,
"sentiment": True
}
},
"callConfig": {},
"overrides": {
"companyName": "Acme Manufacturing",
"companyDescription": "Acme makes industrial fasteners and employs 400 people across Slovakia."
}
},
"scheduleTime": "2025-11-20T10:00:00Z",
"metadata": {
"externalInterviewId": "INT-789",
"interviewerNotes": "Focus on technical skills"
},
"isTest": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contactId: '123e4567-e89b-12d3-a456-426614174000',
jobId: '123e4567-e89b-12d3-a456-426614174000',
agentId: '987e6543-e21b-12d3-a456-426614174000',
candidateId: '123e4567-e89b-12d3-a456-426614174000',
agent: {
type: 'ONLINE',
name: 'Senior Developer Interview',
language: 'EN',
duration: 30,
companyPhoneNumberId: '123e4567-e89b-12d3-a456-426614174000',
focus: 'SCREENING',
questions: [
'What is your experience with React?',
'Tell me about a challenging project you worked on'
],
instructions: 'Focus on technical skills and previous project experience',
cefrLevel: 'B1',
contextConfig: {
role: 'an account executive for Acme',
communicationStyle: 'concise and direct',
callToAction: 'book a 30-minute demo',
useContactContext: true
},
analyticsConfig: {
extractionTargets: [
{
label: 'Budget confirmed',
type: 'bool',
key: 'budget_confirmed',
enumValues: ['hot', 'warm', 'cold'],
ideal: 'A confirmed budget of at least 10k',
importance: 'PREFERRED',
weight: 40
}
],
scoringCriteria: [
{
label: 'Handled objections',
description: 'Acknowledged the objection and answered it with a concrete example',
key: 'handled_objections',
importance: 'PREFERRED',
weight: 40
}
],
outcomes: [
{
label: 'Meeting booked',
description: 'The contact agreed to a specific date and time',
key: 'meeting_booked'
}
],
outputTags: [
{
label: 'Needs follow-up',
key: 'needs_followup',
description: 'The contact asked to be called back'
}
],
capture: {
recording: true,
transcript: true,
summary: true,
qa: true,
evaluation: true,
sentiment: true
}
},
callConfig: {},
overrides: {
companyName: 'Acme Manufacturing',
companyDescription: 'Acme makes industrial fasteners and employs 400 people across Slovakia.'
}
},
scheduleTime: '2025-11-20T10:00:00Z',
metadata: {externalInterviewId: 'INT-789', interviewerNotes: 'Focus on technical skills'},
isTest: false
})
};
fetch('https://api.instaview.sk/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/conversations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contactId' => '123e4567-e89b-12d3-a456-426614174000',
'jobId' => '123e4567-e89b-12d3-a456-426614174000',
'agentId' => '987e6543-e21b-12d3-a456-426614174000',
'candidateId' => '123e4567-e89b-12d3-a456-426614174000',
'agent' => [
'type' => 'ONLINE',
'name' => 'Senior Developer Interview',
'language' => 'EN',
'duration' => 30,
'companyPhoneNumberId' => '123e4567-e89b-12d3-a456-426614174000',
'focus' => 'SCREENING',
'questions' => [
'What is your experience with React?',
'Tell me about a challenging project you worked on'
],
'instructions' => 'Focus on technical skills and previous project experience',
'cefrLevel' => 'B1',
'contextConfig' => [
'role' => 'an account executive for Acme',
'communicationStyle' => 'concise and direct',
'callToAction' => 'book a 30-minute demo',
'useContactContext' => true
],
'analyticsConfig' => [
'extractionTargets' => [
[
'label' => 'Budget confirmed',
'type' => 'bool',
'key' => 'budget_confirmed',
'enumValues' => [
'hot',
'warm',
'cold'
],
'ideal' => 'A confirmed budget of at least 10k',
'importance' => 'PREFERRED',
'weight' => 40
]
],
'scoringCriteria' => [
[
'label' => 'Handled objections',
'description' => 'Acknowledged the objection and answered it with a concrete example',
'key' => 'handled_objections',
'importance' => 'PREFERRED',
'weight' => 40
]
],
'outcomes' => [
[
'label' => 'Meeting booked',
'description' => 'The contact agreed to a specific date and time',
'key' => 'meeting_booked'
]
],
'outputTags' => [
[
'label' => 'Needs follow-up',
'key' => 'needs_followup',
'description' => 'The contact asked to be called back'
]
],
'capture' => [
'recording' => true,
'transcript' => true,
'summary' => true,
'qa' => true,
'evaluation' => true,
'sentiment' => true
]
],
'callConfig' => [
],
'overrides' => [
'companyName' => 'Acme Manufacturing',
'companyDescription' => 'Acme makes industrial fasteners and employs 400 people across Slovakia.'
]
],
'scheduleTime' => '2025-11-20T10:00:00Z',
'metadata' => [
'externalInterviewId' => 'INT-789',
'interviewerNotes' => 'Focus on technical skills'
],
'isTest' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.instaview.sk/conversations"
payload := strings.NewReader("{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.instaview.sk/conversations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/conversations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}"
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
}Create Conversation
Creates a conversation with a contact, using an existing or inline contact/agent/job, scoped to the API key’s company. Respects company billing limits and subscription plans. Set isTest=true to create a test conversation that completes immediately without consuming billing minutes.
curl --request POST \
--url https://api.instaview.sk/conversations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"agentId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "123e4567-e89b-12d3-a456-426614174000",
"agent": {
"type": "ONLINE",
"name": "Senior Developer Interview",
"language": "EN",
"duration": 30,
"companyPhoneNumberId": "123e4567-e89b-12d3-a456-426614174000",
"focus": "SCREENING",
"questions": [
"What is your experience with React?",
"Tell me about a challenging project you worked on"
],
"instructions": "Focus on technical skills and previous project experience",
"cefrLevel": "B1",
"contextConfig": {
"role": "an account executive for Acme",
"communicationStyle": "concise and direct",
"callToAction": "book a 30-minute demo",
"useContactContext": true
},
"analyticsConfig": {
"extractionTargets": [
{
"label": "Budget confirmed",
"type": "bool",
"key": "budget_confirmed",
"enumValues": [
"hot",
"warm",
"cold"
],
"ideal": "A confirmed budget of at least 10k",
"importance": "PREFERRED",
"weight": 40
}
],
"scoringCriteria": [
{
"label": "Handled objections",
"description": "Acknowledged the objection and answered it with a concrete example",
"key": "handled_objections",
"importance": "PREFERRED",
"weight": 40
}
],
"outcomes": [
{
"label": "Meeting booked",
"description": "The contact agreed to a specific date and time",
"key": "meeting_booked"
}
],
"outputTags": [
{
"label": "Needs follow-up",
"key": "needs_followup",
"description": "The contact asked to be called back"
}
],
"capture": {
"recording": true,
"transcript": true,
"summary": true,
"qa": true,
"evaluation": true,
"sentiment": true
}
},
"callConfig": {},
"overrides": {
"companyName": "Acme Manufacturing",
"companyDescription": "Acme makes industrial fasteners and employs 400 people across Slovakia."
}
},
"scheduleTime": "2025-11-20T10:00:00Z",
"metadata": {
"externalInterviewId": "INT-789",
"interviewerNotes": "Focus on technical skills"
},
"isTest": false
}
'import requests
url = "https://api.instaview.sk/conversations"
payload = {
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"agentId": "987e6543-e21b-12d3-a456-426614174000",
"candidateId": "123e4567-e89b-12d3-a456-426614174000",
"agent": {
"type": "ONLINE",
"name": "Senior Developer Interview",
"language": "EN",
"duration": 30,
"companyPhoneNumberId": "123e4567-e89b-12d3-a456-426614174000",
"focus": "SCREENING",
"questions": ["What is your experience with React?", "Tell me about a challenging project you worked on"],
"instructions": "Focus on technical skills and previous project experience",
"cefrLevel": "B1",
"contextConfig": {
"role": "an account executive for Acme",
"communicationStyle": "concise and direct",
"callToAction": "book a 30-minute demo",
"useContactContext": True
},
"analyticsConfig": {
"extractionTargets": [
{
"label": "Budget confirmed",
"type": "bool",
"key": "budget_confirmed",
"enumValues": ["hot", "warm", "cold"],
"ideal": "A confirmed budget of at least 10k",
"importance": "PREFERRED",
"weight": 40
}
],
"scoringCriteria": [
{
"label": "Handled objections",
"description": "Acknowledged the objection and answered it with a concrete example",
"key": "handled_objections",
"importance": "PREFERRED",
"weight": 40
}
],
"outcomes": [
{
"label": "Meeting booked",
"description": "The contact agreed to a specific date and time",
"key": "meeting_booked"
}
],
"outputTags": [
{
"label": "Needs follow-up",
"key": "needs_followup",
"description": "The contact asked to be called back"
}
],
"capture": {
"recording": True,
"transcript": True,
"summary": True,
"qa": True,
"evaluation": True,
"sentiment": True
}
},
"callConfig": {},
"overrides": {
"companyName": "Acme Manufacturing",
"companyDescription": "Acme makes industrial fasteners and employs 400 people across Slovakia."
}
},
"scheduleTime": "2025-11-20T10:00:00Z",
"metadata": {
"externalInterviewId": "INT-789",
"interviewerNotes": "Focus on technical skills"
},
"isTest": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contactId: '123e4567-e89b-12d3-a456-426614174000',
jobId: '123e4567-e89b-12d3-a456-426614174000',
agentId: '987e6543-e21b-12d3-a456-426614174000',
candidateId: '123e4567-e89b-12d3-a456-426614174000',
agent: {
type: 'ONLINE',
name: 'Senior Developer Interview',
language: 'EN',
duration: 30,
companyPhoneNumberId: '123e4567-e89b-12d3-a456-426614174000',
focus: 'SCREENING',
questions: [
'What is your experience with React?',
'Tell me about a challenging project you worked on'
],
instructions: 'Focus on technical skills and previous project experience',
cefrLevel: 'B1',
contextConfig: {
role: 'an account executive for Acme',
communicationStyle: 'concise and direct',
callToAction: 'book a 30-minute demo',
useContactContext: true
},
analyticsConfig: {
extractionTargets: [
{
label: 'Budget confirmed',
type: 'bool',
key: 'budget_confirmed',
enumValues: ['hot', 'warm', 'cold'],
ideal: 'A confirmed budget of at least 10k',
importance: 'PREFERRED',
weight: 40
}
],
scoringCriteria: [
{
label: 'Handled objections',
description: 'Acknowledged the objection and answered it with a concrete example',
key: 'handled_objections',
importance: 'PREFERRED',
weight: 40
}
],
outcomes: [
{
label: 'Meeting booked',
description: 'The contact agreed to a specific date and time',
key: 'meeting_booked'
}
],
outputTags: [
{
label: 'Needs follow-up',
key: 'needs_followup',
description: 'The contact asked to be called back'
}
],
capture: {
recording: true,
transcript: true,
summary: true,
qa: true,
evaluation: true,
sentiment: true
}
},
callConfig: {},
overrides: {
companyName: 'Acme Manufacturing',
companyDescription: 'Acme makes industrial fasteners and employs 400 people across Slovakia.'
}
},
scheduleTime: '2025-11-20T10:00:00Z',
metadata: {externalInterviewId: 'INT-789', interviewerNotes: 'Focus on technical skills'},
isTest: false
})
};
fetch('https://api.instaview.sk/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/conversations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'contactId' => '123e4567-e89b-12d3-a456-426614174000',
'jobId' => '123e4567-e89b-12d3-a456-426614174000',
'agentId' => '987e6543-e21b-12d3-a456-426614174000',
'candidateId' => '123e4567-e89b-12d3-a456-426614174000',
'agent' => [
'type' => 'ONLINE',
'name' => 'Senior Developer Interview',
'language' => 'EN',
'duration' => 30,
'companyPhoneNumberId' => '123e4567-e89b-12d3-a456-426614174000',
'focus' => 'SCREENING',
'questions' => [
'What is your experience with React?',
'Tell me about a challenging project you worked on'
],
'instructions' => 'Focus on technical skills and previous project experience',
'cefrLevel' => 'B1',
'contextConfig' => [
'role' => 'an account executive for Acme',
'communicationStyle' => 'concise and direct',
'callToAction' => 'book a 30-minute demo',
'useContactContext' => true
],
'analyticsConfig' => [
'extractionTargets' => [
[
'label' => 'Budget confirmed',
'type' => 'bool',
'key' => 'budget_confirmed',
'enumValues' => [
'hot',
'warm',
'cold'
],
'ideal' => 'A confirmed budget of at least 10k',
'importance' => 'PREFERRED',
'weight' => 40
]
],
'scoringCriteria' => [
[
'label' => 'Handled objections',
'description' => 'Acknowledged the objection and answered it with a concrete example',
'key' => 'handled_objections',
'importance' => 'PREFERRED',
'weight' => 40
]
],
'outcomes' => [
[
'label' => 'Meeting booked',
'description' => 'The contact agreed to a specific date and time',
'key' => 'meeting_booked'
]
],
'outputTags' => [
[
'label' => 'Needs follow-up',
'key' => 'needs_followup',
'description' => 'The contact asked to be called back'
]
],
'capture' => [
'recording' => true,
'transcript' => true,
'summary' => true,
'qa' => true,
'evaluation' => true,
'sentiment' => true
]
],
'callConfig' => [
],
'overrides' => [
'companyName' => 'Acme Manufacturing',
'companyDescription' => 'Acme makes industrial fasteners and employs 400 people across Slovakia.'
]
],
'scheduleTime' => '2025-11-20T10:00:00Z',
'metadata' => [
'externalInterviewId' => 'INT-789',
'interviewerNotes' => 'Focus on technical skills'
],
'isTest' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.instaview.sk/conversations"
payload := strings.NewReader("{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.instaview.sk/conversations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.instaview.sk/conversations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"jobId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agentId\": \"987e6543-e21b-12d3-a456-426614174000\",\n \"candidateId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"agent\": {\n \"type\": \"ONLINE\",\n \"name\": \"Senior Developer Interview\",\n \"language\": \"EN\",\n \"duration\": 30,\n \"companyPhoneNumberId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"focus\": \"SCREENING\",\n \"questions\": [\n \"What is your experience with React?\",\n \"Tell me about a challenging project you worked on\"\n ],\n \"instructions\": \"Focus on technical skills and previous project experience\",\n \"cefrLevel\": \"B1\",\n \"contextConfig\": {\n \"role\": \"an account executive for Acme\",\n \"communicationStyle\": \"concise and direct\",\n \"callToAction\": \"book a 30-minute demo\",\n \"useContactContext\": true\n },\n \"analyticsConfig\": {\n \"extractionTargets\": [\n {\n \"label\": \"Budget confirmed\",\n \"type\": \"bool\",\n \"key\": \"budget_confirmed\",\n \"enumValues\": [\n \"hot\",\n \"warm\",\n \"cold\"\n ],\n \"ideal\": \"A confirmed budget of at least 10k\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"scoringCriteria\": [\n {\n \"label\": \"Handled objections\",\n \"description\": \"Acknowledged the objection and answered it with a concrete example\",\n \"key\": \"handled_objections\",\n \"importance\": \"PREFERRED\",\n \"weight\": 40\n }\n ],\n \"outcomes\": [\n {\n \"label\": \"Meeting booked\",\n \"description\": \"The contact agreed to a specific date and time\",\n \"key\": \"meeting_booked\"\n }\n ],\n \"outputTags\": [\n {\n \"label\": \"Needs follow-up\",\n \"key\": \"needs_followup\",\n \"description\": \"The contact asked to be called back\"\n }\n ],\n \"capture\": {\n \"recording\": true,\n \"transcript\": true,\n \"summary\": true,\n \"qa\": true,\n \"evaluation\": true,\n \"sentiment\": true\n }\n },\n \"callConfig\": {},\n \"overrides\": {\n \"companyName\": \"Acme Manufacturing\",\n \"companyDescription\": \"Acme makes industrial fasteners and employs 400 people across Slovakia.\"\n }\n },\n \"scheduleTime\": \"2025-11-20T10:00:00Z\",\n \"metadata\": {\n \"externalInterviewId\": \"INT-789\",\n \"interviewerNotes\": \"Focus on technical skills\"\n },\n \"isTest\": false\n}"
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
}POST /interviews is a permanent alias of this endpoint and keeps working unchanged, with the same scopes and the same response. See Resource names.Overview
A conversation is created either to run immediately or at ascheduleTime you name. Everything it needs can come from ids you already hold (contactId, agentId) or from inline objects the request creates as it goes, so an integration that has just learned about a person does not need two round trips before it can call them.
Use Cases
- Scheduled calls: Run the conversation at a specific date and time
- Immediate calls: Start as soon as the agent’s calling hours allow
- Inline resources: Create a conversation without pre-creating the contact or the agent
- Bulk outreach: Automate one conversation per contact across a list
Inline Contact, Agent, and Job Support
Contacts, agents and jobs that do not exist yet can be defined inline as objects on the request. Nothing has to be created first.contact. candidate is its permanent legacy alias and takes the
same fields; send one or the other, not both. The same holds for contactId and candidateId.Inline Contact with Job Association
{
"contact": {
"jobId": "job-uuid",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16",
"workHistory": [
{
"companyName": "Tech Corp",
"candidatePosition": "Software Engineer",
"referenceName": "Jane Smith",
"referencePhone": "+1234567890",
"startDate": "2020-01-01",
"endDate": "2022-12-31"
}
]
},
"agentId": "existing-agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
Inline Contact with Inline Job
Create both the contact and the job inline for a completely self-contained request:{
"contact": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16"
},
"job": {
"jobTitle": "Senior Backend Engineer",
"jobDescription": "We are looking for a senior engineer...",
"requiredSkills": ["TypeScript", "NestJS", "PostgreSQL"],
"niceToHaveSkills": ["Redis", "AWS"],
"languages": ["EN"],
"experience": "SENIOR",
"contractType": "FULL_TIME"
},
"agentId": "existing-agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
contact together with job: - a new Job is
created for your company - a new Contact is created and automatically associated with that
job - the Conversation is linked to both - all three become permanent resources you can
fetch and manage afterwardsInline Contact without Job Association
{
"contact": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16"
},
"agentId": "existing-agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
job at the top level to create a new job - Reference existing: use jobId at the top
level to link an existing job - Within the inline contact: use jobId inside contact
for a more compact request when creating the contact and the association together - No
job: omit every job field. A job is optional on a conversation, and most callers outside
hiring never send one; the contact can still be assigned to jobs later via the update
contact endpoint. Priority: when several job
sources are provided, job wins over top-level jobId, which wins over contact.jobId.
XOR validation: contact.jobId cannot be combined with a top-level jobId or job,
since that would be ambiguous. Pick one per request.Inline Custom Agent
The inlineagent accepts the same custom-agent fields as Create Agent: send a flow (optionally with guardrails, contextConfig and analyticsConfig) and the agent is created as a custom agent, running the conversation you designed instead of a template. As there, focus must be omitted when a flow is present, ids and schemaVersion are assigned by InstaView, and an invalid flow is rejected with a 422 carrying the same errors array — every problem found, each with the path of the block it is on. No conversation is created when that happens.
Sending analyticsConfig here is how a one-off call returns structured data rather than just a transcript — the results come back as analytics on this conversation and on its analysis.completed webhook.
{
"contact": {
"firstName": "Jana",
"lastName": "Novák",
"phoneNumber": "+421900123456",
"gdprExpiryDate": "2027-08-02"
},
"agent": {
"name": "Renewal check-in",
"type": "PHONE",
"language": "EN",
"duration": 10,
"companyPhoneNumberId": "123e4567-e89b-12d3-a456-426614174000",
"flow": {
"firstMessage": { "type": "first_message", "text": "Hi {{contact.first_name}}, quick question about your renewal." },
"sections": [{ "type": "sequential", "prompt": "Ask whether they intend to renew, and note any blockers." }],
"lastMessage": { "type": "last_message", "text": "Thanks — we'll follow up by email." }
},
"analyticsConfig": {
"extractionTargets": [
{ "key": "intends_to_renew", "label": "Intends to renew", "type": "bool" }
],
"outcomes": [
{ "label": "Renewal confirmed", "description": "The contact committed to renewing" }
]
}
}
}
agentId.Job-Optional Focuses
Two kinds of agent are job-optional — they can call someone without associating the conversation with a job:GENERIC, and any custom agent (one created with a flow). Every other
focus requires a job. The two are not identical, and the difference is worth knowing:
GENERIC | Custom (flow-based) | |
|---|---|---|
| Conversation without a job | Yes, always | Yes, always |
| Contact may hold job assignments | Yes, any number | Yes, any number |
jobId needed for a multi-job contact | No | No |
| May you attach a job anyway | Yes, optional | No — 400 |
jobId, and a contact assigned to five jobs is called exactly like one
assigned to none. The “specify a jobId” error described under Contact with Multiple
Jobs applies only to job-requiring focuses.flow is job-agnostic by
design: its prompt comes entirely from the flow, so a job would never be read. This is
stricter than GENERIC, which merely makes a job optional — sending job, jobId or
contact.jobId for a custom agent is a 400 rather than a silently ignored field.GENERIC agents exist for conversations that are not about a job at all. That covers most
non-hiring work, and in hiring it covers:
- Talent pool building: calling people about future openings rather than a specific role
- General outreach: reaching contacts in your database who hold no job assignment
- Pre-screening: an initial conversation before anyone is matched to a position
Creating a Jobless Conversation with GENERIC Focus
{
"contact": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phoneNumber": "+1234567890",
"gdprExpiryDate": "2026-11-16"
// No jobId - a GENERIC conversation does not need one
},
"agentId": "generic-agent-uuid", // Agent with focus: "GENERIC"
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
400 Bad Request error if:- You try to create a jobless conversation (no job specified) with an agent whose focus
requires a job — that is, anything other than
GENERICor a custom agent - You attach a job to a custom agent’s conversation
GENERIC conversation is not rejected for a contact who has job assignments:
the assignments are simply not used.For more detail on how a GENERIC conversation is analysed, see the Conversations Resource Guide.Existing Contact with Inline Job
You can also define the job inline usingjob when you already have the contact but don’t want to create a separate job resource first.
{
"contactId": "contact-uuid",
"job": {
"jobTitle": "Senior Backend Engineer",
"jobDescription": "We are looking for a senior engineer...",
"jobUrl": "https://company.com/jobs/123",
"benefits": "Health insurance, remote work",
"requiredSkills": ["TypeScript", "NestJS", "PostgreSQL"],
"niceToHaveSkills": ["Redis", "AWS"],
"languages": ["EN"],
"languageRequirements": [
{ "language": "EN", "proficiency": "C1" }
],
"education": ["BACHELORS"],
"experience": "SENIOR",
"otherRequirements": "Comfortable with async communication",
"contractType": "FULL_TIME",
"location": {
"workMode": "REMOTE",
"street": "Main Street 1",
"city": "Bratislava",
"postalCode": "81101",
"countryCode": "SK"
},
"salary": {
"min": 4000,
"max": 5500,
"currency": "EUR",
"period": "MONTHLY"
},
"humanRecruiter": "John Doe",
"metadata": {
"externalJobId": "JOB-12345",
"department": "Engineering"
}
},
"agentId": "existing-agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
job together with an existing contactId, the
API: - creates a full Job for your company from the inline fields - associates the contact
with that job if they were not already linked - links the conversation to the new job.
jobId and job are mutually exclusive (XOR): use either jobId (an existing job) or
job (an inline definition), never both.Billing and Limits
402 Payment Required once
billing limits are exceeded, with a billing object naming what the request needed and what
was left. See Billing errors.Exception: test conversations (created with isTest: true) consume no minutes and bypass all billing checks.Scheduling Options
Immediate Conversation
OmitscheduleTime to start the conversation as soon as possible:
{
"contactId": "contact-uuid",
"agentId": "agent-uuid"
}
scheduleTime, the time is ours to pick, so the agent’s calling window applies: a conversation created outside those hours goes out when they next open, in the contact’s own timezone.
Scheduled Conversation
Provide a futurescheduleTime timestamp (max 30 days in the future):
{
"contactId": "contact-uuid",
"agentId": "agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
scheduleTime you send is used exactly as given, including when it falls outside the
agent’s calling window. You know things the window does not, such as an appointment the contact
agreed to, so naming a time overrides the hours rather than being moved into them. The window
still governs everything we schedule ourselves: conversations created without a scheduleTime,
and every retry after a call that did not connect.The future and 30-day limits above still apply, and are the only bounds on the value. Within
them the offset only pins the moment: 14:00:00Z and 16:00:00+02:00 are the same instant and
are treated identically.contactId must already exist. For an inline contact, every required field
(firstName, lastName, email or phoneNumber, gdprExpiryDate) must be present.Job Selection for Existing Contacts
When using an existingcontactId, you can optionally name a jobId to record which job the conversation is for. This matters when the contact is associated with several jobs.
Contact with Single Job
If the contact has one job or none,jobId is optional — the contact’s first job is used if there is one:
{
"contactId": "contact-uuid",
"agentId": "agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
// jobId is optional - the contact's first job is used
}
Contact with Multiple Jobs
When the contact is associated with several jobs, you must name thejobId:
{
"contactId": "contact-uuid",
"jobId": "job-uuid", // Required when the contact has multiple job assignments
"agentId": "agent-uuid",
"scheduleTime": new Date(Date.now() + 60 * 60 * 1000).toISOString()
}
jobId, the API
returns 400 Bad Request with the message “This candidate is assigned to multiple jobs.
Please specify a ‘jobId’ to associate with this interview.” — quoted as it is actually sent.
Error strings are matched on by integrations, so they keep their original wording; only the
resource names in this documentation changed.This applies only to job-requiring focuses. GENERIC and custom (flow-based) agents are
job-optional, so they call a multi-job contact without a jobId — and a custom agent
rejects one outright.jobId you provide must belong to the same company as your API key. If the contact is not already assigned to that job, they are assigned to it when the conversation is created.jobId and job are XOR (mutually exclusive) — provide jobId and
omit job, or provide job and omit jobId. When job is used: a new job is created for
your company, that job becomes the conversation’s jobId, and the contact is associated with
it before the conversation is created.Company Isolation
Every resource involved (contact, agent, job) must belong to the same company as your API key. The API validates ownership and returns403 Forbidden when they do not.
Complete Workflow Examples
Scenario 1: Conversation with Job Association
// 1. Create a job (if not exists)
const job = await createJob({
title: "Senior Software Engineer",
status: "OPEN",
});
// 2. Create the conversation with an inline contact linked to that job
const conversation = await createConversation({
contact: {
jobId: job.id,
firstName: "Jane",
lastName: "Doe",
email: "jane@example.com",
phoneNumber: "+1234567890",
gdprExpiryDate: "2026-11-16",
},
agentId: "agent-uuid",
scheduleTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), // Tomorrow
});
// 3. Monitor its status
const status = await getConversation(conversation.id);
console.log(`Conversation status: ${status.status}`);
Scenario 2: Conversation without Job Association
// 1. Create a conversation for a contact who holds no job assignment
const conversation = await createConversation({
contact: {
firstName: "John",
lastName: "Smith",
email: "john@example.com",
phoneNumber: "+1234567890",
gdprExpiryDate: "2026-11-16",
},
agentId: "agent-uuid",
scheduleTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
});
// 2. Later, assign the contact to jobs if you need to
const contactId = conversation.contactId;
await updateContact(contactId, {
jobIds: ["job-uuid-1", "job-uuid-2"],
});
Scenario 3: Conversation for a Contact with Multiple Jobs
// 1. The contact is associated with several jobs
const contact = await getContact("contact-uuid");
// contact.jobIds = ["job-1-uuid", "job-2-uuid", "job-3-uuid"]
// 2. Create the conversation for one of them (jobId is required here)
const conversation = await createConversation({
contactId: "contact-uuid",
jobId: "job-2-uuid", // Must specify which job
agentId: "agent-uuid",
scheduleTime: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
});
// 3. The conversation is now associated with job-2-uuid
console.log(`Conversation created for job: ${conversation.jobId}`);
Scenario 4: Existing Contact with Inline Job
// 1. The contact already exists in your system
const contactId = "contact-uuid";
// 2. Create the conversation and define the job inline
const conversation = await createConversation({
contactId,
job: {
jobTitle: "Senior Backend Engineer",
jobDescription: "We are looking for a senior engineer...",
requiredSkills: ["TypeScript", "NestJS", "PostgreSQL"],
niceToHaveSkills: ["Redis", "AWS"],
languages: ["EN"],
experience: "SENIOR",
contractType: "FULL_TIME",
location: { workMode: "REMOTE", countryCode: "SK" },
metadata: { externalJobId: "JOB-12345" },
},
agentId: "agent-uuid",
scheduleTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
});
console.log(`Conversation jobId: ${conversation.jobId}`);
jobId returned on the conversation.Test Mode
Test mode creates a conversation that completes immediately and consumes no billing minutes. It exists so you can exercise webhook handlers and integration flows without placing a call.When to Use Test Mode
- Testing webhook handlers: check that your endpoint handles
conversation.completedandanalysis.completedcorrectly - Integration testing: exercise your processing logic without waiting for a real call
- Development: build against completed conversations on demand
- Demos: create sample conversations to show
How Test Mode Works
When you setisTest: true:
- Billing bypass: all billing checks are skipped — no minutes are consumed
- Immediate completion: the conversation is created with
COMPLETEDstatus straight away - Mock analysis: realistic analysis data is generated and stored
- Webhook events: both
conversation.completedandanalysis.completedfire - Default duration: 5 minutes
NEUTRAL vocabulary. A webhook registered before that
option existed is on LEGACY and receives interview.completed instead — same payload, same
trigger. See Event name vocabulary.Example: Creating a Test Conversation
const testConversation = await createConversation({
contact: {
firstName: "Jane",
lastName: "Doe",
email: "jane@example.com",
phoneNumber: "+1234567890",
gdprExpiryDate: "2026-11-16",
},
agentId: "agent-uuid",
isTest: true, // Enable test mode
});
console.log(`Test conversation created: ${testConversation.id}`);
console.log(`Status: ${testConversation.status}`); // "COMPLETED"
console.log(`Duration: ${testConversation.durationMinutes} minutes`); // 5
Test Conversation Characteristics
- Status: always
COMPLETEDimmediately - Duration: 5 minutes (300 seconds)
- Analysis: mock analysis, including:
- conversation check results (
candidateInterest: true,conversationCompleted: true) - analysis scores and recommendations
- mock transcript segments
- conversation check results (
- Webhooks: fires
conversation.completedandanalysis.completed - Billing: no minutes consumed, no billing checks performed
isTest: true. They appear in listings and can be queried like any other, but they do not affect billing or production metrics.Related Resources
Conversations Resource Guide
Agents Resource Guide
Contacts Resource Guide
Billing Guide
Webhooks Guide
Authorizations
API key for authentication using Bearer scheme
Query Parameters
Required for ATS API keys to specify which company to access. Ignored for standard company API keys.
Body
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
- Option 15
- Option 16
- Option 17
- Option 18
- Option 19
- Option 20
- Option 21
- Option 22
- Option 23
- Option 24
Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.
"123e4567-e89b-12d3-a456-426614174000"
Job ID to associate the conversation with (XOR with job). Required when the contact has multiple job assignments and no job is provided, unless the agent's focus is job-optional (GENERIC, CUSTOM). Must belong to the API key's company. If the contact is not already assigned to this job, they will be automatically assigned. Rejected with 400 for custom agents (agents defined by a conversation flow), which are always jobless.
"123e4567-e89b-12d3-a456-426614174000"
Existing agent ID (XOR with agent). Must exist and belong to the same company as the API key. Existence/company relationship is validated server-side.
"987e6543-e21b-12d3-a456-426614174000"
Deprecated alias of contactId, kept for the life of v1. Sending both is allowed only when they hold the same value.
"123e4567-e89b-12d3-a456-426614174000"
Job for inline creation (XOR with jobId). When provided, a new job will be created and used for the conversation. Cannot be combined with jobId. Rejected with 400 for custom agents (agents defined by a conversation flow), which are always jobless.
Show child attributes
Show child attributes
Contact for inline creation (XOR with contactId)
Show child attributes
Show child attributes
Deprecated alias of contact, kept for the life of v1. Send one inline body, not both.
Show child attributes
Show child attributes
Agent for inline creation (XOR with agentId)
- Option 1
- Option 2
Show child attributes
Show child attributes
Scheduled time in ISO 8601 format (max 30 days in future). Used exactly as sent, including when it falls outside the agent's calling window: naming a time overrides those hours. Omit it and the call is placed inside the window instead. The offset only pins the instant, so 14:00:00Z and 16:00:00+02:00 behave identically.
"2025-11-20T10:00:00Z"
Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)
{
"externalInterviewId": "INT-789",
"interviewerNotes": "Focus on technical skills"
}
If true, creates a test conversation that completes immediately without consuming billing minutes. Triggers webhook events (conversation.completed, analysis.completed — interview.completed on a LEGACY-vocabulary webhook) for testing webhook handlers.
false
Response
OK (legacy; prefer 201)
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